Macropodus 新詞發現詳解(new word discovery, python3)

一、Macropodus簡介

        Macropodus自然語言處理工具(Albert+BiLSTM+CRF) 擁有中文分詞 命名實體識別 新詞發現 關鍵詞 文本摘要 計算器 中文

數字阿拉伯數字轉換等算法,其中,新詞發現(newword discovery)是一個重要的功能,對於一個通用的自然語言處理工具來說。

        github地址: https://github.com/yongzhuo/Macropodus

 

二、新詞發現概述(New-Word-Discovery)

        什麼是新詞發現,感覺這個問題有着顯然易見的答案,“新時代互聯網上的流行詞(組)?”,“未出現在詞典的其他成詞?”,又或者“特定領域的專業詞?”,這似乎難以描述得清楚,百科裏也是解釋得不清不楚的。

        過往的歷史究竟難以考究,我們可以通過“中文信息處理中的分詞問題”、“中文分詞十年回顧”、“中文分詞十年又回顧”等論文的歷史變遷中尋找答案。首先要定義一個概念,我們可以從“爲什麼”開始,那麼最開始是爲了解決什麼問題呢?——分詞,顯而易見是分詞。進入到九十年代,基於詞典得分詞效果已經很不錯了,最大分詞/最小分詞/正向分詞/逆向分詞/雙向分詞等,已經能夠達到不錯的效果,mmseg更是基於統計的分析方法總結出了四條至今仍然廣泛使用的切詞規則,達到了很好的分詞效果。但是,基於詞典的分詞快則快,卻是有一個嚴重的缺陷,那就是不能解決歧義問題和未登錄詞問題(詞典以外的詞)。

        二十世紀末二十一世紀初,計算機算力迅猛發展,有監督的機器學習開始興起,尤其是開發出了基於序列標註(如BIO標註法)的分詞方法,使得機器能夠從少量的標註語料中,學習到語言的內在及結構特徵,自動化地分詞。“2003年Bakeoff 數據上的評估結果表明 ,未登錄詞造成的分詞精度失落至少比分詞歧義大 5 倍以上”。這一時期的SVM、HMM、CRF等算法表現驚人,尤其是基於字和條件隨機場(CRF)的序列標註方法,對未登錄的詞識別效果很好,無論是工業成熟的HanLP,還是哈工大的LTP,抑或是清華北大的Thulac、Pkuseg,條件隨機場(CRF)都在發揮着不可替代的作用。

       進入互聯網時代,尤其是移動互聯網時代,隨着互聯網,手機,人工智能等技術的發展,中文分詞發生了天翻地覆的變化,無論目標任務、無論技術工具、無論場景邏輯,如搜狗基於搜索引擎的拼音輸入法,如科大訊飛語音輸入法與糾錯,又如人人網的熱點事件追蹤與分析。這一時期,是大數據、雲計算與深度學習的天下,人人網Matrix67基於信息熵的新詞發現算法(詞丰度和凝固度),深度學習Bi-LSTM+CRF算法等。

        講了這麼多,我們可以把新詞發現看成是不同分詞粒度的組合詞(更大粒度);或者是新形式、新語義詞(互聯網新詞);抑或是新領域新行業的詞語(新產業)。

 

