将表情符号合并到scikit模型中

时间:2013-07-16 10:47:25

标签: python scikit-learn emoticons

我正在使用scikit在文本数据集上训练SVM分类器。该文档适用于使用计数向量化器来构造使用n-gram的特征向量。例如,对于unigrams和bigrams,我可以做类似的事情:

   CountVectorizer(ngram_range(1,2))  

但是,我不确定你会如何将表情符号构建到特征向量中?似乎有两个可用的选项 - 使用与表情符号匹配的正则表达式并将其输入

token_pattern

CountVectorizer的参数,或构建包含表情符号的自定义词汇表,并将其输入

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)

呼。希望有所帮助。

1 个答案:

答案 0 :(得分:2)

这两个选项都应该有用。

还有第三个选项,即手动标记您的样本并将其提供给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,你必须建立自己的双字母。