[英]pyparsing ambiguity
我正在尝试使用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 XC
的输出应该是Jimmy XX
[Jimmy X, C]
- [Jimmy X, X]
。 也就是说, [name, action]
对。
如果我天真地创建我的名称解析器,意思是像OneOrMore(RegEx("\\S*"))
,那么它将匹配整个行给我[Jimmy XX]
然后解析错误没有看到动作(因为它是已被名称解析器使用)。
注意:对于早先的含糊不清的措辞,我们很抱歉这看起来像是一个NLP问题。
你需要的不仅仅是一个简单的解析器。 解析器使用字符串中的符号来定义字符串的哪些部分表示语法的不同元素。 这就是为什么FM要求一些线索来表明你如何知道这个名字的哪个部分以及句子的其余部分。 如果您可以说名称由一个或多个大写单词组成,则解析器将知道名称何时停止并且句子的其余部分开始。
但是像“jimmy foo”这样的名字决定了吗? 解析器如何才能通过查看“决定”中的符号知道“决定”是否是名称的一部分? 甚至一个阅读你的“jimmy foo决定吃饭”的人也会在确定名字的起点或终点时遇到一些麻烦,以及这是否是某种错字。
如果你的输入确实是不可预测的,那么你需要使用一个工具,如NLTK(自然语言工具包)。 我自己没有使用它,但它从解析语言中的句子的角度来解决这个问题,而不是试图解析结构化数据或数学格式。
对于这种语言解释,我不建议使用pyparsing。
玩得开心:
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)
看起来你需要nltk,而不是pyparsing。 看起来你需要一个容易处理的问题。 你怎么知道怎么解析'jimmy foo决定决定吃'? 您使用什么规则推断(与大多数人会假设的相反)“决定决定”不是一个错字?
重新“可以包含空格的名称”:首先,我希望你将它标准化为一个空格。 第二:这是意料之外的? 第三:名称可以包含撇号和连字符(O'Brien,Montagu-Douglas-Scott),并且可能包含未大写的组件,例如Georg von und zu Hohenlohe),我们不会提及Unicode。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.