在之前的一篇帖子中,我询问了关于文本分类的内容,我希望能更好地理解其中的原理以及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 peajeEstima-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 codecsfrom sklearn.feature_extraction.text import CountVectorizerfrom sklearn.naive_bayes import MultinomialNBtrain = []#我们设置类别tags = ['bos','pt','es','slov']word_vectorizer = CountVectorizer(analyzer='word')#向量化训练和测试文件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'))#我们训练算法:mnb = MultinomialNB()mnb.fit(trainset, tags)res = mnb.predict(testset)print res
这是输出结果:['es' 'pt' 'bos']
。输出结果的问题在于显然多了一个错误的类别(即bos
)。我猜问题出在我是如何标记train
和test
文件的,那么,我该如何标记这两个文件以获得正确的结果,即:['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
中,所有标签的可能性是相等的,所以空行会采用第一个标签。