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