因此,我创建了一系列语法,供在我创建的类的方法中使用。每个列表可以是n个元素,因此通过列表索引放置每个单词是直接的wordlist [1:]
的伪装,但是我需要使用| |。
运算符,而这不能通过显式的字符串索引来完成(至少我认为是这样)。到目前为止,这是我写的:
noun_types = ['port', 'harbor', 'harbour']
target_pronouns = ['rotterdam', 'moscow']
grammer1 = (
F"""
S -> Det N P NP
P -> P
NP -> '{target_pronouns[0]}' | '{target_pronouns[1]}'
Det -> 'the' | 'a'
P -> 'of'
N -> '{noun_types[0]}' | '{noun_types[1]}' | '{noun_types[2]}'
""")
理想情况下,我希望能够传递n个代词和名词的列表,并使用每个元素设置字符串的格式,而无需使用显式的字符串索引,因此如下所示:
noun_types = ['port', 'harbor', 'harbour']
target_pronouns = ['rotterdam', 'moscow']
grammer1 = (
F"""
S -> Det N P NP
P -> P
NP -> '{target_pronouns[range(0, len(target_pronouns))]}'
Det -> 'the' | 'a'
P -> 'of'
N -> '{noun_types[range(0, len(target_pronouns))]}'
""")
但是,我不确定如何实现|
运算符,更不用说进行字符串格式化时的任何条件格式化了。语法格式基于在此上下文中使用的nltk的语法构造函数:
from nltk.parse.generate import generate
from nltk import CFG
grammar = CFG.fromstring(grammer1)
for sentence in generate(grammar, n = 10, depth = 5):
words = ' '.join(sentence)
这是一个令人困惑的问题,因此我很乐意尝试澄清任何混淆!
问题来源:stackoverflow
因此,我认为有一种方法可以这样做:预先用''字符转义字符串,然后使用“” |“ .join()
将它们插入f字符串。
在输入列表的每个字符串之前和之后添加'
:
noun_types = [f"'{noun}'" for noun in noun_types]
target_pronouns = [f"'{pronoun}'" for pronoun in target_pronouns]
现在,您可以使用“ |” .join()
将它们放入f字符串中。无论输入列表的大小如何,都可以使用它,而无需索引。
print(f"""
NP -> {' | '.join(target_pronouns)}
N -> {' | '.join(noun_types)}
""")
输出:
NP -> 'rotterdam' | 'moscow'
N -> 'port' | 'harbor' | 'harbour'
如果事情变得更加复杂,另一种解决方案可能是进入Jinja模板,尽管现在似乎可以对其进行破解并避免使用额外的库。
回答来源:stackoverflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。