有没有方法在标记的句子中使用nltk将两个或多个标签重复进行分块?
我正在尝试在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,}}
,书中的作者解释说这段代码应该能组合四个或更多的名词。
但是,当我运行上面的代码时,出现了错误:
ValueError: Illegal chunk pattern: {< N>{2,5}}
注意:我还尝试过使用{< N.*>{2,5}}
(使用点星号是因为前面提到的书的作者这样做)但也没有成功。
如果有人能帮我解决如何组合两个或更多标签的重复问题,我将非常感激。
3 个回答
请查看regex.py这个包里的代码,里面有一个叫tag_pattern2re_pattern()的方法,它的功能是把标签模式转换成正确的正则表达式。而常量参数CHUNK_TAG_PATTERN是不可改变的,它的开头和结尾都有一些特殊字符,比如'('、' '、'<'、')'、'>'、'>'。所以标签模式CHUNK:{<V.*><TO><V.*>}
是正确的,但标签模式CHUNK:{<V>.*<TO><V.*>{1,}}
就是不正确的。
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")]
这个错误可能是因为开头的尖括号和字母N之间有个空格导致的。
parse_pattern = "Keyword: {<N>{2,5}}"
这样写是对的,而不是
parse_pattern = "Keyword: {< N>{2,5}}"
另外,使用带有额外点星号的语法也不用担心,这个只有在你想匹配所有以N开头的标签时才需要。
如果这些都不行,你可以试试另一种写法,这种写法不需要{最小值, 最大值}的语法来表示出现的次数范围。
parse_pattern = "Keyword: {<N><N><N>?<N>?<N>?}"
如果这也不行,试试简单的parse_pattern = "Keyword: {<N>}"
,希望这样能让你得到一些结果,或者至少能帮助你找出其他可能出错的地方。