Кусок толстой кишки в НЛТК

Я пытаюсь разбить кусок на позицию двоеточия: в 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. *> Разделяет чанк, состоящий из (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: Недопустимый шаблон чанка: >

Может кто-нибудь объяснить, как это сделать, я попробовал Google и просматривал документы, но я не мудрый. Я могу справиться с этим постом без проблем, но я просто узнал почему или как.:-)

1 ответ

Кажется, что NLTK рассматривает второе двоеточие для каждого определения чанка как индикатор, чтобы начать новый чанк.

Для тех, кто получает ту же ошибку, обходной путь состоит в том, чтобы разбить несколько регулярных выражений на несколько кусков с одинаковыми именами.

Предположим, у нас есть следующая грамматика:

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

Чтобы это исправить, измените его на:

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

К сожалению, это не будет работать, если вы используете chinking regex с другим двоеточием, как в вашем примере.

Чтобы помочь вам решить конкретную проблему, напишите точное предложение, которое вы пытаетесь разобрать. По твоему примеру трудно сказать, зачем тебе |<NNP.*><\:><VBD> часть вообще.

Другие вопросы по тегам