有没有办法使用nltk在标记句子中重复2次或更多次重复标记?

时间:2011-07-12 05:02:06

标签: python nltk chunking

我正在尝试在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}}(仅因为上述图书的作者所做的点星而没有运气)。

任何有关如何重复标记两次或多次重复的帮助都将受到高度赞赏。

3 个答案:

答案 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,}}是错误的