python - 当分类器从测试文件进行预测时,为什么会有额外的标签?

标签 python machine-learning nlp scikit-learn nltk

在之前的post中我询问了有关文本分类的问题,我想更好地了解正在发生的事情以及 scikit-learn 是如何工作的,假设 train.txt

Pošto je EULEX obećao da će obaviti istragu o prošlosedmičnom izbijanju nasilja na sjeveru Kosova, taj incident predstavlja još jedan ispit kapaciteta misije da doprinese jačanju vladavine prava.
De todas as provações que teve de suplantar ao longo da vida, qual foi a mais difícil? O início. Qualquer começo apresenta dificuldades que parecem intransponíveis. Mas tive sempre a minha mãe do meu lado. Foi ela quem me ajudou a encontrar forças para enfrentar as situações mais decepcionantes, negativas, as que me punham mesmo furiosa.
Al parecer, Andrea Guasch pone que una relación a distancia es muy difícil de llevar como excusa. Algo con lo que, por lo visto, Alex Lequio no está nada de acuerdo. ¿O es que más bien ya ha conseguido la fama que andaba buscando?
Vo väčšine golfových rezortov ide o veľký komplex niekoľkých ihrísk blízko pri sebe spojených s hotelmi a ďalšími možnosťami trávenia voľného času – nie vždy sú manželky či deti nadšenými golfistami, a tak potrebujú iný druh vyžitia. Zaujímavé kombinácie ponúkajú aj rakúske, švajčiarske či talianske Alpy, kde sa dá v zime lyžovať a v lete hrať golf pod vysokými alpskými končiarmi.

test.txt

Por ello, ha insistido en que Europa tiene que darle un toque de atención porque Portugal esta incumpliendo la directiva del establecimiento del peaje
Estima-se que o mercado homossexual só na Cidade do México movimente cerca de oito mil milhões de dólares, aproximadamente seis mil milhões de euros

我有这个小脚本可以执行语言识别:

# -- coding: utf-8 --
import codecs
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB

train = []

#We set the classes
tags = ['bos','pt','es','slov']

word_vectorizer = CountVectorizer(analyzer='word')


#vectorize the train and the test files
trainset = word_vectorizer.fit_transform(
    codecs.open('/Users/user/Desktop/train.txt','r','utf8'))

testset = word_vectorizer.transform(
    codecs.open('/Users/user/Desktop/test.txt','r','utf8'))

# We train the algorithm:
mnb = MultinomialNB()
mnb.fit(trainset, tags)
res = mnb.predict(testset)

print res

这是输出:['es' 'pt' 'bos']。输出的问题在于,显然在分类输出中添加了一个实际上错误的类(即 bos)。我想问题在于我如何标记 traintest 文件,所以我如何标记这两个文件以获得正确的结果?是:['es' 'pt']

现在我明白这两个文件都需要矢量化,但我不明白这里发生了什么:

mnb = MultinomialNB()
mnb.fit(trainset, tags)
res = mnb.predict(testset)

有人可以深入地向我解释一下脚本的上述部分发生了什么吗?

最佳答案

您的 test.txt 中有一个空行导致额外的输入

此行逐行读取 test.txt 并将每一行更改为特征向量:

testset = word_vectorizer.transform(
    codecs.open('/Users/user/Desktop/test.txt','r','utf8'))

额外的空行会导致额外的向量被最可能的标签标记。在训练数据 train.txt 中,所有标签都是同等可能的,因此空行将采用第一个标签。

关于python - 当分类器从测试文件进行预测时,为什么会有额外的标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26943405/

相关文章:

可以显示图表表示的 Python IDE

python - 使用字典将列添加到数据框

python - 在 Pandas 中分组和转换数据

machine-learning - 赫布学习

python - 如何在 Python 中计算逻辑 sigmoid 函数?

python - 网格搜索中带有第三个参数的自定义记分器

matlab - 如何将K-mean算法应用于多维数组?

machine-learning - 在 NLP/概率/ML 表示法中 : what does a tilde over a letter mean?

algorithm - 除了 Levenshtein 之外,用于有序词集和后续聚类的更好的距离度量

python - 用python NLTK转换否定句中的语句