用python實(shí)現(xiàn)新詞發(fā)現(xiàn)程序——基于凝固度和自由度
互聯(lián)網(wǎng)時(shí)代,信息產(chǎn)生的數(shù)量和傳遞的速度非???,語(yǔ)言文字也不斷變化更新,新詞層出不窮。一個(gè)好的新詞發(fā)現(xiàn)程序?qū)ψ鯪LP(自然預(yù)言處理)來(lái)說(shuō)是非常重要的。
N-Gram加詞頻
最原始的新詞算法莫過(guò)于n-gram加詞頻了。簡(jiǎn)單來(lái)說(shuō)就是,從大量語(yǔ)料中抽取連續(xù)的字的組合片段,這些字組合片段最多包含n個(gè)字,同時(shí)統(tǒng)計(jì)每個(gè)字組合的頻率,按照詞頻并設(shè)置一個(gè)閾值來(lái)判斷一個(gè)字組合片段是否為詞匯。
該方法簡(jiǎn)單處理速度快,它的缺點(diǎn)也很明顯,就是會(huì)把一些不是詞匯但出現(xiàn)頻率很高的字組合也當(dāng)成詞了。
凝固度和自由度
這個(gè)算法在文章《互聯(lián)網(wǎng)時(shí)代的社會(huì)語(yǔ)言學(xué):基于SNS的文本數(shù)據(jù)挖掘》 里有詳細(xì)的闡述。
凝固度就是一個(gè)字組合片段里面字與字之間的緊密程度。比如“琉璃”、“榴蓮”這樣的詞的凝固度就非常高,而“華為”、“組合”這樣的詞的凝固度就比較低。
自由度就是一個(gè)字組合片段能獨(dú)立自由運(yùn)用的程度。比如“巧克力”里面的“巧克”的凝固度就很高,和“巧克力”一樣高,但是它自由運(yùn)用的程度幾乎為零,所以“巧克”不能單獨(dú)成詞。
Python實(shí)現(xiàn)
根據(jù)以上闡述,算法實(shí)現(xiàn)的步驟如下:
1. n-gram統(tǒng)計(jì)字組合的頻率
如果文本量很小,可以直接用Python的dict來(lái)統(tǒng)計(jì)n-gram及其頻率。一段文本n-gram出來(lái)的字組合的大小大約是原始文本的(1+n)*n/2倍,字組合的數(shù)量也非常驚人。比如,“中華人民共和國(guó)”的首字n-gram是(n=5):
中
中華
中華人
中華人民
中華人民共
n-gram統(tǒng)計(jì)字組合頻率的同時(shí)還要統(tǒng)計(jì)字組合的左右鄰居,這個(gè)用來(lái)計(jì)算自由度。
如果文本量再大一些,Python的dict經(jīng)常會(huì)碰到最好使用trie tree這樣的數(shù)據(jù)結(jié)構(gòu)。雙數(shù)組Trie Tree有很多非常好的開(kāi)源實(shí)現(xiàn),比如,cedar、darts等等。Trie Tree使用的好處是,它天然包含了字組合的右鄰居信息,因?yàn)檫@個(gè)數(shù)據(jù)結(jié)構(gòu)一般是前綴樹(shù)。要統(tǒng)計(jì)左鄰居信息時(shí),只需要把字組合倒序放入另外一個(gè)Trie Tree即可。
使用cedar Trie Tree的時(shí)候,5-gram統(tǒng)計(jì)30M的文本大約使用6GB左右的內(nèi)存。
如果文本量更大,這就要借助硬盤(pán)了,可以使用leveldb這樣的key-value數(shù)據(jù)庫(kù)來(lái)實(shí)現(xiàn)。實(shí)驗(yàn)下來(lái),trie tree統(tǒng)計(jì)30M的文本用幾十秒,而同樣的用leveldb統(tǒng)計(jì)卻要6個(gè)多小時(shí)?。?!應(yīng)該還有比leveldb更合適的數(shù)據(jù)庫(kù)來(lái)做這件事情,有時(shí)間再說(shuō)。
當(dāng)然,為了發(fā)現(xiàn)新詞,幾十MB的文本文本足夠了。
2. 計(jì)算字組合的凝固度;
有了上述的統(tǒng)計(jì)結(jié)果,計(jì)算每個(gè)字組合的凝固度就比較簡(jiǎn)單了。
首先,把字組合切分成不同的組合對(duì),比如’abcd’可以拆成(‘a(chǎn)’, ‘bcd’), (‘a(chǎn)b’, ‘cd’), (‘a(chǎn)bc’, ‘d’),
然后,計(jì)算每個(gè)組合對(duì)的凝固度:D(s1, s2) = P(s1s2) / (P(s1) * P(s2))
最后,取這些組合對(duì)凝固度中最小的那個(gè)為整個(gè)字組合的凝固度。
3. 計(jì)算字組合的自由度;
分別計(jì)算它的左鄰居信息熵和右鄰居信息熵,取其中較小的為該組合的自由度。
4. 閾值的選擇
整個(gè)過(guò)程涉及到三個(gè)閾值的選擇:
組合的詞頻:頻率很低的組合成詞的可能性很小
組合的凝固度:凝固度越大成詞的可能性越大
組合的自由度:自由度越大成詞的可能性越大
經(jīng)驗(yàn)值:30M文本,詞頻>200, 凝固度>10**(n-1), 自由度>1.5
小竅門(mén):詞頻>30, 凝固度>20**(n-1)也能發(fā)現(xiàn)很多低頻的詞匯。
python
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。