我正在使用scikit在文本数据集上训练SVM分类器。该文档非常适合使用计数矢量器来使用n-gram构建特征向量。例如,对于unigram和bigram,我可以做一些类似的事情:
CountVectorizer(ngram_range(1,2))
然而,我不确定你会如何在特征向量中构建表情符号?似乎有两个可用的选项-要么使用与表情符号匹配的正则表达式,然后将其输入
token_pattern
参数,或者构建一个包含表情符号的自定义词汇表,并将其输入
vocabulary
论点。任何建议,特别是一个简单的例子,都会很棒!!此外,如果我遗漏了任何其他关键信息,请告诉我。。
编辑:我的解决方案
在对上述问题进行了一些实验之后,这是对我有效的代码
training_data, training_labels, test_data, test_labels
我们使用CountVectorizer,所以首先导入:
from sklearn.feature_extraction.text import CountVectorizer
c_vect = CountVectorizer()
然后构建一个表情符号列表作为数组。(我从网上的文本转储中得到了我的列表):
emoticon_list = [ ':)', ':-)', ':(' .... etc. - put your long list of emoticons here]
接下来,将CountVectorizer与表情符号数组相匹配。关键是要使用fit,而不是fit_transform:
X = c_vect.fit(emoticon_list)
然后,通过使用转换方法计算训练数据中表情符号的数量(在我的情况下,是推特的数组)来构建一个特征向量:
emoticon_training_features = c_vect.transform(training_data)
现在,我们可以使用标签和我们新的表情符号特征向量来训练我们的分类器clf(记住,对于某些分类器,如SVC,您需要首先将字符串标签转换为适当的数字):
clf.fit(emoticon_training_features, training_labels)
然后,为了评估分类器的性能,我们必须转换测试数据,以利用可用的表情符号特征:
emoticon_test_features = c_vect.transform(test_data)
最后,我们可以执行我们的预测:
predicted = clf.predict(emoticon_test_features)
完成。在这一点上,评估性能的一种相当标准的方法是使用:
from sklearn.metrics import classification_report
print classification_report(test_labels, predicted)
Phew。希望能有所帮助。
这两个选项都应该有效。
还有第三种选择,那就是手动标记样本,并将它们提供给DictVectorizer
而不是CountVectorizer
。使用最简单的令牌化器str.split
:的示例
>>> from collections import Counter
>>> from sklearn.feature_extraction import DictVectorizer
>>> vect = DictVectorizer()
>>> samples = [":) :) :)", "I have to push the pram a lot"]
>>> X = vect.fit_transform(Counter(s.split()) for s in samples)
>>> X
<2x9 sparse matrix of type '<type 'numpy.float64'>'
with 9 stored elements in Compressed Sparse Row format>
>>> vect.vocabulary_
{'a': 2, ':)': 0, 'I': 1, 'to': 8, 'have': 3, 'lot': 4, 'push': 6, 'the': 7, 'pram': 5}
>>> vect.inverse_transform(X[0]) # just for inspection
[{':)': 3.0}]
然而,使用DictVectorizer
,您必须构建自己的bigram。