scikitlearn使bigram适应svm

时间:2017-04-03 23:19:31

标签: python nltk svm

我有问题。这是我的代码。 http://colorscripter.com/s/9vc2ryj

我错了。 evaluate_classifier(bigram_word_feats)就是我想要的。

我正在尝试通过SVM进行文本挖掘。 特征向量是二元模型。 但是我遇到了一个问题:

Traceback (most recent call last):
File "C:/Users/LG/Desktop/untitled1/TEST.py", line 184, in <module>
evaluate_classifier(bigram_word_feats)
File "C:/Users/LG/Desktop/untitled1/TEST.py", line 90, in evaluate_classifier
classifier.train(trainfeats)
File "C:\Users\LG\Anaconda3\lib\site-packages\nltk\classify\scikitlearn.py", line 115, in train
X = self._vectorizer.fit_transform(X)
File "C:\Users\LG\Anaconda3\lib\site-packages\sklearn\feature_extraction\dict_vectorizer.py", line 226, in fit_transform
return self._transform(X, fitting=True)
File "C:\Users\LG\Anaconda3\lib\site-packages\sklearn\feature_extraction\dict_vectorizer.py", line 190, in _transform
feature_names.sort()
TypeError: unorderable types: tuple() < str()

为什么会发生这种情况,我该如何解决? 什么是nltk分类器的过程? 把它放到我的专题词和句号中?然后它只生成svm模型?

哦,我正在使用python 3.我需要使用python 2吗?

1 个答案:

答案 0 :(得分:1)

新答案:

我认为问题在于nltk期望字符串由字符串而不是元组索引。您可以尝试替换return声明:

return dict([(ngram, True) for ngram in itertools.chain(words, bigrams)])

以下内容:

return dict([('|'.join (ngram), True) for ngram in itertools.chain(words, bigrams)])


旧答案:

<德尔> Scikit-learn预测器的`train`方法需要两个输入:特征和目标。类似于以下内容(未经测试):
negfeats = [featx(f) for f in word_split(negdata)]
posfeats = [featx(f) for f in word_split(posdata)]
...
trainlabels = [-1,] * negcutoff + [+1,] * poscutoff
classifier.train(trainfeats, trainlabels)

在定义trainlabels时,我遵循了在列表中使用算术运算符的风格,但我不会在代码中执行此操作,因为它使其不太可读。