在NLTK中大块冒号

时间:2016-10-15 12:28:15

标签: regex nltk text-chunking

我试图在冒号的位置拆分一个块:在NLTK中,但它似乎是一个特例。在正常的正则表达式中,我可以把它放在[:]没问题。

但是在NLTK中,无论我做什么,它都不喜欢它在regexParser中。

from nltk import  RegexpParser

grammar = r"""
  NP: {<DT|PP\$>?<JJ>*<NN>|<NNP.*><\:><VBD>}   # chunk (Rapunzel + : + let) together
    {<NNP>+}                
    <.*>}{<VBD.*>           


"""
cp = RegexpParser(grammar)
sentence = [("Rapunzel", "NNP"), (":",":"), ("let", "VBD"), ("down", "RP"), ("her", "PP$"), ("long", "JJ"), ("golden", "JJ"), ("hair", "NN")]

print(cp.parse(sentence))

上面的代码确实使得一个块将冒号作为一个块。 &LT。* GT;} {&LT; \ * VBD&GT。 line将由(Rapunzel +:+ let)组成的块拆分到let之前的位置。 如果你取出那个分裂并用冒号替换它就会出错

from nltk import  RegexpParser

grammar = r"""
  NP: {<DT|PP\$>?<JJ>*<NN>|<NNP.*><\:><VBD>}   # chunk (Rapunzel + : + let) together
    {<NNP>+}                
    <.*>}{<\:.*>           


"""
cp = RegexpParser(grammar)
sentence = [("Rapunzel", "NNP"), (":",":"), ("let", "VBD"), ("down", "RP"), ("her", "PP$"), ("long", "JJ"), ("golden", "JJ"), ("hair", "NN")]

print(cp.parse(sentence))
  

ValueError:非法块模式:&gt;

任何人都可以解释如何做到这一点,我尝试过谷歌并浏览文档,但我不是更明智的。我可以处理这个帖子大块没问题,但我只知道为什么或如何。 : - )

1 个答案:

答案 0 :(得分:0)

NLTK似乎将每个块定义的第二个冒号视为开始新块的指示符。

对于遇到相同错误的人,一种解决方法是将多个正则表达式分解为多个具有相同名称的块。

假设我们具有以下语法:

grammar = r"""
  SOME_CHUNK: 
    {<NN><:>}
    {<JJ><:>}          
"""

要解决此问题,请将其更改为:

grammar = r"""
  SOME_CHUNK: {<NN><:>}
  SOME_CHUNK: {<JJ><:>}          
"""

不幸的是,如果您正在与另一个冒号一起使用chinking正则表达式,则此方法将不起作用,例如您的示例。

为帮助您解决特定问题,请张贴您要解析的确切句子。从您的示例很难说出为什么根本需要|<NNP.*><\:><VBD>部分。