中文新詞發現相關算法調研


 

(一)專業領域的新詞發現競賽:“AIIA”杯-國家電網-電力專業領域詞匯挖掘

地址:https://www.datafountain.cn/competitions/320/datasets

 

(二)新詞發現,基於信息熵和詞的凝合度算法(無預定義詞庫)

參考文章:互聯網時代的社會語言學:基於SNS的文本數據挖掘http://www.matrix67.com/blog/archives/5044

挖掘新詞的傳統方法是,先對文本進行分詞,然后猜測未能成功匹配的剩余片段就是新詞。這似乎陷入了一個怪圈:分詞的准確性本身就依賴於詞庫的完整性,如果詞庫中根本沒有新詞,我們又怎么能信任分詞結果呢?此時,一種大膽的想法是,首先不依賴於任何已有的詞庫,僅僅根據詞的共同特征,將一段大規模語料中可能成詞的文本片段全部提取出來,不管它是新詞還是舊詞。然后,再把所有抽出來的詞和已有詞庫進行比較,不就能找出新詞么。這篇文章基於信息熵和詞的凝合度給出了一套完整的新詞發現算法方案。最后,還通過分析不同時間段發現的新詞進行了熱詞、熱點趨勢分析。

代碼實現地址:https://spaces.ac.cn/archives/3491

  (1)詞的凝合度:要想從一段文本中抽出詞來,我們的第一個問題就是,怎樣的文本片段才算一個詞?大家想到的第一個標准或許是,看這個文本片段出現的次數是否足夠多。我們可以把所有出現頻數超過某個閾值的片段提取出來,作為該語料中的詞匯輸出。不過,光是出現頻數高還不夠,一個經常出現的文本片段有可能不是一個詞,而是多個詞構成的詞組。在人人網用戶狀態中,“的電影”出現了 389 次,“電影院”只出現了 175 次,然而我們卻更傾向於把“電影院”當作一個詞,因為直覺上看,“電影”和“院”凝固得更緊一些。為了證明“電影院”一詞的內部凝固程度確實很高,我們可以計算一下,如果“電影”和“院”真的是各自獨立地在文本中隨機出現,它倆正好拼到一起的概率會有多小。在整個 2400 萬字的數據中,“電影”一共出現了 2774 次,出現的概率約為 0.000113 。“院”字則出現了 4797 次,出現的概率約為 0.0001969 。如果兩者之間真的毫無關系,它們恰好拼在了一起的概率就應該是 0.000113 × 0.0001969 ,約為 2.223 × 10-8 次方。但事實上,“電影院”在語料中一共出現了 175 次,出現概率約為 7.183 × 10-6 次方,是預測值的 300 多倍。類似地,統計可得“的”字的出現概率約為 0.0166 ,因而“的”和“電影”隨機組合到了一起的理論概率值為 0.0166 × 0.000113 ,約為 1.875 × 10-6 ,這與“的電影”出現的真實概率很接近——真實概率約為 1.6 × 10-5 次方,是預測值的 8.5 倍。計算結果表明,“電影院”更可能是一個有意義的搭配,而“的電影”則更像是“的”和“電影”這兩個成分偶然拼到一起的。

 

(2)信息熵:“信息熵”是一個非常神奇的概念,它能夠反映知道一個事件的結果后平均會給你帶來多大的信息量。如果某個結果的發生概率為 p ,當你知道它確實發生了,你得到的信息量就被定義為 – log(p) 。 p 越小,你得到的信息量就越大。如果一顆骰子的六個面分別是 1 、 1 、 1 、 2 、 2 、 3 ,那么你知道了投擲的結果是 1 時可能並不會那么吃驚,它給你帶來的信息量是 – log(1/2) ,約為 0.693 。知道投擲結果是 2 ,給你帶來的信息量則是 – log(1/3) ≈ 1.0986 。知道投擲結果是 3 ,給你帶來的信息量則有 – log(1/6) ≈ 1.79 。但是,你只有 1/2 的機會得到 0.693 的信息量,只有 1/3 的機會得到 1.0986 的信息量,只有 1/6 的機會得到 1.79 的信息量,因而平均情況下你會得到 0.693/2 + 1.0986/3 + 1.79/6 ≈ 1.0114 的信息量。這個 1.0114 就是那顆骰子的信息熵。現在,假如某顆骰子有 100 個面,其中 99 個面都是 1 ,只有一個面上寫的 2 。知道骰子的拋擲結果是 2 會給你帶來一個巨大無比的信息量,它等於 – log(1/100) ,約為 4.605 ;但你只有百分之一的概率獲取到這么大的信息量,其他情況下你只能得到 – log(99/100) ≈ 0.01005 的信息量。平均情況下,你只能獲得 0.056 的信息量,這就是這顆骰子的信息熵。再考慮一個最極端的情況:如果一顆骰子的六個面都是 1 ,投擲它不會給你帶來任何信息,它的信息熵為 – log(1) = 0 。什么時候信息熵會更大呢?換句話說,發生了怎樣的事件之后,你最想問一下它的結果如何?直覺上看,當然就是那些結果最不確定的事件。沒錯,信息熵直觀地反映了一個事件的結果有多么的隨機。我們用信息熵來衡量一個文本片段的左鄰字集合和右鄰字集合有多隨機。考慮這么一句話“吃葡萄不吐葡萄皮不吃葡萄倒吐葡萄皮”,“葡萄”一詞出現了四次,其中左鄰字分別為 {吃, 吐, 吃, 吐} ,右鄰字分別為 {不, 皮, 倒, 皮} 。根據公式,“葡萄”一詞的左鄰字的信息熵為 – (1/2) · log(1/2) – (1/2) · log(1/2) ≈ 0.693 ,它的右鄰字的信息熵則為 – (1/2) · log(1/2) – (1/4) · log(1/4) – (1/4) · log(1/4) ≈ 1.04 。可見,在這個句子中,“葡萄”一詞的右鄰字更加豐富一些。

