我们可以用哪个标签来做未来的数据?代码是用python编写的

2024-09-28 23:08:47 发布

您现在位置:Python中文网/ 问答频道 /正文

    import nltk
import math
from nltk.corpus import brown

brown_tagged_sents = brown.tagged_sents(categories='news')
size = int(math.floor(.9 * len(brown_tagged_sents)))
brown_tagged_0 = brown_tagged_sents[size:]
brown_tagged_1 = brown_tagged_sents[:size]

t0 = nltk.DefaultTagger('NN')
unigram_tagger_0 = nltk.UnigramTagger(brown_tagged_0,backoff=t0)
bigram_tagger_0 = nltk.BigramTagger(brown_tagged_0,backoff=unigram_tagger_0)


unigram_tagger_1 = nltk.UnigramTagger(brown_tagged_1,backoff=t0)
bigram_tagger_1 = nltk.BigramTagger(brown_tagged_1,backoff=unigram_tagger_1)

eval_A = bigram_tagger_0.evaluate(brown_tagged_0)
eval_B = bigram_tagger_0.evaluate(brown_tagged_1)
eval_C = bigram_tagger_1.evaluate(brown_tagged_0

我试着理解塔格的全部含义。在上面的代码中,我们将使用哪个标记器作为将来的数据,以及为什么? Eval_A和Eval_B是对同一标记器的两种不同评估。你能解释为什么评价分数越高吗?评估A是 出[7]:0.98096262685139 评估值B不在[9]:0.704168093591542


Tags: importsizeevalmathtaggerevaluatebackoffnltk
1条回答
网友
1楼 · 发布于 2024-09-28 23:08:47

首先,分割语料库的原因是为了保留一些数据,以便评估标记者。因此,不应使用保留数据来训练标记者。

from nltk import UnigramTagger, BigramTagger, DefaultTagger
from nltk.corpus import brown

brown_news = brown.tagged_sents(categories='news')
trainsize = len(brown_news) * 90 / 100

train = brown_news[:trainsize]
test = brown_news[trainsize:]

也有一些评估方法考虑到了整个数据而不需要坚持,请参见http://en.wikipedia.org/wiki/Cross-validation_(statistics)

然后仅使用训练数据训练标记器,并仅使用测试数据进行评估。你知道吗

from nltk import UnigramTagger, BigramTagger, DefaultTagger
from nltk.corpus import brown

brown_news = brown.tagged_sents(categories='news')
trainsize = len(brown_news) * 90 / 100

train = brown_news[:trainsize]
test = brown_news[trainsize:]

tagger0 = DefaultTagger('NN')
unitag = UnigramTagger(train, backoff=tagger0)
bitag = BigramTagger(train, backoff=unitag)

print tagger0.evaluate(test)
print unitag.evaluate(test)
print bitag.evaluate(test)

[输出]:

0.126283265225
0.835044353633
0.844712448919

现在您可以看到,使用默认标记器(tagger0)会降低精度,而使用unigram和bigrams会得到更好的结果。你知道吗

相关问题 更多 >