文本特征提取(2)

继上期文本特征提取一文以及文本的可读性探究后,继续推出文本特征提取二,从词集型、词袋型提取文本特征。

文本特征提取有两个非常重要的模型:

词集模型:仅关注某个单词有/没有
词袋模型:统计单词的出现次数

.

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 改善方法

特征提取本身没有问题,建议处理原始文件的内容,把一些无用的数字,分隔符,无意义单词等等去除,然后再采用词集法/词袋法特征提取,模型训练结果应该会好一些。

你可能感兴趣的:(文本特征提取(2))