我试图在冒号的位置拆分一个块:在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;
任何人都可以解释如何做到这一点,我尝试过谷歌并浏览文档,但我不是更明智的。我可以处理这个帖子大块没问题,但我只知道为什么或如何。 : - )
答案 0 :(得分:0)
NLTK似乎将每个块定义的第二个冒号视为开始新块的指示符。
对于遇到相同错误的人,一种解决方法是将多个正则表达式分解为多个具有相同名称的块。
假设我们具有以下语法:
grammar = r"""
SOME_CHUNK:
{<NN><:>}
{<JJ><:>}
"""
要解决此问题,请将其更改为:
grammar = r"""
SOME_CHUNK: {<NN><:>}
SOME_CHUNK: {<JJ><:>}
"""
不幸的是,如果您正在与另一个冒号一起使用chinking正则表达式,则此方法将不起作用,例如您的示例。
为帮助您解决特定问题,请张贴您要解析的确切句子。从您的示例很难说出为什么根本需要|<NNP.*><\:><VBD>
部分。