如何使用 nltk.Regexp.parser() 解析自定义标签

Posted

技术标签:

【中文标题】如何使用 nltk.Regexp.parser() 解析自定义标签【英文标题】:How to parse custom tags using nltk.Regexp.parser() 【发布时间】:2014-09-18 11:30:30 【问题描述】:

我的问题类似于这个未回答的问题:Using custom POS tags for NLTK chunking?,但我得到的错误是不同的。我正在尝试解析一个添加了我自己的域特定标签的句子

例如:

(u'greatest', 'P'), (u'internet', 'NN'), (u'ever', 'A'), 
(u',', ','), (u'and', 'CC'), (u'its', 'PRP$'), (u'being', 'VBG'), 
(u'slow', 'N'), (u'as', 'IN'), (u'hell', 'NN')`

其中(u'slow', 'N') 是自定义标签'N'

我正在尝试使用以下方法解析:

grammar=r"""
Chunk:`<A>?*<P>+`
"""
parser=nltk.RegexpParser(grammar)

但我收到以下错误:

ValueError: Illegal chunk pattern: `<A>?*<P>+`

nltk.RegexpParser 是否处理自定义标签?有没有其他基于 nltk 或 python 的解析器可以做到这一点?

【问题讨论】:

语法没有出现在块代码中:它是grammar=r""" Chunk:&lt;A&gt;?*&lt;P&gt;+ """ 您需要将语法作为字符串传递,而不是作为正则表达式。 @louism:不,那不是必需品。语法可以作为字符串传递。参考nltk.org/book/ch07.html 【参考方案1】:

我不熟悉 NTLK,但在 Python 正则表达式中?* 是一个语法错误。也许您的意思是*?,它是一个惰性量词。

【讨论】:

【参考方案2】:

nltk.RegexpParser 可以处理自定义标签。

您可以通过以下方式修改代码以使其正常工作:

# Import the RegexpParser
from nltk.chunk import RegexpParser

# Define your custom tagged data. 
tags = [(u'greatest', 'P'), (u'internet', 'NN'), (u'ever', 'A'), 
(u',', ','), (u'and', 'CC'), (u'its', 'PRP$'), (u'being', 'VBG'), 
(u'slow', 'N'), (u'as', 'IN'), (u'hell', 'NN')]

# Define your custom grammar (modified to be a valid regex).
grammar = """ CHUNK: <A>*<P>+ """

# Create an instance of your custom parser.
custom_tag_parser = RegexpParser(grammar)

# Parse!
custom_tag_parser.parse(tags)

这是您从测试数据中得到的结果:

Tree('S', [Tree('CHUNK', [(u'greatest', 'P')]), (u'internet', 'NN'), (u'ever', 'A'), (u',', ','), (u'and', 'CC'), (u'its', 'PRP$'), (u'being', 'VBG'), (u'slow', 'N'), (u'as', 'IN'), (u'hell', 'NN')])

【讨论】:

嗨。是的,我意识到它可以处理自定义标签,并且我为语法编写正则表达式的方式存在错误。无论如何感谢您的详细回答。

以上是关于如何使用 nltk.Regexp.parser() 解析自定义标签的主要内容,如果未能解决你的问题,请参考以下文章

如果加入条件,我该如何解决。如果使用字符串连接,我如何使用

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?