用雙向最大匹配法進行中文分詞

2021-07-26 10:47:32 字數 1431 閱讀 2595

中文分詞任務,採用的是sighan2004(backoff2005微軟資料)資料。給出訓練集和測試集,對測試集進行中文分詞,要求給出的分詞結果f-score盡量大。

以選出匹配的單詞盡可能長為目標分詞,具體操作是從乙個方向不斷嘗試匹配出最長單詞,再進行下一次匹配,直到匹配完成為止。

同樣以選出匹配的單詞盡可能長為目標分詞,具體操作可以給分詞結果打分,找乙個合適的打分函式下,匹配單詞較長則比較合算,同時希望求解打分函式最大值的複雜度比較低。

因為希望從12公尺學習出2公尺,所以應該把12公尺和2公尺都弄成公尺,是乙個佔位符。

需要注意全形半形問題,本組資料所有的字元全部是全形的。

這個優化我做不太會做。感覺要識別出人名地名涉及到命名實體識別,這就很困難。

我嘗試了正向最大匹配法(v1)和雙向最大匹配法(v2),都加了數字和百分號小數點的優化。

用訓練集訓練出乙個字典。

對於測試集句子,從乙個方向不斷嘗試匹配出最長單詞,再進行下一次匹配,直到匹配完成為止。

用訓練集訓練出乙個字典並統計詞頻率。

對於測試集句子

設某乙個分詞結果 x(sentence) = (word_1, word_2, …, word_n)

得分 score(x) = length_value × score1(x) + score2(x)

其中score1(x)考慮匹配單詞長度的得分,需要滿足匹配越大分詞結果得分越高。

我取score1(x) = sum (i = 1, 2, …, n )

其中score2(x)考慮匹配單詞常見程度的得分,需要滿足詞頻率越大的分詞結果得分越高。

我取score2(x) = sum (i = 1, 2, …, n )

對於不在詞典裡的單詞,可以score()給乙個懲罰性分數,也可以根據剩下的單詞長短給乙個比較低的score1(x),我不太清楚怎麼設定分數比較合理,所以直接給了0分。length_value是乙個係數,用於控制兩部分得分的權重,取乙個合適的值,我通過調參決定它的取值。

然後求解分詞方案θ令 score(θ) = max

求解score(sentence)最大值可以使用動態規劃方法,可以設f(l,r)是sentence(l,r)這個子句的得分最大值,那麼可以用動態規劃求解f(l,r),求解同時記下區域性最優解轉移時候分詞位置即可求解出θ。

本來修改一下不同的score函式和比重調一調引數應該可以得到乙個相對比較好的結果,

但是由於動態規劃時間複雜度是o(len^2)的,對於長句子開銷還是不小的,加上log()計算耗時也比較久,所以演算法耗時比較久。所以我沒怎麼調參,根據我的理解給了乙個我覺得合適的引數並微調了一下。

模型f-score

正向最大匹配

0.945

雙向最大匹配

0.951

最大熵模型(來自網路)

0.839

4-tag+cfr(來自網路,目前最好版本)

0.964

中文分詞 雙向最大匹配實現

雙向最大匹配法 bi directction matching method,bm 雙向最大匹配法是將正向最大匹配法得到的分詞結果和逆向最大匹配法的到的結果進行比較,從而決定正確的分詞方法。據sunm.s.和 benjamin k.t.1995 的研究表明,中文中90.0 左右的句子,正向最大匹配法...

分詞之正向最大匹配法

完整資料和 獲取位址github zlhcsm 知識普及 正向最大匹配法 對於輸入的一段文字從左至右 以貪心的方式切分出當前位置上長度最大的詞。正向最大匹配演算法是基於詞典的分詞方法,其分詞原理是 單詞的顆粒度越大,所能表示的含義越確切。1,一般從乙個字串的開始位置,選擇乙個最大長度的詞長的片段,如...

使用pymmseg進行中文分詞

python分詞模組,基於mmseg演算法編寫,核心 c 提供python介面。code example coding utf 8 from pymmseg import mmseg import os import sys def cws pymmseg shortdeslist,wordlist...