seg:NLP之正向最大匹配分詞

已遷移到我新博客,閱讀體驗更佳seg:NLP之正向最大匹配分詞
完整代碼實現放在個人github上:click megit

1、任務要求

  • 實現一個基於詞典與規則的漢語自動分詞系統。

2、技術路線

  • 採用正向最大匹配(FMM)方法對輸入的中文語句進行分詞,具體的實現能夠分爲下面幾個步驟:
    1. 對輸入的一箇中文語句,首先在程序中判斷並確保語句中不包含數字或者字母
    2. 在句子中的當前位置開始取與詞典dic_ce.txt中最大匹配長度的詞做爲一個分詞段,若是沒有在詞典中成功匹配到就將句子在當前匹配位置的這個字做爲一個分詞段並將匹配位置向前挪一個位置
    3. 重複第2步直到匹配位置移到句末
  • 下面是用FMM方法分詞的具體實現:
//param@seg:保存分詞段結果的vector
//param@st:帶分詞的中文語句
void segment(vector<string> &seg, string st) {
    int pos = 0;
    int sz = st.length();
    string t;
    int cnt = 0, spos;
    while (pos < sz) {
        cnt = pos;
        spos = pos;
        t = "";
        while (st[cnt]) {
            t += st.substr(cnt, 2);
            if (wordmap.find(t) != wordmap.end())
                pos = cnt + 2;
            cnt += 2;
        }
        if (pos == spos) {
            seg.push_back(st.substr(spos, 2));
            pos += 2;
        }else {
            seg.push_back(st.substr(spos, pos - spos));
        }
    }
    return;
}

3、數聽說明

  • 漢英詞典dic_ce.txt,讀取其中的漢詞用於與句中詞進行匹配,詞典採用GBK編碼,下面是給出文件內容示例:
//gbk編碼,每行第一個詞是漢詞,後面是它對應的英譯單詞,以','分隔
阿彌陀佛,Amitabha
阿米巴,amoeba,amoebae
阿姆斯特丹,Amsterdam
阿斯匹林,aspirin

4、性能分析

  • 假設輸入中文語句長度爲n,程序時間複雜度最壞狀況下是O(n^2),最好狀況是O(n),下面是程序分析結果及分詞耗時評測的截圖:

1541992901499

5、運行環境

  • 將執行文件seg.exe與數據字典dic_ce.txt放在同一個目錄下,而後點擊seg.exe便可正常運行,進入運行窗口後根據提示進行輸入便可獲得分詞結果。
相關文章
相關標籤/搜索