?最近筆者在做文本挖掘項目時候,寫了一些小演算法,不過寫的比較重,沒有進行效率優化,針對大數據集不是特別好用,不過在小數據集、不在意性能的情況下還是可以用用的。
本次練習題中可以實現的功能大致有三個:
短語發現、新詞發現跟詞共現有些許區別:
[『舉』,個,『例子』,『來說』]
- 短語發現、新詞發現,是詞-詞連續共現的頻率,窗口範圍為1,也就是:『舉』,『例子』;個,『例子』;『例子』,『來說』,探究挨得很近的詞之間的關係
- 詞共現是詞-詞離散出現,詞共現包括了上面的內容,探究:『舉』,『來說』,不用挨著的詞出現的次數
code可見我的github:mattzheng/LangueOne
一、數據集介紹
練習數據來源:今日頭條中文新聞(文本)分類數據集
今日頭條是最近開源的數據集,38w,其中的數據格式為:
6552391948794069256_!_106_!_news_house_!_新手買房,去售樓部該如何諮詢?_!_
6552263884172952072_!_106_!_news_house_!_南京90後這麼有錢嗎?南京百分之四五十都是小杆子買了_!_公積金,江寧,麒麟鎮,南京90後,大數據
6552313685874835726_!_106_!_news_house_!_漲價之前買房的人,現在是什麼心情?_!_
6552447172724392456_!_106_!_news_house_!_這種凸陽台房子萬萬不要買,若不是售樓閨蜜說,我家就吃大虧_!_凸陽台,售樓,買房
每行為一條數據,以_!_分割的個欄位,從前往後分別是 新聞ID,分類code(見下文),分類名稱(見下文),新聞字元串(僅含標題),新聞關鍵詞
二、短語發現、新詞發現演算法介紹
2.1 理論介紹
短語發現、新詞發現,內容與演算法基礎源於該博客:基於凝聚度和自由度的非監督詞庫生成
評估詞之間的幾個指標,出了頻率還有:
該詞語為S,首先計算該詞語出現的概率P(S),然後嘗試S的所有可能的二切分,即分為左半部分sl和右半部分sr並計算P(sl)和P(sr),
例如雙漢字詞語存在一種二切分、三漢字詞語存在兩種二切分。接下來計算所有二切分方案中,P(S)/(P(sl)×P(sr))的最小值,取對數之後即可作為聚合度的衡量。 以雙漢字詞語為例,可以想像到,如果該詞語的聚合度很低,說明其第一個字和第二個字的相關性很弱,甚至是不相關的,那麼P(S)和P(sl)×P(sr)將處於同一個數量級。 相反,如果該詞語的聚合度很高,「齊天」、「大聖」和「齊天大聖」三者的概率都很接近,因此P(S)/(P(sl)×P(sr))將是一個遠大於1的數值。
用熵來衡量一個詞語的自由度。假設一個詞語一共出現了N次,其左邊共出現過n個漢字,每個漢字依次出現N1,N2,……,Nn次,則滿足N = N1 + N2 + …… + Nn,因此可以計算該詞語左邊各個漢字出現的概率,
並根據熵公式計算左鄰熵。熵越小則自由度越低,例如「天大聖」的左鄰熵接近於0,因為「齊」字的概率幾乎為1;熵越大則自由度越高,表示用詞搭配越混亂、越自由、越多樣。
因為「天大聖」的左鄰熵很小,而右鄰熵則相對較大,因此我們將一個詞語左鄰熵和右鄰熵中較小者作為最終的自由度。
逆文檔詞頻
2.2 主函數參數
演算法的參數描述:
class termsRecognition(object):
def __init__(self, content=, topK=-1, tfreq=10, tDOA=0, tDOF=0, is_jieba= False,mode = [1]):
其中的參數::
- content: 待成詞的文本
- maxlen: 詞的最大長度
- topK: 返回的詞數量
- tfreq: 頻數閾值
- tDOA: 聚合度閾值
- tDOF: 自由度閾值
- mode:詞語生成模式,一共四種模式,其中第二種模式比較好,一定要寫成[1]
- diction:字典,第一批Jieba分詞之後的內容
- idf_diction:在第一批字典之後,又生成一批tuple words 的idf,計算方式是,兩個詞語的平均
- punct:標點符號,Jieba分詞之後刪除
演算法步驟:
- jieba_tuples_generator, 利用Jieba分詞,並去除標點符號,去除清除(寫入self.jieba_content),利用wordsGenerator函數生成詞語對(四種模式)(寫入self.tuple_content)
- word_get_frequency_idf,計算freq 以及貼idf,同時生成left/right框,把詞語對(self.tuple_content))寫入result( 主要寫入部分)
- get_doa:只輸入result,計算數據的doa,直接更新result中的[doa]
- word_get_dof:只輸入result,計算數據的dof,直接更新result中的[dof],左熵的文字,右熵的文字
- get_score,只輸入result,更新result中的[scores]
可用的函數:
- get_idf,文檔的IDF計算
- wordsGenerator,生成詞語對
- get_entropy計算左、右熵值,填充result
三、詞共現演算法介紹
就是計算詞語共同出現的概率,一般用在構建詞條網路的時候用得到,之前看到這邊博客提到他們自己的演算法:《python構建關鍵詞共現矩陣》看著好麻煩,於是乎自己簡單寫了一個,還是那個問題....效率比較低...
之前一般的做法是先生成一個基於詞-詞矩陣,然後去累計詞-詞之間的出現次數。