如何覆盖nltk的pos_tag分配给文本的POS标签?
问题内容:
我正在使用nltk中的pos_tag来标记一组(未标记的)技术文档中的文本并获得良好的结果,但是当有时可以将其用作形容词时,它总是将诸如“
authenticated”之类的词标记为动词。换句话说,简单地更改标签并非每次都有效。
有没有一种好的方法可以根据上下文覆盖或更正标记结果?
问题答案:
不幸的是,您的问题归结为“我该如何改善我的标记?”。答案是,您需要构建更好的标记器。所有非平凡的标记器都考虑了上下文,因此这不仅仅是增加上下文敏感性的问题;它已经存在,在某些情况下只是失败了。
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标记器(也许通过将两个标记器链接在一起)。