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

时间:2014-07-26 21:10:01

标签: python regex parsing nltk

我的问题类似于这个未回答的问题: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的解析器可以做到这一点?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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')])