不幸的是,您的问题归结为“我该如何改善我的标记?”。答案是,您需要构建更好的标记器。所有非平凡的标记器都考虑了上下文,因此这不仅仅是增加上下文敏感性的问题;它已经存在,在某些情况下只是失败了。
NLTK标记模型允许您“链接”标记器,以便每个标记器都可以占据另一个标记器的位置(例如,ngram标记器会落在正则表达式标记器上以查找未知单词)。它是这样的:
t0 = nltk.DefaultTagger('N')t1 = nltk.UnigramTagger(traindata, backoff=t0)t2 = nltk.BigramTagger(traindata, backoff=t1)traindata这是标准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(您将使用的那个)将建立一个bigram模型;如果看到未知输入,它将退回至
t1,使用unigram模型;如果那也失败了,它将遵从
t0(仅将所有内容标记为“
N”)。
您可以添加特殊用途的翻刀来改善默认标记,但是当然您必须首先弄清楚它的作用-当然这是您首先要问的问题。
如果nltk标记程序不断重复犯相同类型的错误,则可以放在一起更正的语料库,并在此基础上训练重新标记。您需要多少数据将取决于错误的一致性。我从来没有尝试过,但是Brill标记器通过连续应用重新标记规则来工作,因此也许它是使用的正确工具。
替代方法是尝试构建自己的特定于域的带标记语料库:使用nltk标记器标记训练集,手动或半自动对其进行纠正,然后在其上训练标记器,并尝试在新数据上获得比使用更好的性能。默认的nltk标记器(也许通过将两个标记器链接在一起)。



