2016-11-01 2 views
0

Используя извлечение информации из этого блога post, я пытаюсь определить грамматику, которая включает добавление дат в качестве нового фрагмента со следующей грамматикой;nltk пользовательская грамматика для дат зацикливания с использованием RegexpParser

grammar = r""" 
    NBAR: 
     {<NN.*|JJ>*<NN.*>} # Nouns and Adjectives, terminated with Nouns 

    NP: 
     {<NBAR>} 
     {<NBAR><IN><NBAR>} # Above, connected with in/of/etc... 
    DATE -> MONTH SEP DAY SEP YEAR 
    SEP -> "/" 
    MONTH -> DIGIT | DIGIT DIGIT 
    DAY -> DIGIT | DIGIT DIGIT 
    YEAR -> DIGIT DIGIT DIGIT DIGIT 
    DIGIT -> '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '0' 

Но это бросает незаконный образец куска, когда я называю chunker = nltk.RegexpParser(grammar), Любые идеи о том, как я могу включать даты, которые всегда представлены в виде 8 цифр DD/MM/YYYY или в длинной форме, где месяц прописанные и дату следует порядковый индикатор st,nd, or th, так что результатом будет DDthMONTHYYYY.

ответ

1

Вы смешиваете яблоки и апельсины. Только ваши первые два расширения действительны в правилах nltk RegexpParser, поэтому вы получаете ошибку на третьем. Преобразуйте остальные в один и тот же формат: измените разделитель с -> на :, затем напишите разложения как выражения RegexpParser. Обратите внимание, что вы работаете с chunker, а не с иерархическим парсером. (См. Приведенную выше документацию, а также все книги NLTK.)

+0

PS. Обратите внимание на то, что парсер-парсер сопоставляется с тегами POS на токенах, а не с одиночными символами. Возможно, вы захотите сделать шаг назад и пересмотреть инструменты, которые вы используете для этой задачи ... – alexis