2010-06-05 3 views
2

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

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

ПРИМЕЧАНИЕ: Извините за неоднозначную формулировку ранее, что сделало это похожим на вопрос о НЛП.

+0

имена всегда капитализируются, и глагол всегда строчная? – FMc

+0

nope, имена могут иметь любую буквенно-цифровую вещь. Имя может даже быть «jimmy foo decides», поэтому линия показала бы, что «jimmy foo decides решит поесть." – Claudiu

+0

Мне очень нужно не жадное совпадение имени – Claudiu

ответ

1

Весело:

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

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

+0

. Пожалуйста, добавьте пример. Из вашего описания элемент списка действий может быть «Tal Holech Lishon», и в этом случае вам придется как-то догадаться, является ли «Holech» фамилией Тэла или «Holech Lishon», действие, о котором вы никогда не слышали. –

+0

Я перешел от этого на данный момент, но это правило: я всегда знаю, что такое возможное действие, но я не знаю, что такое все имена. поэтому с точки зрения техники непиксеров я мог бы технически сделать обратный поиск в каждой строке для каждого возможного действия, и если бы я нашел его, я бы знал, что материал слева от него - это имя. но как закодировать это в pyparsing? – Claudiu

2

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

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

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

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

+0

это не так непредсказуемо. Есть только 3-4 возможных фразы, и они все имеют буквальное окончание (например, «решает поесть», «выходит на рынок»). Я могу разобрать это обычно, просто делая str.split() по фразе «решает есть» и глядя на имя. Я просто хочу посмотреть, как это сделать гибко из pyparsing – Claudiu

+0

Я отредактировал вопрос, чтобы сделать это более ясным – Claudiu

0

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

Re "имена, которые могут содержать пробелы": Во-первых, я надеюсь, что вы нормализуете это в одном пространстве. Во-вторых: это неожиданно? В-третьих: имена могут содержать апострофы и дефисы (O'Brien, Montagu-Douglas-Scott) и могут содержать компоненты, которые не капитализируются, например. Georg von und zu Hohenlohe), и мы не будем упоминать Unicode.

+0

тире и другие символы в порядке. если имя не имеет пробелов, я мог бы просто проанализировать его с помощью Regex (\ S +) и сделать с ним. пробел усложняет проблему, потому что она также отделяет имя от остальной части фразы. – Claudiu