nltk中的回退标注器
我刚开始学习Python编程。我想使用UnigramTagger,并且想加一个后备标签器(在我的情况下是RegexpTagger),但是我一直搞不懂下面这个错误是什么。希望能得到一些帮助。
>>> train_sents = (['@Sakshi', 'Hi', 'I', 'am', 'meeting', 'my', 'friend', 'today'])
>>> from tag_util import patterns
>>> from nltk.tag import RegexpTagger
>>> re_tagger = RegexpTagger(patterns)
>>> from nltk.tag import UnigramTagger
>>> from tag_util import backoff_tagger
>>> tagger = backoff_tagger(train_sents, UnigramTagger, backoff=re_tagger)
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
tagger = backoff_tagger(train_sents, UnigramTagger, backoff=re_tagger)
File "tag_util.py", line 12, in backoff_tagger
for cls in tagger_classes:
TypeError: 'YAMLObjectMetaclass' object is not iterable
这是我在tag_util中用来定义模式和后备标签器的代码。
import re
patterns = [
(r'^@\w+', 'NNP'),
(r'^\d+$', 'CD'),
(r'.*ing$', 'VBG'), # gerunds, i.e. wondering
(r'.*ment$', 'NN'),
(r'.*ful$', 'JJ'), # i.e. wonderful
(r'.*', 'NN')
]
def backoff_tagger(train_sents, tagger_classes, backoff=None):
for cls in tagger_classes:
backoff = cls(train_sents, backoff=backoff)
return backoff
2 个回答
0
如果你在使用我想的那个 backoff_tagger
,那么 UnigramTagger
应该是下面这个列表中的一个项目:
tagger = backoff_tagger(train_sents, [UnigramTagger], backoff=re_tagger)
希望这对你有帮助。
2
要让这个工作,只需要改动几个地方。
你遇到的错误是因为你不能对 UnigramTagger
这个类进行迭代。我不确定你是不是想做其他事情,但只需去掉 for
循环。此外,你需要给 UnigramTagger
传入一个包含 标记句子 的 list
,这些句子应该是 (单词, 标签) 的 tuple
形式的列表,而不仅仅是单词的列表。否则,它就不知道怎么训练。部分内容可能看起来像这样:
[[('@Sakshi', 'NN'), ('Hi', 'NN'),...],...[('Another', 'NN'), ('sentence', 'NN')]]
注意这里每个句子本身就是一个 list
。另外,你可以使用 NTLK 提供的标记语料库(我推荐这样做)。
补充:
看了你的帖子后,我觉得你对某些函数的输入和输出有些困惑,同时对 NLP 中的 训练 概念也不太了解。我认为你可以通过从头开始阅读 NLTK 的书籍,会有很大帮助。
我很乐意告诉你怎么解决这个问题,但我觉得如果不做一些额外的研究,你可能无法完全理解背后的机制。
tag_util.py(基于你的代码)
from nltk.tag import RegexpTagger, UnigramTagger
from nltk.corpus import brown
patterns = [
(r'^@\w+', 'NNP'),
(r'^\d+$', 'CD'),
(r'.*ing$', 'VBG'),
(r'.*ment$', 'NN'),
(r'.*ful$', 'JJ'),
(r'.*', 'NN')
]
re_tagger = RegexpTagger(patterns)
tagger = UnigramTagger(brown.tagged_sents(), backoff=re_tagger) # train tagger
在 Python 解释器中
>>> import tag_util
>>> tag_util.brown.tagged_sents()[:2]
[[('The', 'AT'), ('Fulton', 'NP-TL'), ('County', 'NN-TL'), ('Grand', 'JJ-TL'), ('Jury', 'NN-TL'), ('said', 'VBD'), ('Friday', 'NR'), ('an', 'AT'), ('investigation', 'NN'), ('of', 'IN'), ("Atlanta's", 'NP$'), ('recent', 'JJ'), ('primary', 'NN'), ('election', 'NN'), ('produced', 'VBD'), ('``', '``'), ('no', 'AT'), ('evidence', 'NN'), ("''", "''"), ('that', 'CS'), ('any', 'DTI'), ('irregularities', 'NNS'), ('took', 'VBD'), ('place', 'NN'), ('.', '.')], [('The', 'AT'), ('jury', 'NN'), ('further', 'RBR'), ('said', 'VBD'), ('in', 'IN'), ('term-end', 'NN'), ('presentments', 'NNS'), ('that', 'CS'), ('the', 'AT'), ('City', 'NN-TL'), ('Executive', 'JJ-TL'), ('Committee', 'NN-TL'), (',', ','), ('which', 'WDT'), ('had', 'HVD'), ('over-all', 'JJ'), ('charge', 'NN'), ('of', 'IN'), ('the', 'AT'), ('election', 'NN'), (',', ','), ('``', '``'), ('deserves', 'VBZ'), ('the', 'AT'), ('praise', 'NN'), ('and', 'CC'), ('thanks', 'NNS'), ('of', 'IN'), ('the', 'AT'), ('City', 'NN-TL'), ('of', 'IN-TL'), ('Atlanta', 'NP-TL'), ("''", "''"), ('for', 'IN'), ('the', 'AT'), ('manner', 'NN'), ('in', 'IN'), ('which', 'WDT'), ('the', 'AT'), ('election', 'NN'), ('was', 'BEDZ'), ('conducted', 'VBN'), ('.', '.')]]
注意这里的输出。我从布朗语料库中获取了前两个标记句子。这就是你需要传给标记器(比如 UnigramTagger)作为输入的数据,以便进行训练。现在让我们使用在 tag_util.py
中训练的标记器。
回到 Python 解释器
>>> tag_util.tagger.tag(['I', 'just', 'drank', 'some', 'coffee', '.'])
[('I', 'PPSS'), ('just', 'RB'), ('drank', 'VBD'), ('some', 'DTI'), ('coffee', 'NN'), ('.', '.')]
这样,你就得到了使用你的方法标记的句子的词性。