Вопрос

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

Примечание. Извините за неоднозначную формулировку ранее, которая сделала это выглядеть как вопрос НЛП.

Это было полезно?

Решение

Веселиться:

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)

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top