4

我试图在冒号的位置拆分一个块:在 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))

上面的代码确实使一个块将冒号作为一个块。<.*>}{<\VBD.*> 行在 let 之前的位置拆分由 (Rapunzel+:+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:非法块模式:>

谁能解释如何做到这一点,我尝试了谷歌并浏览了文档,但我并不聪明。我可以处理这个帖子块没问题,但我只是知道为什么或如何。:-)

4

1 回答 1

0

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

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

假设我们有以下语法:

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

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

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

不幸的是,如果有人使用带有另一个冒号的 chinking 正则表达式,这将不起作用,就像在您的示例中一样。

为了帮助您解决您的具体问题,请发布您要解析的确切句子。从您的示例中,很难说出您为什么需要|<NNP.*><\:><VBD>零件。

于 2018-08-01T00:41:19.763 回答