(3)新詞發現結合已有詞庫就可以識別出當前文本中出現了那些新詞。對於按天產生的文本將每一天發現的新詞的詞頻與昨天進行比較從而提取出這一天里特有的詞。這樣一來,我們就能從用戶狀態中提取出每日熱點。

 

(三)新詞發現:基於切分的新詞發現

參考文獻:【中文分詞系列】 2. 基於切分的新詞發現

https://spaces.ac.cn/archives/3913

文獻(二)《互聯網時代的社會語言學:基於SNS的文本數據挖掘》在那篇文章中,主要利用了三個指標——頻數、凝固度(取對數之后就是我們所說的互信息熵)、自由度(邊界熵)——來判斷一個片段是否成詞。如果真的動手去實現過這個算法的話,那么會發現有一系列的難度。首先,為了得到n字詞,就需要找出1∼n字的切片,然后分別做計算,這對於n比較大時,是件痛苦的時間;其次,最最痛苦的事情是邊界熵的計算,邊界熵要對每一個片段就行分組統計,然后再計算,這個工作量的很大的。本文提供了一種方案,可以使得新詞發現的計算量大大降低。

如果a,b是語料中相鄰兩字,那么可以統計(a,b)成對出現的次數#(a,b),繼而估計它的頻率P(a,b),然后我們分別統計a,b出現的次數#a,#b,然后估計它們的頻率P(a),P(b),如果

 

那么就應該在原來的語料中把這兩個字斷開。這個操作本質上就是——我們根據這個指標,對原始語料進行初步的分詞!在完成初步分詞后,我們就可以統計詞頻了,然后根據詞頻來篩選。

 

(四)語言模型進行無監督分詞從而進行新詞發現

文章參考:《【中文分詞系列】 5. 基於語言模型的無監督分詞 》[Blog post]. https://spaces.ac.cn/archives/3956

本文要介紹的分詞方法,就是以“基於字的語言模型”為基礎的。我們從最大概率法出發,如果一個長度為l的字符串s1,s2,…,sl,最優分詞結果為w1,w2,…,wm,那么它應該是所有切分中,概率乘積p(w1)p(w2)…p(wm)最大的一個。假如沒有詞表,自然也就不存在w1,w2,…,wm這些詞了。但是,我們可以用貝葉斯公式,將詞的概率轉化為字的組合概率:

 

其中w是一個k字詞,c1,c2,…,ck分別是w的第1,2,…,k個字。可以發現,p(ck|c1c2…ck−1)就是我們前面提到的字的語言模型(可以使Ngram語言模型,因為一個詞的長度一般不會很長)。

 

(五)基於凝合度+語言模型的新詞發現算法

參考文獻:《【中文分詞系列】 8. 更好的新詞發現算法 》[Blog post]. Retrieved from https://spaces.ac.cn/archives/4256

本文在文獻(三)和(四)的基礎上提出將兩者優點相結合的方法進行新詞發現。最后在微信300萬篇文章中構建詞庫並取得了較好的效果。

文獻(三)認為,文本的相關性僅由相鄰兩字(2grams)來決定,這在很多時候都是不合理的,比如“林心如”中的“心如”、“共和國”中的“和國”,凝固度(相關性)都不是很強,容易錯切。因此,本文就是在前文的基礎上改進,那里只考慮了相鄰字的凝固度,這里同時考慮多字的內部的凝固度(ngrams),比如,定義三字的字符串內部凝固度為:

 

這個定義其實也就是說,要枚舉所有可能的切法,因為一個詞應該是處處都很“結實”的,4字或以上的字符串凝固度類似定義。一般地,我們只需要考慮到4字(4grams)就好(但是注意,我們依舊是可以切出4字以上的詞來的)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM