1. 程式人生 > >短文字分類總結

短文字分類總結

一:分詞

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來進行模型的訓練,當然具體還要看實際的業務場景。