неоднозначность - PullRequest
       19

неоднозначность

3 голосов
/ 06 июня 2010

Я пытаюсь разобрать текст с помощью PyParser. Проблема в том, что у меня есть имена, которые могут содержать пробелы. Так что мой вклад может выглядеть следующим образом. Сначала список имен:

Joe
bob
Jimmy X
grjiaer-rreaijgr Y

Тогда, что они делают:

Joe A
bob B
Jimmy X C

проблема, конечно, в том, что то, что они делают, может совпадать с концом имени:

Jimmy X X
grjiaer-rreaijgr Y Y

Как я могу создать парсер для линий действий? Выход синтаксического анализа Joe A должен быть [Joe, A]. Выход синтаксического анализа Jimmy X C должен быть [Jimmy X, C], Jimmy X X - [Jimmy X, X]. То есть, [name, action] пар.

Если я создаю свой анализатор имен наивно, что означает что-то вроде OneOrMore(RegEx("\S*")), то он будет соответствовать всей строке, давая мне [Jimmy X X] с последующей ошибкой синтаксического анализа для невидимого действия (так как он уже использовался анализатором имен ).

ПРИМЕЧАНИЕ. Извините за неоднозначную формулировку, из-за которой это выглядело как вопрос НЛП.

Ответы [ 3 ]

2 голосов
/ 06 июня 2010

Вам в значительной степени нужно больше, чем простой парсер. Парсеры используют символы в строке, чтобы определить, какие части строки представляют различные элементы грамматики. Вот почему FM попросил дать подсказку, чтобы указать, откуда вы знаете, какая часть является названием, а какая - остальной частью предложения. Если бы вы могли сказать, что имена состоят из одного или нескольких заглавных слов, то синтаксический анализатор будет знать, когда имя заканчивается и начинается остальная часть предложения.

Но такое имя, как "решает Джимми Фу"? Как парсер может узнать, просто посмотрев на символы в «решает», «решает», является или нет частью имени? Даже человеку, читающему ваше предложение «Джимми Фу решает, решит съесть», будет трудно определить, где имя начинается или заканчивается, и было ли это опечаткой.

Если ваши данные действительно непредсказуемы, вам нужно использовать такой инструмент, как NLTK (Natural Language Toolkit). Я не использовал его сам, но он подходит к этой проблеме с точки зрения синтаксического анализа предложений в языке, а не пытается анализировать структурированные данные или математические форматы.

Я бы не рекомендовал pyparsing для такого рода языковой интерпретации.

1 голос
/ 04 июля 2010

Веселитесь:

from pyparsing import Regex, oneOf

THE_NAMES = \
"""Joe
bob
Jimmy X
grjiaer-rreaijgr Y
"""

THE_THINGS_THEY_DO = \
"""Joe A
bob B
Jimmy X C
Jimmy X X
grjiaer-rreaijgr Y Y
"""

ACTION = Regex('.*')
NAMES = THE_NAMES.splitlines()
print NAMES
GRAMMAR = oneOf(NAMES) + ACTION    
for line in THE_THINGS_THEY_DO.splitlines():
    print GRAMMAR.parseString(line)
0 голосов
/ 06 июня 2010

Похоже, вам нужен nltk, а не pyparsing. Похоже, вам нужна решаемая проблема для работы. Откуда ВЫ знаете, как разобрать «Джимми Фу решает съесть»? Какие правила ВЫ используете для вывода (вопреки тому, что большинство людей предполагает), что «решает, решает» - это не опечатка?

Re "имена, которые могут содержать пробелы": во-первых, я надеюсь, что вы нормализуете это в один пробел. Во-вторых: это неожиданно ?? В-третьих: имена могут содержать апострофы и дефисы (О'Брайен, Монтегю-Дуглас-Скотт) и могут содержать компоненты, которые не пишутся с большой буквы, например Georg von und zu Hohenlohe), и мы не будем упоминать Unicode.

...