我正在尝试使用scikit-learn的监督学习方法之一将文本片段分类为一个或多个类别 . 我尝试的所有算法的预测函数只返回一个匹配 .
例如,我有一段文字:
"Theaters in New York compared to those in London"
我已经训练了算法为我提供的每个文本片段选择一个地方 .
在上面的例子中,我希望它返回 New York
和 London
,但它只返回 New York
.
是否可以使用scikit-learn返回多个结果?或者甚至以最高概率返回标签?
谢谢你的帮助 .
---更新
我尝试使用 OneVsRestClassifier
但我仍然只得到每个文本一个选项 . 下面是我正在使用的示例代码
y_train = ('New York','London')
train_set = ("new york nyc big apple", "london uk great britain")
vocab = {'new york' :0,'nyc':1,'big apple':2,'london' : 3, 'uk': 4, 'great britain' : 5}
count = CountVectorizer(analyzer=WordNGramAnalyzer(min_n=1, max_n=2),vocabulary=vocab)
test_set = ('nice day in nyc','london town','hello welcome to the big apple. enjoy it here and london too')
X_vectorized = count.transform(train_set).todense()
smatrix2 = count.transform(test_set).todense()
base_clf = MultinomialNB(alpha=1)
clf = OneVsRestClassifier(base_clf).fit(X_vectorized, y_train)
Y_pred = clf.predict(smatrix2)
print Y_pred
结果:['纽约''伦敦''伦敦']
5 回答
编辑:根据建议使用MultiLabelBinarizer更新了Python 3,scikit-learn 0.18.1 .
我也一直在研究这个问题,并对mwv的优秀答案做了一些改进,这些答案可能很有用 . 它将文本标签作为输入而不是二进制标签,并使用MultiLabelBinarizer对其进行编码 .
这给了我以下输出:
您想要的是多标签分类 . Scikits-learn可以做到这一点 . 见这里:http://scikit-learn.org/dev/modules/multiclass.html .
我不确定你的例子中出了什么问题,我的sklearn版本显然没有WordNGramAnalyzer . 也许这是一个使用更多训练样例或尝试不同分类器的问题?虽然请注意多标签分类器期望目标是元组/标签列表的列表 .
以下为我工作:
对我来说,这会产生输出:
希望这可以帮助 .
更改此行以使其在新版本的python中工作
我也遇到了这个问题,对我来说问题是我的y_Train是一系列字符串,而不是一系列字符串序列 . 显然,OneVsRestClassifier将根据输入标签格式决定是使用多类还是多标签 . 所以改变:
至
显然,这将在将来消失,因为它的所有标签都是相同的:https://github.com/scikit-learn/scikit-learn/pull/1987
很少有多个分类示例如下: -
例1: -
输出是
例2: -
输出是