微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在组合标记器中标记未知单词带有标记 UNK 的标记

如何解决如何在组合标记器中标记未知单词带有标记 UNK 的标记

我正在使用 nltk book - chapter 5

中描述的组合标记

这是代码

t0 = nltk.DefaultTagger('NN')

t1 = nltk.UnigramTagger(train_sents,backoff=t0)

t2 = nltk.BigramTagger(train_sents,backoff=t1)
 

由于标记器将每个标记标记NN,因此到达 t0 的每个标记都将被标记NN,因此他们说这可以通过以下方法解决

我们标记未知单词的方法仍然使用正则表达式标记器或标记器的退避。这些都无法利用上下文。因此,如果我们的标注器遇到单词 blog,在训练期间未见过,它会为其分配相同的标签,无论该单词出现在 blog 还是 to blog 的上下文中。我们如何更好地处理这些未知单词或词汇表外的项目?

根据上下文标记未知单词的一种有用方法是将标记器的词汇量限制为最频繁的 n 个单词,并使用 3 中所示的方法用特殊单词 UNK 替换所有其他单词强>。在训练期间,unigram 标注器可能会了解到 UNK 通常是一个名词。但是,n-gram 标注器将检测它具有其他标签的上下文。例如,如果前面的单词是 to(标记为 TO),则 UNK 可能会被标记为动词。

我编写了 3 中所示的方法,将每个单词映射到 UNK

>>> alice = nltk.corpus.gutenberg.words('carroll-alice.txt')
>>> vocab = nltk.Freqdist(alice)
>>> v1000 = [word for (word,_) in vocab.most_common(1000)]
>>> mapping = defaultdict(lambda: 'UNK')
>>> for v in v1000:
...     mapping[v] = v
...
>>> alice2 = [mapping[v] for v in alice]
>>> alice2[:100]
['UNK','Alice',"'",'s','UNK','in','by','CHAPTER','I','.','the','Rabbit','-','was','beginning','to','get','very','tired','of','sitting','her','sister','on',','and','having','nothing','do',':','once','or','twice','she','had','into','book','but','it','no','pictures','what','is','use','a',",'",'thought','without','conversation',"?'" ...]
>>> len(set(alice2))
1001

我的问题是我们如何在组合标记器中实现这种方法?我应该将新的映射字典(在本例中为 mapping)放在组合标记器中的什么位置?

解决方法

您应该替换标签,而不是单词本身。根据您共享的代码,类似于

mapped_unk = [(w[0],'UNK') if i%2 else (w[0],w[1]) for i,w in enumerate(tagged)]

我假设 taggedalice 的标记版本,这样每个输入 word 都被映射到一个元组 (word,tag)[('Alice','NN'),('tagged','VT'),('her','PRON'),('corpus','N'),('.','PUNC')](有一些围绕您的标记约定进行猜测)。

nltk 有用于标记一段文本的例程,但如果您能找到经过人工审查的标记文本进行训练就更好了;所包含的语料库中有许多这样的文本。标记的训练集显然应该使用您希望训练的标记器学习的标记约定(标记集、标记化等);显然,如果您无法手动生成足够大的标记语料库来满足您的首选约定,那么可用于训练的标记语料库的可用性将限制您的选择。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。