继上期文本特征提取一文以及文本的可读性探究后,继续推出文本特征提取二,从词集型、词袋型提取文本特征。
文本特征提取有两个非常重要的模型:
词集模型:仅关注某个单词有/没有
词袋模型:统计单词的出现次数
.
01 词集模型(Set Of Words SOW)
下图是一个典型的词集特征提取的解释:数据集A[['i love you'],['me too'],['i me too']]涉及5个单词{‘i,'love','you','me','too'}将每个单词赋予一个编号{1,2,3,4,5}。
因此数据集A的词集特征提取后,结果为[[1,2,3],[4,5],[1,4,5]],可用于训练模型。
from tensorflow.contrib.learn.python import learn
from sklearn.naive_bayes import GaussianNB
from sklearn import svm
from sklearn.neural_network import MLPClassifier
# x为每个文本的字符串list:[[文本1],[文本2],...]
# y 为标签结果:[0,1,1,0,0,1,...]
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.4, random_state=0)
# 只读取前350的内容
MAX_DOCUMENT_LENGTH = 350
vp = learn.preprocessing.VocabularyProcessor(max_document_length=MAX_DOCUMENT_LENGTH)
x_train = np.array(list(vp.fit_transform(x_train)))
x_test = np.array(list(vp.transform(x_test)))
# 以上词集法特征提取完成,开始训练模型
# 朴素贝叶斯
gnb = GaussianNB()
y_predict = gnb.fit(x_train, y_train).predict(x_test)
score = metrics.accuracy_score(y_test, y_predict)
print('NB Accuracy: {0:f}'.format(score))
print(metrics.confusion_matrix(y_test, y_predict))
# 支持向量机SVM
clf = svm.SVC()
clf.fit(x_train, y_train)
y_predict = clf.predict(x_test)
score = metrics.accuracy_score(y_test, y_predict)
print('SVM Accuracy: {0:f}'.format(score))
print(metrics.confusion_matrix(y_test, y_predict))
# 多层感知机
clf = MLPClassifier()
clf.fit(x_train, y_train)
y_pred = clf.predict(x_test)
print('MLP Accuracy:'+ str(metrics.accuracy_score(y_test, y_pred)))
print(metrics.confusion_matrix(y_test, y_pred))
以某数据集的训练结果为例:正常样本1013个,模型识别结果全部为正常样本;异常样本76个,模型识别结果为2个误判为正常样本,74个判断为异常样本,识别准确率为99%。
支持向量机 | 贝叶斯 | 多层感知机 |
---|---|---|
.
02 词袋模型(Bag of Words, BOW)
词袋模型可以分为两类。
一类是直接统计单词出现的次数,另一类TF-IDF统计单词的‘重要程度’。详细计算可以参考词袋特征介绍,情感分析之词袋模型TF-IDF算法(三)
依旧以某次训练结果为例
词频统计:在词频特征提取下,多层感知机对异常样本的识别效果不是很好。
支持向量机 | 贝叶斯 | 多层感知机 |
---|---|---|
TF-IDF特征提取模式下,多层感知机和支持向量机对异常样本的识别几乎是失效的,但贝叶斯识别显示出惊人的效果。
支持向量机 | 贝叶斯 | 多层感知机 |
---|---|---|
03 改善方法
特征提取本身没有问题,建议处理原始文件的内容,把一些无用的数字,分隔符,无意义单词等等去除,然后再采用词集法/词袋法特征提取,模型训练结果应该会好一些。