3

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

任何有关如何分块两个或多个标签重复的帮助将不胜感激。

4

3 回答 3

2

ValueError 可能是由左尖括号和 N 之间的空格触发的。

parse_pattern = "Keyword: {<N>{2,5}}"而不是
parse_pattern = "Keyword: {< N>{2,5}}"

另外,不要担心使用带有额外点星的语法,因为只有当您尝试匹配所有以 N开头的标签时才需要这样做。

如果一切都失败了,您可以尝试替代表达式,它不需要 {min, max} 出现范围的语法。 parse_pattern = "Keyword: {<N><N><N>?<N>?<N>?}"

如果这甚至失败了,也许尝试一下parse_pattern = "Keyword: {<N>}",希望这会有所帮助,或者可能有助于查明您的设置可能还有什么问题。

于 2011-07-12T06:29:53.127 回答
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")]
于 2014-01-18T05:48:18.547 回答
0

查找 regex.py 包的代码,即 tag_pattern2re_pattern() 的方法,该方法将 tag_pattern 转换为正确的正则表达式。而常量参数 CHUNK_TAG_PATTERN 是不可变的,它以某些特殊字符开头,以特殊字符结尾,例如 '('、' '、'<'、')'、'>'、'>'。所以标签模式CHUNK:{<V.*><TO><V.*>}是正确的,但标签模式CHUNK:{<V>.*<TO><V.*>{1,}}是不正确的

于 2018-08-20T11:49:15.053 回答