中文分詞之姓名標註

前言:

談到中文分詞,前些年我可能感覺有點可望而不可即,不過現在倒是有這個自信和大家吹吹水了。不久前根據自己已有的原材料寫了一個分詞並標註姓名的小程序,因爲和ictclas有些不同,故此分享出來。ictclas被研究的很多了,我沒有去看源碼,看了幾個不同版本的分析;因爲之前也看過《算法導論》和《數據結構》,倒是沒有什麼理解上的困難。他大體分爲4個主要步驟:原子切分、top-N最優路徑粗切分、未登陸此識別(姓名的識別就含在此內了)、二元優化切分,數據結構則是採用的字典hash+二叉樹。

ictclas的詞性標註

先介紹一篇博文 http://blog.csdn.net/dancefire/article/details/1606603 《中科院中文分詞系統ICTCLAS之人名識別詞典分析》。這姓名標記方法中,咋一看還是有些複雜:步驟很多,需要考慮情況很多。但是分詞中用到的知識是很有限的:某一些詞的後面比較容易出現姓名(如:他某某),某一些的前面比較容易出現姓名(如:某某),利用這一轉移概率使用HMM對各種切分進行評判,選出最可能切分方法。由於ictclas的版本已經更新了n個版本,前人們指出的問題,可能已經做了不少改進。爲了讓大家對ictclas有一個簡要了解,這裏貼一幅圖(從http://wenku.baidu.com/view/bbe58e4d2b160b4e767fcfbf.html 上面截的):



我的標記方法:

我的這一方法和上面介紹的略有不同,如果非得說出什麼道道來,那就比較接近貝葉斯分類。這個方法中我是用了兩本詞典:第一本就是普通的詞語詞典,也就是一般用於top-N最優路徑切分的詞典;第二本則是姓名的詞典:選取了幾千萬箇中文的姓名作爲統計樣本,得到了每一個字的頻率和位置。

姓名切分: 所有名字都統一劃分爲三個部分,姓氏、中間部分【單名的中間部分爲空】、名的末部分。

最優路徑查找:以"這一章是我寫的"爲例句。當看到“章”字是個姓,就有可能“章是”、“章是我”是一個名字。

1、當“章是”爲名最優路線:“這一”最優切分的概率*1個人姓“章”的概率*名中間部分爲空的概率*以“是”作爲名末部分的概率*“的牌”的最優切分概率。

2、以“章是”爲名的基準參考路線:“這一”最優切分的概率*單字中“章”字出現的概率*單字中“是”出現的概率*“的牌”的最優切分概率。

3、“章”不做姓的最優路線:"這一張是我的牌"的普通的最優切分概率。

【註釋】 單字“章”的概率是指統計文本內“章”的字頻數除以統計的漢字個數。因爲姓名中的概率都是考慮獨立的字,消除不對稱姓。

如果2的概率大於1的,則說明一個語句中出現“張”再出現“是”的概率要大於一個人姓“張”同時取名叫“是”的概率,因此不把“張是”當做名字。

如果3的概率大於1的,則說明直接普通切分最合適(一種常見情況是“章”與前面成詞)。

當然我們還要考慮“章是我”是名字的情況,這裏邊不贅述。我們使用到了三部分信息:

1、姓名中的漢字的使用頻率

2、漢字的使用頻率

3、各個詞語的使用頻率(這由分詞字典給出,當然漢字使用的頻率也可從中統計出來)

這一個方法的實現效果我也做了幾次測試:從紅樓夢中選取了2個章節,把主要人物的名字換成了數據庫裏的普通姓名(共250處),然後把這些替換過的句子拿來做切分,考察其正確率與召回率。發生了一件有意思的事情。

當我的姓名字典是從百萬級別的姓名中統計出來時,召回率只有71%,但是當我把姓名的統計樣本增加十倍後,召回率達到了91.6%,正確率接近93%。呵呵,量變引起質變,更多的研究就沒有進行了(資源有限)。


原理講解:

其實上面案例中最核心的問題是“章是”是名字的概率是多少?

第一種求解:

文本中“章”是姓的概率*以單名“是”命名的概率。

第二種求解:

假設文本中名字出現的概率爲a;一個名字剛好命名爲“章是”的概率是多少?(設爲p1)當不是名字的時候出現“章是”的概率是多少?(設爲p2)那麼文本中“章是”出現的概率爲 a*p1+(1-a)*p2,其中名字的概率爲a*p1;所以“章是”是名字的概率是a*p1/(a*p1+(1-a)*p2)。

計算方法中使用的便是第二種求解,因爲一個文本人名出現的概率並不是很容易統計,而且受到文章性質影響非常大,因而直接忽略了名字出現的概率a(或者說隨便取了個1/2),這裏當然便是此方法的一個優化點。不過當我們把完整的不同詞性之間的轉移概率考慮進來時,a應當表示“一”這個數字後面接上一個名字的概率了。而我在實際中也把“章是”不是名字的情況簡化爲“章”字與“是”字偶然碰在一起的概率(而且假定了這兩個字沒有關係)以減少複雜性。

爲什麼不用第一種方法求解呢?因爲文本中這個“章”姓的概率可是非常不好統計的。本來文本出現的名字就少,還要出現“章”字就更少了,(想來想去也就想到一個“章子怡”,再說還有更偏僻的“姓”),幾乎不可能實現。


結語:

一直想搞一個不依賴字典的分詞算法,有一些想法,但是沒什麼好的語料。寫到這兒頭也有點兒暈了,如果有什麼錯誤,請指正。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章