2010-06-05 86 views
2

我想解析一些文本使用PyParser。问题是我有可以包含空格的名称。所以我的输入可能看起来像这样。首先,名称的列表:pyparsing歧义

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],然后解析错误,看不到一个操作(因为它已被名称解析器使用)。

注意:很抱歉,前面的模糊语句使得这看起来像是一个NLP问题。

+0

是名称总是大写,而且是动词总是小写? – FMc 2010-06-05 21:53:25

+0

不可以,名字可以有任何字母数字的东西。一个名字甚至可以是“吉米富裕决定的”,所以该行会显示“吉米富富决定决定吃饭。“ – Claudiu 2010-06-05 22:15:19

+0

我非常需要名字的非贪婪匹配 – Claudiu 2010-06-05 22:16:24

回答

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 2010-07-05 15:54:17

+0

请添加示例。根据你的描述,一个动作列表项目可能是“Tal Holech Lishon”,在这种情况下,你将不得不猜测“Holech”是Tal的姓氏,还是“Holech Lishon”之前你从未听说过的某种动作。 – 2010-07-05 20:00:30

+0

我现在已经从这里开始了,但规则是:我总是知道可能的行动是什么,但我不知道所有的名字是什么。所以就非pyparsing技术而言,我可以在技术上对每个可能的动作在每一行上进行反向搜索,如果我找到了一个,我会知道左边的是一个名称。但如何编码在pyparsing? – Claudiu 2010-08-11 16:32:07

2

你需要的不仅仅是一个简单的解析器。解析器使用字符串中的符号来定义哪些字符串代表语法的不同元素。这就是为什么FM要求提供一些线索来说明你如何知道名字是什么部分以及句子的其余部分是什么。如果您可以说名称是由一个或多个大写字母组成的,那么解析器会知道名称何时停止并且该句子的其余部分何时开始。

但是有个名字叫“jimmy foo决定”?解析器如何通过在“决定”中查看符号来判断“决定”是否是名称的一部分?甚至一个人读你的“吉米富尔决定吃”的句子也会在确定名字的起止位置以及这是否是某种错字时遇到一些麻烦。

如果你的输入真的是不可预测的,那么你需要使用一个工具,如NLTK(自然语言工具包)。我自己并没有使用它,但它从解析语言中的句子的角度来解决这个问题,而不是试图解析结构化数据或数学格式。

我不会推荐pyparsing这种语言的解释。

+0

它不是不可预知的。只有3-4可能的短语,他们都有一个文字结尾(例如,“决定吃”,“上市”),我可以通过对“决定吃”这个短语进行str.split()并查看名字来解析这个问题。我只是想看看如何从pyparsing灵活地做到这一点 – Claudiu 2010-06-06 05:53:53

+0

我会编辑这个问题,使其更清晰 – Claudiu 2010-06-06 05:55:36

0

看起来你需要nltk,而不是pyparsing。看起来你需要一个易于处理的问题来处理。你怎么知道如何解析'吉姆富决定决定吃'?你用什么规则来推断(与大多数人所假设的相反),“决定决定”不是一个错字?

Re“可以包含空格的名称”:首先,我希望您能够将其归一化为一个空格。其次:这是意想不到的?第三:名称可以包含撇号和连字符(O'Brien,Montagu-Douglas-Scott),并且可能包含没有大写的组件,例如Georg von und zu Hohenlohe),我们不会提到Unicode。

+0

破折号和其他符号都很好。如果这个名字没有空格,我可以用正则表达式(\ S +)解析它并完成它。空白使问题复杂化,因为它也将名称与短语的其余部分分开。 – Claudiu 2010-06-06 05:55:03