2014年7月16日 星期三

[Python] 土砲N-GRAM(文字探勘、文本分析工具)演算法大升級! 加入長詞優先法與斷句系統


        上次很簡單做的N-gram演算法其實有幾個明顯缺點:
1. 標點符號一起加入計算
2. 有些字詞屬於長詞中的一部分,例如"拉熊"是"拉拉熊"的部分,兩者會重複計算,但其實"拉拉熊"才有意義
3. 中英數混合文章無法取得有意義分析

        本次的更新重點在於:
1. 以標點符號來切割句子,取得更有意義的結果
2. 以"長詞優先法"來優先計算詞句出現的次數,並刪除子詞




        演算法分為下列幾塊:
        第一部分:這部分主要是要用標點符號切割句子。

這次更新將載入檔案放到cutSentence這個方法中,因為將來我們會根據字詞長度重覆讀取檔案,所以才做這樣的處理。
另外一個keywords的方法需要傳入一個關鍵字矩陣,將來會傳入計算出的長詞,並且把長詞刪掉,避免重覆計算的情況。

        第二部分:這部分是N-GRAM演算法核心,和之前版本沒有差異

        第三部分:整合性的function,透過重覆呼叫第一塊和第二塊來計算不同長度詞的數量

這邊加入兩個變項分別用來儲存長詞和長詞+數量,被儲存的長詞會傳到第一部分的funcion中,來刪除篩選出來的長詞,避免長詞重覆的情況。可以透過參數maxTermLength,來決定最長要取到多少個字的詞,並且透過參數minFreq來決定出現的次數最少要達到幾次

最後附上完整的程式碼以及執行結果,關鍵的input文章是用紅樓夢第一回來示範。





圖片來源:http://bbs.ent.163.com/bbs/liudehua/167337417.html


2 則留言:

  1. 感謝布萊恩分享!! 另外想問關於jieba布萊恩有研究嗎? 我想斷出 "難以維持" 這字,python下運行一直分不出來,總是分成 "難以" 跟 "維持"。我把自定義跟預設的字典裡"難"跟"以"的詞都刪了,也把"難以維持"的詞頻調的很高很高,還是分不出來,請問這問題布萊恩有沒有建議呢??
    感謝~~

    回覆刪除
    回覆
    1. 雖然用過結巴但是對於細節的微調並不清楚orz 我看一下有心得再回覆您,謝謝orz

      刪除