为什么分类器从测试文件中预测时会有额外的标签?

时间:2014-11-15 06:56:44

标签: 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文件,那么我如何标记这两个文件以获得正确的结果?,即:{{1} }。

到目前为止,我知道这两个文件都需要进行矢量化,但我不明白这里发生了什么:

['es' 'pt']

有人能够深入解释我脚本上方发生的事情吗?。

2 个答案:

答案 0 :(得分:2)

您的test.txt

中有一个空行会导致额外输入

此行逐行读取test.txt并将每一行更改为您的要素向量:

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

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

答案 1 :(得分:1)

我做了一些文本分类和Scikit

的工作
mnb = MultinomialNB()        # Multinomial NB is initialized
mnb.fit(trainset, tags)      # Learning is done of the algorithm
res = mnb.predict(testset)   # Prediction is done with the trainset

我不知道你为什么会在预测中得到更多的那条记录。 以及编解码器模块正在工作的编解码器。 你可以为每行读取设置标签,这有点尴尬。

恕我直言,你应该使用停用词,通过使用它们,你将排除很多"垃圾"。
查看更多Scikit文档,以及有关互联网上矢量化的资料。

相关问题