我正在尝试在python中使用nltk模块将任何两到五个名词按顺序出现的实例组合在一起。
这是我正在使用的代码:
parse_pattern = "Keyword: {< N>{2,5}}"
keyword_parser = nltk.RegexpParser(parse_pattern)
result = keyword_parser.parse(sentence)
我觉得这个位应该可以解决问题:Keyword: {< N>{2,5}}
我甚至在“使用Python进行自然语言处理”一书中找到了一个例子,完全类似地使用了上述位:NOUNS: {< N.*>{4,}}
作者解释说这段代码应该有4个或更多名词。
但是,当我运行上面的代码时出现错误:
ValueError: Illegal chunk pattern: {< N>{2,5}}
注意:我也尝试使用{< N.*>{2,5}}
使用{{1}}(仅因为上述图书的作者所做的点星而没有运气)。
任何有关如何重复标记两次或多次重复的帮助都将受到高度赞赏。
答案 0 :(得分:2)
ValueError可能是由开角括号和N之间的空格触发的。
parse_pattern = "Keyword: {<N>{2,5}}"
而不是
parse_pattern = "Keyword: {< N>{2,5}}"
此外,不要担心使用带有额外点星的语法,因为只有在尝试匹配 start 的所有标记时才需要这样,此处为N.
如果全部失败,您可以尝试替代表达式,该表达式不需要出现范围的{min,max}语法。
parse_pattern = "Keyword: {<N><N><N>?<N>?<N>?}"
如果这甚至失败了,也许只试用parse_pattern = "Keyword: {<N>}"
,这有希望得到某些东西起作用,或者可能有助于找出你的设置可能出现的其他问题。
答案 1 :(得分:0)
nltk使用以下标记标记名词:
<NN>
单数名词<NNP>
表示单数专有名词<NNS>
复数名词<NNPS>
为复数专有名词因此,如果您想要在两到五次之间捕获任何这些,您将需要正则表达式:
<NN.*>{2,5}
用你的例子,那就是:
parse_pattern = "Keyword: {<NN.*>{2,5}}"
keyword_parser = nltk.RegexpParser(parse_pattern)
result = keyword_parser.parse(sentence)
请注意,必须标记sentence
,例如
sentence = [("dog", "NN"), ("David", "NNP"), ("cats", "NNS")]
答案 2 :(得分:0)
查找regex.py包的代码,即tag_pattern2re_pattern()的方法,该功能将tag_pattern转换为正确的正则表达式。而常量参数CHUNK_TAG_PATTERN是不可变的,它以一些特殊字符开始,并以特殊字符结束,例如'(','','<',')','>','>'。因此标记模式CHUNK:{<V.*><TO><V.*>}
是正确的,但是标记模式CHUNK:{<V>.*<TO><V.*>{1,}}
是错误的