【发布时间】:2018-01-30 18:07:37
【问题描述】:
我正在学习 nltk 库中的 BigramTagger 类。我使用 nltk 附带的棕色语料库训练“部分句子”标注器。
我注意到,如果我在这个语料库上进行训练,然后从语料库的第一句话中标记几个单词,效果会很好。
from nltk.corpus import brown
from nltk.tag import BigramTagger
from nltk import word_tokenize
# Works completely fine:
brown_train = brown.tagged_sents(categories='news')
bigram_tagger = BigramTagger(brown_train)
print(bigram_tagger.tag(word_tokenize("that any irregularities took place")))
我们得到预期的输出:
[('that', 'CS'), ('any', 'DTI'), ('irregularities', 'NNS'), ('took', 'VBD'), ('place', ' NN')]
但如果我只训练 100 个句子,它就会失败。
# Fails to work:
brown_train = brown.tagged_sents(categories='news')[:100]
bigram_tagger = BigramTagger(brown_train)
print(bigram_tagger.tag(word_tokenize("that any irregularities took place")))
它没有标记这些词,所以它给了它们 None 标记:
[('that', None), ('any', None), ('irregularities', None), ('took', None), ('place', None)]
课程是否有最低语料库要求?还是有一些我忘记的其他参数导致模型在第二种情况下失败?
我在这里查看了文档:http://www.nltk.org/api/nltk.tag.html#nltk.tag.sequential.BigramTagger,看起来有一个截止参数,但默认设置为 0。
【问题讨论】:
-
通常,二元组标记器需要一元组才能工作,请参阅github.com/alvations/spaghetti-tagger/blob/master/…
-
我在这里指出的是一个不一致的地方,我的模型在大型数据集上训练时工作,但在子集上训练时失败,目前尚不清楚原因。
-
有趣,其实这是一个很好的问题!稍后有空会回答。
-
@alvas 如果你能回答这个问题,我会很高兴