不幸的是,您的问题归结为“我如何改进我的标签?”。答案是,您需要构建一个更好的标记器。所有重要的标记器都会考虑上下文,因此这不仅仅是添加上下文敏感性的问题;它已经存在了,只是在某些情况下失败了。
NLTK 标记模型允许您“链接”标记器,以便每个标记器都可以占据另一个标记器留下的位置(例如,对于未知单词,ngram 标记器依靠正则表达式标记器)。它的工作原理如下:
t0 = nltk.DefaultTagger('N')
t1 = nltk.UnigramTagger(traindata, backoff=t0)
t2 = nltk.BigramTagger(traindata, backoff=t1)
traindata
这里有一个list标准 NLTK 形式中已标记句子的数量:每个句子都是以下形式的元组列表(word, tag)
。 (如果有理由的话,您可以为每个标记器使用不同的训练语料库;您肯定会希望使用一致的标记集)。例如,这是一个两句话长的训练语料库:
traindata = [ [ ('His', 'PRO'), ('petition', 'N'), ('charged', 'VD'),
('mental', 'ADJ'), ('cruelty', 'N'), ('.', '.') ],
[ ('Two', 'NUM'), ('tax', 'N'), ('revision', 'N'), ('bills', 'N'),
('were', 'V'), ('passed', 'VN'), ('.', '.') ] ]
Tagger t2
(您将使用的)将构建一个二元模型;如果它看到未知的输入,它将退回到t1
,它使用一元模型;如果也失败了,它将推迟t0
(它只是将所有内容标记为“N”)。
您可以添加一个特殊用途的重新标记器来改进默认标记,但当然您必须首先弄清楚让它做什么——这当然是您首先要求的。
如果 nltk 标注器一遍又一遍地犯同样类型的错误,您可以整理一个更正语料库,并基于此训练重新标注器。您需要多少数据取决于错误的一致性。我从未尝试过这个,但 Brill 标记器通过连续应用重新标记规则来工作,所以也许它是正确的工具。
另一种方法是尝试构建自己的特定领域标记语料库:使用 nltk 标记器标记训练集,手动或半自动纠正它,然后在其上训练标记器,并尝试在新数据上获得比使用 nltk 标记器更好的性能。默认 nltk 标记器(可能通过将两个标记器链接在一起)。