三、新詞發現算法

        新詞發現算法,我們可以看成大致是構建詞典的過程(詞典不存在的時候)。

        新詞發現算法,一般有兩種應用廣泛的方法:

                1.  Jieba的HMM基於字的BMES標註法;

                2.  matrix67的基於信息熵的無監督算法。

        3.1  基於字和HMM的BMES標註法(以Jieba爲例)

               如果切的是連續幾個字,且由字組成的詞不在詞典裏,則運行隱馬爾可夫模型(HMM)。該HMM模型使用的訓練語料是         1998年人民日報標註語料訓練的。

              此外,蘇劍林版【中文分詞系列】 3. 字標註法與HMM模型(該中文分詞系列很不錯,值得一看),是無訓練語料下,         使用詞頻字典構建發射概率矩陣,  使經驗構建 BMES 狀態轉移矩陣,也能達到不錯的效果。

        3.2  matrix67的基於信息熵的無監督算法

                matrix67的基於信息熵的無監督算法參考的指標有如下三個:

                      詞頻 [ tf ]

                      左右熵(-p * log p)]

                      凝固度 [ p(abc) ÷ (p(a) * p(b) * p(c)) ]

                 說明: 詞頻,這個簡單,詞語(n-gram)的出現的次數(頻率, 會除以總數);

                          左右熵,即成詞的丰度,詞的左(右)邊所有詞的熵(一般只用單個字);

                          凝固度,內部凝固程度,字(詞)一起出現的概率(可以用單個字和其他的詞, 也可以用所有的字);

        3.3  基於信息熵的改進算法

            3.3.1  SmoothNLP版信息熵算法

                    SmoothNLP工具的新詞發現算法,主要是改進matrix67算法的左右熵計算方式,一般左右熵的計算方式是                              取最小值min(entropy_left, entropy_ringht), 或者是求平均(entropy_left + entropy_ringht) / 2;SmoothNLP則是

            改成 L(w) = (LR * e^ LL + LL * e^ LL) ÷ | LL - LR|。

            凝固度PMI改成AMI, AMI = PMI ÷ len_word(詞語長度)。

            總得分計算爲: score = L(W) + AMI

            此外,另外一點不同之處是過濾條件,SmoothNLP工具的過濾條件是成詞的第一個字的次數不小於16(最後的新詞裏邊),

            這個有一點兒像成詞的丰度了,不過像"的公司"這種還是沒法過濾。

          3.3.2  bojoe版信息熵算法

                  蘇劍林(bojoe)版信息熵算法又有所不同,是一種反向思維。爲了減少計算量,只計算頻率和凝固度。其中,凝固度的

          判別方法爲 過濾 PMI 小於 α 的。

         3.3 其他新詞發現算法

               3.3.1 基於word2vec的無監督算法

                      地址在【中文分詞系列】 5. 基於語言模型的無監督分詞,word2vec詞向量訓練使用的是Word+Character

               +Ngram,即取的是1-4的n-gram。然後使用語言模型,即維特比解碼,求取最大概率的那條路徑,則是最佳分詞結果。

               這裏使用的還是基於字的HMM標註法,主要是概率使用了詞向量的。最後,最佳分詞結果不在詞典的,便是新詞。

               3.3.2 基於n-gram凝固度的新詞發現算法

                       地址在【中文分詞系列】 8. 更好的新詞發現算法,主要是考慮多字(成詞大於等於3的詞語),使用凝固度判斷是否

               構成新詞。score = min( p(abc) / (p(a) * p(bc), p(abc) / (p(ab) * p(c))。

 

四、Macropodus工具的新詞發現算法

        Macropodus工具的新詞發現算法主要也是採用信息熵,詳見: 

        https://github.com/yongzhuo/Macropodus/blob/master/macropodus/segment/word_discovery/word_discovery.py

       不同點在於:

            1. 最後得分計算爲 score = 詞頻 * 左熵 * 右熵 * 凝固度 * 左右熵和凝固度的綜合(1);

            2. 過濾(filter),如果成詞的左(右)邊第一個字爲停用詞,則降低權重,左右熵降低len_word(成詞長度)被,凝固度降低爲                        len_word(成詞長度)的 len_word(成詞長度)次方倍;

            3. 左右熵的計算方式是 [ (-p * log p)],但是 p 只取成詞左(右)邊的第一個字;

            4. 凝固度的計算方式爲: [ p(abc) ÷ (p(a) * p(b) * p(c)) ]

            5. 左右熵和凝固度的綜合(1)爲:

        lambda_3 = lambda m1, m2: math.log((m1 * math.e ** m2 + m2 * math.e ** m1 + self.eps) / (abs(m1 - m2) + 1), 10)

                其目的是均衡考慮左熵,右熵 和 凝固度等。

 

希望對你有所幫助!

 

 

 

 

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