簡易中文分詞模塊(SCWS) 什麼是中文分詞, 為什麼要分詞?
什麼是中文分詞, 為什麼要分詞?
編寫簡單的中文分詞程序
幾個月之前,在網上找到了一個中文詞庫素材(幾百K),當時便想寫一個分詞程序了.我對漢語分詞沒有什麼研究,也就憑自己臆想而寫.若有相關方面專家,還請多給意見.
一、詞庫
詞庫大概有5萬多詞語(Google能搜到,類似的詞庫都能用),我摘要如下:
地區 82
重要 81
新華社 80
技術 80
會議 80
自己 79
幹部 78
職工 78
群眾 77
沒有 77
今天 76
同志 76
部門 75
加強 75
組織 75
第一列是詞,第二列是權重.我寫的這個分詞算法目前並未利用權重.
二、設計思路
算法簡要描述:
對一個字符串S,從前到後掃瞄,對掃瞄的每個字,從詞庫中尋找最長匹配.比如假設S="我是中華人民共和國公民",詞庫中有"中華人民共和國","中華","公民","人民","共和國"......等詞.當掃瞄到"中"字,那麼從中字開始,向後分別取1,2,3,......個字("中","中華","中華人","中華人民","中華人民共","中華人民共和","中華人民共和國",,"中華人民共和國公"),詞庫中的最長匹配字符串是"中華人民共和國",那麼就此切分開,掃瞄器推進到"公"字.
數據結構:
選擇什麼樣的數據結構對性能影響很大.我採用Hashtable _rootTable記錄詞庫.鍵值對為(鍵,插入次數).對每一個詞語,如果該詞語有N個字,則將該詞語的1,1~2,1~3,......1~N個字作為鍵,插入_rootTable中.而同一個鍵如果重複插入,則後面的值遞增.
三、程序
具體程序如下(程序中包含權重,插入次數等要素,目前的算法並沒有利用這些.可以借此寫出更有效的分詞算法):
ChineseWordUnit.cs //strUCt--(詞語,權重)對
1 public struct ChineseWordUnit
2 {
3 private string _word;
4 private int _power;
5
6 /**//// <summary>
7 /// 中文詞語單元所對應的中文詞。
8 /// </summary>
9 public string Word
10 {
11 get
12 {
13 return _word;
14 }
15 }
16
17 /**//// <summary>
18 /// 該中文詞語的權重。
19 /// </summary>
20 public int Power
21 {
22 get
23 {
24 return _power;
25 }
26 }
27
28 /**//// <summary>
29 /// 結構初始化。
30 /// </summary>
31 /// <param name="word">中文詞語</param>
32 /// <param name="power">該詞語的權重</param>
33 public ChineseWordUnit(string word, int power)
34 {
35 this._word = word;
36 this._power = power;
37 }
38 }
ChineseWordsHashCountSet.cs //詞庫容器