如何通过nltk的pos_tag覆盖分配给文本的POS标签?

时间:2012-08-06 03:23:38

标签: python nltk

我正在使用来自nltk的pos_tag来标记一组(未标记的)技术文档中的文本并获得良好的结果,但它总是将“已验证”等词语标记为动词,有时它可以用作形容词。换句话说,只是更改标签不会每次都有效。

是否有一种好方法可以覆盖或更正考虑上下文的​​标记结果?

1 个答案:

答案 0 :(得分:2)

不幸的是,您的问题可以归结为“如何改进我的标记?”。答案是,您需要构建一个更好的标记器。所有非平凡的标记都考虑了上下文,因此这不仅仅是添加上下文敏感性的问题;它已经存在,在某些情况下它会失败。

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(您将使用的那个)将构建一个二元模型;如果它看到未知输入,它将回退到t1,它使用unigram模型;如果那也失败了,它将推迟到t0(它只标记所有'N')。

你可以添加一个特殊用途的重拍器来改进默认标签,但当然你必须首先找出它的作用 - 这当然是你首先要问的。

如果nltk标记器一遍又一遍地犯同样的错误,你可以整理一组修正并根据它重新训练一个重标记器。您需要多少数据取决于错误的一致性。我从来没有尝试过这个,但是Brill tagger通过连续应用重新排序规则来工作,所以也许它是使用的正确工具。

另一种方法是尝试构建您自己的特定于域的标记语料库:使用nltk标记器标记训练集,手动或半自动更正,然后在其上训练标记器并尝试在新数据上获得更好的性能而不是使用默认的nltk标记器(可能通过将两个标记器链接在一起)。