短文本分类总结

一:分词

1、常用中文分词工具:jieba、SnowNLP(MIT)、pynlpir、thulac, 其中jieba比较常用

2、去除停用词

这个主要需要导入并构建停用词表,然后删除分词结果中停用词表中的词。简单说就是删除一些语气词了,这些词语并不能有效的代表句子的特征。

3、特征提取

中文分词和去除停用词后,需要对分词结果进行文本特征提取,常用的传统方法有:TFIDF,信息增益法,词频法,X^2统计法,互信息等等。

from sklearn import feature_extraction  
from sklearn.feature_extraction.text import TfidfTransformer  
from sklearn.feature_extraction.text import CountVectorizer  
  
if __name__ == "__main__":  
    corpus=["我 来到 北京 清华大学",#第一类文本切词后的结果,词之间以空格隔开  
        "他 来到 了 网易 杭研 大厦",#第二类文本的切词结果  
        "小明 硕士 毕业 与 中国 科学院",#第三类文本的切词结果  
        "我 爱 北京 天安门"]#第四类文本的切词结果  
    vectorizer=CountVectorizer()#该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频  
    transformer=TfidfTransformer()#该类会统计每个词语的tf-idf权值  
   tfidf=transformer.fit_transform(vectorizer.fit_transform(corpus))#第一个fit_transform是计算tf-idf,第二个
代码中有一个地方需要注意,此时变量tfidf是使用稀疏矩阵的存储方式来节省内存,如果需要得到矩阵形式的表示的话,需要使用tfidf.toarray()来获得,当数据量特别大的时候慎用,很容易内存就爆了。
IG的代码就不放上来了。见这个帖子就好了http://eip.teamshub.com/t/3313542。有一个小点说明下,帖子中附的论文使用TFIDFIG来改善效果,但是在短文本情况下效果不大。因为通常来说得到的特征矩阵过于稀疏,简单说是本来TFIDF矩阵中很多都是零。你再乘个IG(特征词的信息增益)的值,也还是零,对结果影响不大。代码的实现也可以使用gensim库实现,gensim是一个非常完备的文本相关的Python库。地址https://radimrehurek.com/gensim/


3、这时候样本特征矩阵就构建好了,可以使用一些传统的分类器进行分类预测了,比如LR,NB,SVM,RF等等。下面写一个logistics的例子,其他的类似,就是参数选择不同而已,可以查看sklearn官方文档的用法:

文本挖掘引入词嵌入思想方法讲述
1、主要概念:
新方法和传统方法的主要区别就是新方法引入了word embedding的思想。简单说就是打破了原版传统方法把一个个特征词作为独立特征的情况,原传统方法的处理,将一个个分词结果作为一个个特征词来处理,其实默认假设了词之间的独立。但其实现实中的语句中,词之间通常是存在一定的联系的。1986年HINTON第一次提出了词的分布式表示,将词作为一个个等长的向量来表示。
2003年Bengio《A Neural Probabilistic Language Model》的文章提出了神经网络语言模型,可以词进行分布式表示,将一个个词表示为等长的向量,用于后续的语义分析。但是由于其提出的网络结构存在隐层,且在处理多个输入词的投影层中采用了拼接的方式,导致向量长度过长,进行网络参数学习的BP时计算量偏大。所以在2013年Google 的 Tomas Mikolov 在《Efficient Estimation of Word Representation in Vector Space》提出了word2vec,对其进行了改进,提出了一个简单的三层神经网络,是一种语言模型的浅层神经网络表示方式。主要区别是在输入理多个层处词向量时采用的是相加的方式,这样使得向量的长度急剧减少,而且在输出层采用了根据词频构建的霍夫曼树作为输出,切高频词位于树的浅层,可以有限减少寻找次数,采用霍夫曼树+softmax层作为加速技巧,使得训练速度加快了很多。本地测试过程,在语料不大的情况下,训练时间都小于5分钟。当然其也存在一定的问题,就是越简单的模型就越需要更多的数据,才能表现的更好,而复杂的模型可以在小数据上表现不错。所以该方法,通常在大量预料下能表现不凡。之后更是开源了该项目,为文本分析提供了强大的工具。通过gensim也可以高效的调用word2vec方法,通过word2vec可以学习到词的表达方法,处理之后每一个词可以表示为一个个同维的向量。word2vec的学习方法主要有两种,分别是CBOW和Skip-Gram,简单说就是CBOW方法是通过上下文来推断出这个词的表达,Skip-Gram则相反,是通过这个的词来推断他的上下文。详见http://www.jmlr.org/papers/volume3/bengio03a/bengio03a.pdf和http://blog.csdn.net/wangyangzhizhou/article/details/77073023
https://zhuanlan.zhihu.com/p/26306795
https://www.zybuluo.com/Dounm/note/591752
实例:
​#导入word2vec模块
from gensim.models import Word2Vec
#训练word2vec模型
model = Word2Vec(LineSentence('word2vec.txt'),min_count=1,size=200,iter=10)
#获取每个词和其表征向量
w2v = dict(zip(model.wv.index2word, model.wv.syn0))
通常来说在该方法在大量语料的时候能获得更好的效果,word2vec.txt是每条记录的分词结果,分词结果用空格隔开,每条记录用回车区分,如:
踢 下线 国际社区支局
合同号 推送 电子发票 可否 天宫殿支局
回不了笼 普子支局
在训练之后,可以先把模型保存下来再导入,如:
model.save('word2vec')
model = Word2Vec.load('word2vec')
在获得了每个词的词向量表达之后主要就是要通过不同的方法来构建句向量了,各种不同方法的讨论可以见论文《基于机器学习的汉语短文本分类方法研究与实现 》,文章中引入了深度学习中pooling层的方法,将处理之后的句向量可以作为特征尝试使用传统的分类器进行学习,也可以导入LSTM等深度学习模型进行尝试。fasttext也是一个用于文本挖掘的库,作者和word2vec是同一个人。fasttext相当于是在word2vec的CBOW训练的词向量的基础上加了一个,softmax层来计算得出各类别的概率,最后得出所属类别。
fasttext可以参见资料:《Bag of Tricks for Efficient Text Classification》和一些CSDN上的相关博客


2、深度学习方法
使用深度学习的方法来做文本分类网上也很多资料了。CNN 和RNN都可以做,如果把一个一个词看成存在某种时序,序列的一种数据的输入。使用RNN来做是比较好的,其可以通过memory cell来捕获上一时刻和当前时刻的信息,大部分实验结果也表明在文本上面RNN表现更佳。而在RNN网络中可以考虑使用LSTM来进行模型的训练,当然具体还要看实际的业务场景。

猜你喜欢

转载自blog.csdn.net/erinapple/article/details/80537963