文本處理方法概述
說明:本篇以實踐為主,理論部分會盡量給出參考鏈接
摘要:
1.分詞
2.關鍵詞提取
3.主題模型(LDA/TWE)
4.詞的兩種表現形式(詞袋模型和分布式詞向量)
5.關於文本的特征工程
6.文本挖掘(文本分類,文本用戶畫像)
內容:
1.分詞
分詞是文本處理的第一步,詞是語言的最基本單元,在后面的文本挖掘中無論是詞袋表示還是詞向量形式都是依賴於分詞的,所以一個好的分詞工具是非常重要的。
這里以python的jieba分詞進行講解分詞的基本流程,在講解之前還是想說一下jieba分詞的整個工作流程:
圖1是jieba切詞函數的4個可能過程,圖2是一個根據DAG圖計算最大概率路徑,具體的代碼走讀請參考jieba cut源碼
講了這么多,我們還是要回歸到實踐中去,看下jieba的分詞接口
1 # encoding=utf-8 2 import jieba 3 4 seg_list = jieba.cut("我來到北京清華大學", cut_all=True) 5 print("Full Mode: " + "/ ".join(seg_list)) # 全模式 9 10 seg_list = jieba.cut("他來到了網易杭研大廈") # 默認是精確模式 11 print(", ".join(seg_list)) 12 13 seg_list = jieba.cut_for_search("小明碩士畢業於中國科學院計算所,后在日本京都大學深造") # 搜索引擎模式 14 print(", ".join(seg_list))
【全模式】: 我/ 來到/ 北京/ 清華/ 清華大學/ 華大/ 大學 【精確模式】: 他, 來到, 了, 網易, 杭研, 大廈 (此處,“杭研”並沒有在詞典中,但是也被Viterbi算法識別出來了) 【搜索引擎模式】: 小明, 碩士, 畢業, 於, 中國, 科學, 學院, 科學院, 中國科學院, 計算, 計算所, 后, 在, 日本, 京都, 大學, 日本京都大學, 深造
其中全模式切詞不會發生圖1中的第3,4步,也不會發現新詞,是一種完全依賴於詞典的分詞方式
精確模式是會全部計算最大概率路徑和新詞發現的。
我們都知道分詞最重要的是字典,所以jieba也提供了若干方法對詞典進行設置:
jieba.load_userdict(file_name) # file_name 為文件類對象或自定義詞典的路徑 #詞典文件舉例: #創新辦 3 i #雲計算 5 #凱特琳 nz #台中 add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中動態修改詞典。 suggest_freq(segment, tune=True) 可調節單個詞語的詞頻,使其能(或不能)被分出來
2.關鍵詞提取
文本被分詞之后和數據處理一樣,也會有如下兩個問題:
其一,並不是所有的詞都是有用的;其二,一個語料庫的詞量是非常大的,傳統的文本挖掘方法又是基於向量空間模型表示的,所以這會造成數據過於稀疏。
為了解決這兩個問題一般會進行停用詞過濾和關鍵字提取,而后者現有基於頻率的TF-IDF計算方法和基於圖迭代的TextRank的計算方法兩種。下面看看這兩種方法是怎么工作的
這里TF表示詞在文章中的重要性,因為我們知道一個文章的主題一多次出現;IDF表示詞的區分度,因為專業詞匯在整個語料庫中出現越少,越能關聯文章主題。具體來說就是信息熵越低。
圖1是一個文章的上下文詞構造的無向加權圖(UWG),圖2是葉結點的權重迭代公式,其中d是阻尼系數。可見textRank認為一個節點如果入度多且權重大,那么這個節點越重要。
具體理論和代碼走讀參考: 關鍵詞抽取源碼,TextRank: Bringing Order into Texts;下面我們就動手試試吧!
import jieba.analyse #設置停詞表路徑 jieba.analyse.set_stop_words(file_name) # file_name為自定義語料庫的路徑 #默認tfidf提取關鍵詞 jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=()) #sentence 為待提取的文本 #topK 為返回幾個 TF/IDF 權重最大的關鍵詞,默認值為 20 #withWeight 為是否一並返回關鍵詞權重值,默認值為 False #allowPOS 僅包括指定詞性的詞,默認值為空,即不篩選 jieba.analyse.TFIDF(idf_path=None) #新建 TFIDF 實例,idf_path 為 IDF 頻率文件 #textrank提取關鍵詞 jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'))
上面jieba的TFIDF是通過需要指定IDF文件預先指定詞的IDF值的,同時textrank中比較重要的參數有一個上下文窗口。jieba通過了這兩個方法讓我們篩選出前多少個關鍵詞。然而sklearn提供了一種構建文檔詞矩陣(稀疏矩陣)的方法,可以讓我們直接構建文本訓練集。
>>> from sklearn.feature_extraction.text import TfidfVectorizer >>> vectorizer = TfidfVectorizer() >>> vectorizer.fit_transform(corpus) ... <4x9 sparse matrix of type '<... 'numpy.float64'>' with 19 stored elements in Compressed Sparse ... format>
待續~~~