Разделить двоеточие в NLTK

Я пытаюсь разбить кусок в позиции двоеточия: в 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 и просматривал документы, но я не знаю. Я могу справиться с этим фрагментом поста без проблем, но я просто узнал, почему и как. :-)


person yaroze    schedule 15.10.2016    source источник
comment
Хороший вопрос! Чтобы люди могли вам помочь, приведите краткий (но полный) пример кода, показывающий тривиальный пример того, как вы используете RegexpParser и получаете ошибку.   -  person alexis    schedule 15.10.2016


Ответы (1)


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

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

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

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

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

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

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

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

person sorjef    schedule 01.08.2018