監督學習的方法需要大量的標註數據,對於層出不窮的網路新詞,顯得力不從心。這是就需要無監督的演算法去發現新詞、行業詞等。本文根據這篇新詞發現演算法做一個梳理和自我的總結。

上面文章做新詞發現的主要思想就是通過字之間的組合,正向匹配,從相關性最低處切開,保證詞內部的相關性最高,或者稱之為凝固度最高。

以三個字的詞為例,相關性(凝固度)的公式:

min left{ frac{P(ABC)}{P(A)P(BC)},frac{P(ABC)}{P(AB)P(C)} 
ight}

上面公式可以這樣理解,以第一個式子為例,假設A、BC為相互獨立的事件,則ABC發生的概率為 P(ABC) = P(A)P(BC),而P(ABC)表示ABC統計而得發生的真實的概率。上式可以理解為 P(ABC)/P(ABC),比值越大代表ABC越不獨立,相關性很高越有可能同時出現,也就是詞的內部凝固度很高。按照互信息的概念來講,就是 A 和 BC 聯合分布相對於假定 A和 BC獨立情況下的聯合分布之間的內在依賴性。

演算法分為以下步驟:

  1. 統計1,2,3...ngrams的詞頻並根據詞頻設定的閾值過濾小於閾值的部分

2.根據凝固度公式計算2grams以上詞語的凝固度,並過濾小於凝固度閾值的詞語,針對不同長度的詞語,凝固度的閾值設置不一樣。按文中作者給出的經驗閾值,以字典的形式給出,長度為2的為5,長度為3的為25,長度為4的為125。min_proba={2:5,3:25,4:125}。其中,凝固度的計算按照每種切分可能都進行計算,取最小的最為其凝固度

根據凝固度過濾掉第一步統計出來的ngrams中小於凝固度的詞語。

3.根據前兩步篩選出來的詞語對句子進行分詞。

其中,對句子分詞時設置了一個掩碼,用於標記句子中出現在ngrams中的詞語,例如「中華人民」除去句首外各個位置設置掩碼為[0,0,0],從句首開始掃描,如果"中華"在ngrams裡面,則掩碼變成[1,0,0],再向前掃描,中華人不在ngrams裡面,掩碼依然為[1,0,0],中華人民在ngrams裡面,掩碼全部加一,變成[2,1,1],從掩碼等於0的地方斷開,這樣就可以進行粗略的分詞。

4.上面的分詞結果可能會存在一個問題,比如說"各項目",是由於"各項","項目"都存在於ngrams,所以"各項目"才會保留下來,這時可以掃描"各項目"是否在3grams裡面,如果在其中,將其保留,不在就刪除。其實,不進行這一步的篩選,我認為也是可以的,主要看你的需求,例如"大字型大小印表機",可以切成{大字型大小,印表機},也可以保留成一個。

演算法實踐

利用新聞語料測試一下新詞發現的結果:

處理結果:

每句對應的分詞結果
發現的新詞

可以看出很多詞都是和金融股票有關的,"分紅派息","現金紅利"也都能從文中識別出來。此演算法還是具有一定的效果。

整體的代碼和數據上傳在github上:HaishuoFang/Find_New_token


推薦閱讀:
相关文章