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

2024-07-04

我使用 nltk 中的 pos_tag 来标记一组(未标记的)技术文档中的文本并获得良好的结果,但它总是将“authenticated”等单词标记为动词,而有时它可以用作形容词。换句话说,仅仅改变标签并不是每次都有效。

是否有一个好方法来覆盖或纠正考虑上下文的​​标记结果?


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

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 标记器(可能通过将两个标记器链接在一起)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何覆盖 nltk 的 pos_tag 分配给文本的 POS 标签? 的相关文章

随机推荐