轉載自http://www.52nlp.cn/maximum-matching-method-of-chinese-word-segmentation
中文分詞在中文信息處理中是最最基礎的,無論機器翻譯亦或信息檢索還是其他相關應用,如果涉及中文,都離不開中文分詞,因此中文分詞具有極高的地位。中文分詞入門最簡單應該是最大匹配法了,當年師兄佈置給我的第一個學習任務就是實現最大匹配法的分詞算法(正向、逆向)。記得當時對自己參考學習最有幫助的是北大詹衛東老師“中文信息處理基礎”的課件和源程序,不過他實現的是mfc程序,詞表存儲在數據庫裏。自己實現時用純c++實現,利用hash_map存儲詞表。這裏我介紹一下相關的知識和一個簡單的程序示例,部分參考自詹老師的講義。
逆向匹配法思想與正向一樣,只是從右向左切分,這裏舉一個例子:
輸入例句:S1=”計算語言學課程有意思” ;
定義:最大詞長MaxLen = 5;S2= ” “;分隔符 = “/”;
假設存在詞表:…,計算語言學,課程,意思,…;
最大逆向匹配分詞算法過程如下:
(1)S2=”";S1不爲空,從S1右邊取出候選子串W=”課程有意思”;
(2)查詞表,W不在詞表中,將W最左邊一個字去掉,得到W=”程有意思”;
(3)查詞表,W不在詞表中,將W最左邊一個字去掉,得到W=”有意思”;
(4)查詞表,W不在詞表中,將W最左邊一個字去掉,得到W=”意思”
(5)查詞表,“意思”在詞表中,將W加入到S2中,S2=” 意思/”,並將W從S1中去掉,此時S1=”計算語言學課程有”;
(6)S1不爲空,於是從S1左邊取出候選子串W=”言學課程有”;
(7)查詞表,W不在詞表中,將W最左邊一個字去掉,得到W=”學課程有”;
(8)查詞表,W不在詞表中,將W最左邊一個字去掉,得到W=”課程有”;
(9)查詞表,W不在詞表中,將W最左邊一個字去掉,得到W=”程有”;
(10)查詞表,W不在詞表中,將W最左邊一個字去掉,得到W=”有”,這W是單字,將W加入到S2中,S2=“ /有 /意思”,並將W從S1中去掉,此時S1=”計算語言學課程”;
(11)S1不爲空,於是從S1左邊取出候選子串W=”語言學課程”;
(12)查詞表,W不在詞表中,將W最左邊一個字去掉,得到W=”言學課程”;
(13)查詞表,W不在詞表中,將W最左邊一個字去掉,得到W=”學課程”;
(14)查詞表,W不在詞表中,將W最左邊一個字去掉,得到W=”課程”;
(15)查詞表,“意思”在詞表中,將W加入到S2中,S2=“ 課程/ 有/ 意思/”,並將W從S1中去掉,此時S1=”計算語言學”;
(16)S1不爲空,於是從S1左邊取出候選子串W=”計算語言學”;
(17)查詞表,“計算語言學”在詞表中,將W加入到S2中,S2=“計算語言學/ 課程/ 有/ 意思/”,並將W從S1中去掉,此時S1=”";
(18)S1爲空,輸出S2作爲分詞結果,分詞過程結束。