標籤:
分詞對於搜尋引擎,IME輸入提示,語音辨識等其它人機互動系統等都很有用。互連網的海量資訊為分詞研究提供了大量的,動態更新的原始資料庫。很多互連網公司都有基於互連網內容的分詞系統。並且採用HADOOP等分析大量資料。這些聽上去很高大上,但是仔細想想基本原理應該是比較容易理解的,我們每個程式員也很容易可以研究這個領域。所以做了一個簡單的POC實驗。
首先寫一個Spider,從互連網頁面抓取內容。因為只是簡單實驗,我只抓取一個頁面,沒有做遞迴抓取連結頁面。抓取內容過濾掉HTML標籤留下純文字。
第二部分,寫一個字之間連續出現頻率分析的分析器。基本思想是,定義一個已讀字元緩衝區,讀取輸入字元流,對每個字X:
1 . 如果是空格等分隔字元,則清空緩衝。
2. 如果是正常字元:如果緩衝已經有內容E則記錄<E, X>匹配次數加一。然後將X也放入緩衝。(問題:應該對於E的任意後子串都可以基數加一。)
這樣,最終我們可以得出每個字串後面跟隨的可能字元的列表和對應的匹配次數。在這個實驗裡,我用檔案系統的目錄結構來記錄:每個字串一個檔案夾,然後後面可能出現的每個詞一個檔案,檔案是空的,用檔案的lastModified時間戳記錄匹配次數。這在一個真正的系統裡是不可行的,必須設計儲存資料結構;但是為了簡單期間,我們在這個實驗裡就利用檔案系統。
第三部分是做一個Java Swing介面,給一個輸入框,使用者輸入任一字元串,然後根據使用者輸入找出最常匹配的下個字元。這裡有幾個問題:
1. 只找一個字元不太夠,比如使用者輸入 【中華人民】,我們應該給出【共和國】而不是只提示一個【共】。所以在匹配一個後,需要在此基礎上給出下一個匹配字元。
2. 如果對使用者輸入無法匹配到下一個字元,則應該去掉使用者輸入串最左邊的字元,根據右邊字串繼續匹配,並遞迴,直到找到匹配或者字串長度為零。(由於我們記錄所有的可能,實際上當可能性小於某值時應該認為不再是以後詞。)
3. 上邊兩種情況一起考慮時,不能弄混,比如不能匹配處一個連續但是無意義的單字接龍,比如 【中國家人民兵種子】,所以匹配下一個字時要考慮整個前面的分詞,要不要繼續找下一個可能字元。這裡情況稍微複雜。在這個簡單實驗裡只是簡單處理了一下。
總的來說,這個小實驗給出了比較有意義的結果。當然在一個真正的產品裡要對更多的相關問題做研究。
代碼在這裡: http://blog.luoxq.com/files/fenci.tar 一共只有200+行代碼。
介面現實結果如下:
基於互連網內容的中文分詞小實驗