python3 實現的中文分詞新詞發現
關於中文新詞發現有多種方法,經過比較之後發現利用互信息和左右熵來做新詞發現效果最好,先上實驗效果
初始語句:
蔡英文在昨天應民進黨當局的邀請,準備和陳時中一道前往世界衛生大會,和談有關九二共識問題
單純使用jieba分詞的結果
蔡/ 英文/ 在/ 昨天/ 應/ 民進黨/ 當局/ 邀請/ 準備/ 和/ 陳時/ 中/ 一道/ 前往/ 世界衛生/ 大會/ 和談/ 有關/ 九二/ 共識/ 問題/
使用了新詞發現後的結果
蔡英文/ 在/ 昨天/ 應/ 民進黨當局/ 邀請/ 準備/ 和/ 陳時中/ 一道/ 前往/ 世界衛生大會/ 和談/ 有關/ 九二共識/ 問題/
測試樣本爲
臺灣“中時電子報”26日報道稱,蔡英文今日一早會見“世衛行動團”,她稱,臺灣雖然無法參加WHA(世界衛生大會),但“還是要有貢獻”。於是,她表示要捐100萬美元給WHO對抗埃博拉病毒 對於臺灣爲何不能,蔡英文又一次慣性“甩鍋”,宣稱“中國對臺灣的外交打壓已無所不用其極”。
……
原理介紹
方法主要依託於互信息和左右熵,代碼實現的數據結構是trie樹,下面將分爲三點來介紹
互信息
我們使用的是點間互信息,其定義如下:
其中 是兩個詞一起出現的概率, 是單個詞出現的概率。具體例子:
4G
, 上網卡
,4G上網卡
;如果4G
的詞頻是2,上網卡
的詞頻是10,4G上網卡
的詞頻是1,那麼記單單詞的總數有N個,雙單詞的總數有M個,則有下面的公式- 點間互信息可以很好的反映兩個詞的凝聚力
- 以 2 求 log 的原因來自信息論,可以簡單理解爲,取 log 之後就將一個概率轉換爲了信息量,以 2 爲底時可以簡單理解爲用多少個 bits 可以表示這個變量。
左右熵
我們這裏使用左右熵來衡量主要是想表示預選詞的自由程度(4G上網卡
爲一個預選詞),左右熵越大,表示這個詞的左邊右邊的詞換的越多,那麼它就很有可能是一個單獨的詞。
我們這裏的左右熵定義爲(以左熵爲例):
這裏我們還是舉一個具體的例子來理解它
假設
4G上網卡
左右有這麼幾種搭配 [
買4G上網卡
, 有4G上網卡
,有4G上網卡
, 丟4G上網卡
] 那麼
4G上網卡
的左熵爲 這裏A = [
買
, 有
, 丟
]
字典樹
原來講明白了剩下的就是具體實現了,最適合存儲和計算詞頻的數據結構就是字典樹,這裏給一個講解的很清楚的鏈接
具體代碼
代碼已開源,需要的點擊這個Github