我正在尝试使用PyParser解析一些文本。问题是我的名字可以包含空格。所以我的输入可能是这样的。首先,列出名称:
Joe
bob
Jimmy X
grjiaer-rreaijgr Y
然后,他们做的事情:
Joe A
bob B
Jimmy X C
问题当然是他们所做的事情可能与名称的结尾相同:</ p>
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 :(得分:2)
您需要的不仅仅是简单的解析器。解析器使用字符串中的符号来定义字符串的哪些部分表示语法的不同元素。这就是为什么FM要求一些线索来表明你如何知道这个名字的哪个部分以及句子的其余部分。如果您可以说名称由一个或多个大写单词组成,则解析器将知道名称何时停止并且句子的其余部分开始。
但像“jimmy foo”这样的名字决定了吗?解析器如何才能通过查看“决定”中的符号知道“决定”是否是名称的一部分?即使是阅读你的“jimmy foo决定吃饭”句子的人也会在确定姓名的起点或终点时遇到一些麻烦,以及这是否是某种错字。
如果您的输入真的不可预测,那么您需要使用NLTK(自然语言工具包)等工具。我自己没有使用它,但它从解析语言中的句子的角度来解决这个问题,而不是试图解析结构化数据或数学格式。
我不建议对这种语言解释进行pyparsing。
答案 1 :(得分: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)
答案 2 :(得分:0)
看起来你需要nltk,而不是pyparsing。看起来你需要一个容易处理的问题。你怎么知道怎么解析'jimmy foo决定决定吃'?您使用什么规则推断(与大多数人会假设的相反)“决定决定”不是一个错字?
重新“可以包含空格的名称”:首先,我希望你将它标准化为一个空格。第二:这是意料之外的?第三:名称可以包含撇号和连字符(O'Brien,Montagu-Douglas-Scott),并且可能包含未大写的组件,例如Georg von und zu Hohenlohe)我们不会提到Unicode。