3

我正在尝试使用 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]一个解析错误,因为没有看到一个动作(因为它已经被名称解析器消耗了)。

注意:很抱歉之前的措辞模棱两可,这看起来像是一个 NLP 问题。

4

3 回答 3

2

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

但是像“jimmy foo 决定”这样的名字?解析器如何仅通过查看“决定”中的符号来知道“决定”是否是名称的一部分?即使是阅读您的“jimmy foo 决定吃”句子的人也会难以确定名称的开始或停止位置,以及这是否是某种拼写错误。

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

对于这种语言解释,我不建议使用 pyparsing。

于 2010-06-05T23:47:29.670 回答
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)
于 2010-07-03T22:48:33.537 回答
0

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

关于“可以包含空格的名称”:首先,我希望您将其规范化为一个空格。其次:这出乎意料??第三:名称可以包含撇号和连字符(O'Brien、Montagu-Douglas-Scott)并且可能包含不大写的组件,例如 Georg von und zu Hohenlohe),我们不会提及 Unicode。

于 2010-06-05T23:49:03.347 回答