python3實現互信息和左右熵的新詞發現

python3 實現的中文分詞新詞發現

關於中文新詞發現有多種方法,經過比較之後發現利用互信息和左右熵來做新詞發現效果最好,先上實驗效果
初始語句:

蔡英文在昨天應民進黨當局的邀請,準備和陳時中一道前往世界衛生大會,和談有關九二共識問題

單純使用jieba分詞的結果

蔡/ 英文/ 在/ 昨天/ 應/ 民進黨/ 當局/ 邀請/ 準備/ 和/ 陳時/ 中/ 一道/ 前往/ 世界衛生/ 大會/ 和談/ 有關/ 九二/ 共識/ 問題/

使用了新詞發現後的結果

蔡英文/ 在/ 昨天/ 應/ 民進黨當局/ 邀請/ 準備/ 和/ 陳時中/ 一道/ 前往/ 世界衛生大會/ 和談/ 有關/ 九二共識/ 問題/

測試樣本爲

臺灣“中時電子報”26日報道稱,蔡英文今日一早會見“世衛行動團”,她稱,臺灣雖然無法參加WHA(世界衛生大會),但“還是要有貢獻”。於是,她表示要捐100萬美元給WHO對抗埃博拉病毒 對於臺灣爲何不能,蔡英文又一次慣性“甩鍋”,宣稱“中國對臺灣的外交打壓已無所不用其極”。
……


原理介紹

方法主要依託於互信息和左右熵,代碼實現的數據結構是trie樹,下面將分爲三點來介紹

互信息

我們使用的是點間互信息,其定義如下:

PMI(x,y)=log2p(x,y)p(x)p(y)

其中p(x,y) 是兩個詞一起出現的概率,p(x) 是單個詞出現的概率。具體例子:4G上網卡4G上網卡;如果4G的詞頻是2,上網卡的詞頻是10,4G上網卡的詞頻是1,那麼記單單詞的總數有N個,雙單詞的總數有M個,則有下面的公式
PMI(4G,)=log21M2N10N
  • 點間互信息可以很好的反映兩個詞的凝聚力
  • 以 2 求 log 的原因來自信息論,可以簡單理解爲,取 log 之後就將一個概率轉換爲了信息量,以 2 爲底時可以簡單理解爲用多少個 bits 可以表示這個變量。

左右熵

我們這裏使用左右熵來衡量主要是想表示預選詞的自由程度(4G上網卡爲一個預選詞),左右熵越大,表示這個詞的左邊右邊的詞換的越多,那麼它就很有可能是一個單獨的詞。
我們這裏的左右熵定義爲(以左熵爲例):

EL(W)=aAP(aW|)log2P(aW|W)

這裏我們還是舉一個具體的例子來理解它
假設4G上網卡左右有這麼幾種搭配
[買4G上網卡, 有4G上網卡有4G上網卡丟4G上網卡]
那麼4G上網卡的左熵爲
EL(4G)=P(4G|)log2P(4G)+P(4G|)log2P(4G)+P(4G|)log2P(4G)

這裏A = [, , ]

字典樹

原來講明白了剩下的就是具體實現了,最適合存儲和計算詞頻的數據結構就是字典樹,這裏給一個講解的很清楚的鏈接

具體代碼

代碼已開源,需要的點擊這個Github

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章