1. 程式人生 > >自然語言處理--中文分詞之機械分詞

自然語言處理--中文分詞之機械分詞

說到自然語言處理,對於中文首當其衝的就是分詞。

    和西方語言不同,中文句子中不像英語,每個單詞間有空格隔開,而是全部連在一起,詞間沒有明顯的界限。這就為我們的翻譯、檢索等等更高階的資訊處理帶來了不小的麻煩,怎樣將一句話中的關鍵詞提取出來,便成為了中文資訊處理首先要解決的問題,這就是我們所謂的分詞。

    現有的分詞演算法可分為三大類:基於字串匹配的分詞方法、基於理解的分詞方法和基於統計的分詞方法。

    我們就先說說基於字串匹配的分詞方法(也成為機械分詞,它是按照一定的策略將待分析的漢字串與一個“充分大的”機器詞典中的詞條進行配,若在詞典中找到某個字串,則匹配成功)吧,目前機械分詞有這樣幾種方法: 

 1)正向最大匹配法(由左到右的方向)

    2)逆向最大匹配法(由右到左的方向)

    3)最少切分(使每一句中切出的詞數最小)

      4)還可以將上述各種方法相互組合,例如,可以將正向最大匹配方法和逆向最大匹配方法結合起來構成雙向匹配法。

    下面就是我要說的第一種機械分詞的方法:正向最大匹配。

    那麼我們先來看個例子:

        “我現在非常開心”

    對於這句話,正向最大匹配的原則是什麼呢?“正向”就指我們從左至右搜尋,“最大”就是我們每次都取最大詞長進行匹配(由於中文有單字成詞的特點)。

    首先,假如詞典中的最長詞長度為4,我們從第一個字開始向右取4個字:“我現在非”,然後去與詞典中的詞一一進行匹配,顯然詞典中沒有這麼個詞,我們就將最後一個字去掉變成:“我現在”,然後再到詞典中進行匹配。一直到“我”匹配成功,我們就將我與整個句子切分開來:“我/現在非”;

    然後呢?“我”已經作為一個詞切分出來了,我們便從下一個字繼續取4個字(“現在非常”)作為一個詞去匹配,繼而切出“現在/非常”。之後依次類推。。。。

    最後就切成了:我/現在/非常/開心

    簡單吧?這樣大家也容易明白逆向最大匹配了吧?我們從句尾也就是由右至左進行搜尋。步驟和上述的正向最大匹配是一樣的,只是我們從右邊往左去取詞:(假如我們依舊選擇4為最大詞長)

    第一次選擇的就是“非常開心”,詞典中沒有這個詞,便刪去第一個字變為:“常開心”,直到分成:“非常/開心”。

    然後呢?繼續向左取:“現在非常”。。。

    之後的與上述一樣,最終便分為:我/現在/非常/開心

    然後呢?兩種方法一樣啊?分出來的結果也一樣啊?其實不然,機械分詞法德侷限也就在此,而這個問題也是基於詞典方法的分詞最難攻克的難題:歧義和未登入詞。

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 

        例如:其實在哪裡都一樣

        正向的結果:其實/在/哪裡/都/一樣

        逆向的結果:其/實在/哪裡/都/一樣

  哦,不一樣了吧,其實和實在,這就是歧義(當然了,這裡指的歧義並不是句子理解的歧義,而是分詞的歧義)我們當然會說第一個好了,那是因為你能夠理解這句話,或者說電腦並不具備這樣的理解能力或常識。到底是分成什麼呢?對於這句話正向的結果更貼近我們的理解,但是正向一定好嗎?

        再例如:化妝和服裝

        正向的結果:化妝/和服/裝

        逆向的結果:化妝/和服/裝

  這可怎麼辦?好像對於這句話看來,逆向的又更準確些。

    歧義分為交集型歧義和組合型歧義,還有人名啊、地名啊、機構名啊神馬的,哎,分詞就像一鍋菠菜粥,太多了,不說了。。。

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

    一般來說,逆向匹配的切分精度略高於正向匹配,遇到的歧義現象也較少。統計結果表明,單純使用正向最大匹配的錯誤率為1/169,單純使用逆向最大匹配的錯誤率為1/245。但這種精度還遠遠不能滿足實際的需要。實際使用的分詞系統,都是把機械分詞作為一種初分手段,還需通過利用各種其它的語言資訊來進一步提高切分的準確率。

    然而,我們在自然語言處理中會遇到的歧義有很多種,剛說到的這些只是冰山一角。不過我打算著,下一篇的內容還是有個連續性吧,準備一下基於理解的分詞方法吧。