首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pyparsing歧义

pyparsing歧义
EN

Stack Overflow用户
提问于 2010-06-06 05:40:58
回答 3查看 614关注 0票数 3

我正在尝试使用PyParser解析一些文本。问题是我的名字可以包含空格。所以我的输入可能是这样的。首先,是一系列的名字:

代码语言:javascript
复制
Joe
bob
Jimmy X
grjiaer-rreaijgr Y

然后,他们所做的事情:

代码语言:javascript
复制
Joe A
bob B
Jimmy X C

当然,问题是它们所做的事情可能与名称的结尾相同:

代码语言:javascript
复制
Jimmy X X
grjiaer-rreaijgr Y Y

如何为动作行创建解析器?解析Joe A的输出应该是[Joe, A]。解析Jimmy X C的输出应该是Jimmy X X - [Jimmy X, X][Jimmy X, C]。也就是说,[name, action]对。

如果我天真地创建我的名称解析器,意思是像OneOrMore(RegEx("\S*"))这样的东西,那么它将匹配整个行,给出[Jimmy X X],后面跟着看不到操作的解析错误(因为它已经被名称解析器使用了)。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-04 06:48:34

玩得开心:

代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2010-06-06 07:47:30

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

但是像“吉米·福决定”这样的名字?解析器如何通过查看“判定”中的符号就知道“判定”是不是名称的一部分?即使是一个人在阅读你的"jimmy foo decides to eat“这句话时,也会很难判断名字的开头和结尾,以及这是不是某种打字错误。

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

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

票数 2
EN

Stack Overflow用户

发布于 2010-06-06 07:49:03

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

Re“可以包含空格的名称”:首先,我希望您将其规范化为一个空格。第二:这是意想不到的??第三:名称可以包含撇号和连字符(O‘’Brien,Montagu-Douglas-Scott),并且可以包含不大写的部分,例如Georg von and zu Hohenlohe),我们不会提到Unicode。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2982219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档