LibMMSeg 是Coreseek.com為 Sphinx 全文搜索引擎設計的中文分詞軟件包,其在GPL協(xié)議下發(fā)行的中文分詞法,采用Chih-Hao Tsai的MMSEG算法。
MMSEG: A Word Identification System for Mandarin Chinese Text Based on Two Variants of the Maximum Matching Algorithm
Published: 1996-04-29
Updated: 1998-03-06
Document updated: 2000-03-12
License: Free for noncommercial use
Copyright 1996-2006 Chih-Hao Tsai (Email: hao520 at yahoo.com )
您可以在Chih-Hao Tsai's Technology Page找到算法的原文。
LibMMSeg 采用C++開(kāi)發(fā),同時(shí)支持Linux平臺和Windows平臺,切分速度大約在300K/s(PM-1.2G),截至版本(0.7.1)LibMMSeg沒(méi)有為速度仔細優(yōu)化過(guò),進(jìn)一步的提升切分速度應仍有空間。
下載 Coreseek-3.2.13+MMSeg 3.2.13,mmseg-3.2.13.tar.gz
3.2.13
- 2010.07.01 隨coreseek3.2.13提供
- 修正chunks問(wèn)題 - 完善多操作系統支持
3.2.12
- 2010.05.03 隨coreseek3.2提供
- 增加了英文和數字的處理部分 - 優(yōu)化了相關(guān)處理部分
0.7.3
- 2008.05.27 修正 Makefile 無(wú)法安裝csr_typedefs.h的問(wèn)題
- 2008.05.27 修正 x64系統上編譯無(wú)法作為動(dòng)態(tài)庫的一部分編譯的問(wèn)題
0.7.2
- 2008.05.19 修正 指定的目錄中無(wú)詞典不提示錯誤的問(wèn)題
- 2008.05.19 新增 Ruby 的調用API
0.7.1
- 2008.04.23 修正了在類(lèi)似 “english 中文 english" 的句子,切分不正確的問(wèn)題
0.7
- 第一次發(fā)行
Window平臺
打開(kāi)源碼包中src\win32 子目錄下的對應的工程文件,目前LibMMSeg內置了VS2003和VS2005的工程文件。
Linux平臺
在源碼包根目錄下執行:
./configure && make && make install
詞典的構造
mmseg -u unigram.txt
該命令執行后,將會(huì )在unigram.txt所在目錄中產(chǎn)生一個(gè)名為unigram.txt.uni的文件,將該文件改名為uni.lib,完成詞典的構造。需要注意的是,unigram.txt需要預先準備,并且編碼格式必須為UTF-8編碼。
詞典文件格式:
....
河 187
x:187
造假者 1
x:1
臺北隊 1
x:1
湖邊 1
......
其中,每條記錄分兩行。其中,第一行為詞項,其格式為:[詞條]\t[詞頻率]。需要注意的是,對于單個(gè)字后面跟這個(gè)字作單字成詞的頻率,這個(gè)頻率需要在大量的預先切分好的語(yǔ)料庫中進(jìn)行統計,用戶(hù)增加或刪除詞時(shí),一般不需要修改這個(gè)數值;對于非單字詞,詞頻率處必須為1。第二行為占位項,是由于LibMMSeg庫的代碼是從Coreseek其他的分詞算法庫(N-gram模型)中改造而來(lái)的,在原來(lái)的應用中,第二行為該詞在各種詞性下的分布頻率。LibMMSeg的用戶(hù)只需要簡(jiǎn)單的在第二行處填"x:1"即可。
用戶(hù)可以通過(guò)修改詞典文件增加自己的自定義詞,以提高分詞法在某一具體領(lǐng)域的切分精度,系統默認的詞典文件在源代碼目錄的data/unigram.txt中。
mmseg -d <dict_dir> tobe_segment.txt
其中,命令使用‘-d’開(kāi)關(guān)指定詞庫文件所在的位置,參數dict_dir為詞庫文件(uni.lib )所在的目錄;tobe_segment.txt 為待切分的文本文件,必須為UTF-8編碼。如果一切正確,mmseg會(huì )將切分結果以及所花費的時(shí)間顯示到標準輸出上。
對特殊短語(yǔ)的支持
由于LibMMSeg是為Sphinx全文搜索引擎設計的,因此其內置了部分搜索引擎切分算法的特性,主要表現在對特殊短語(yǔ)的支持上。
在搜索引擎中,需要處理C++時(shí),如果分詞器中沒(méi)有詞組C++,則將被切分為C/x +/x +/x,在進(jìn)一步的檢索中,可能每個(gè)詞會(huì )由于出現的過(guò)于頻繁而被過(guò)濾掉,導致搜索的結果與C++相關(guān)度不高不說(shuō),也嚴重影響的全文搜索的速度。在LibMMSeg中,內置對特殊短語(yǔ)的支持。
其輸入文件格式如下
// test commit
.net => dotnet
c# => csharp
c++ => cplusplus
其中左側是待支持的特殊短語(yǔ),右側是左側的特殊短語(yǔ)需要被轉換為的短語(yǔ)。這一轉換在分詞前進(jìn)行。
可以在行的開(kāi)頭加入'//'作為注釋符號,發(fā)現符號'//'后,整行將被忽略。
特殊短語(yǔ)詞庫構造命令:
mmseg -b exceptions.txt
其中, 開(kāi)關(guān)'-b'指示mmseg是要構造特殊短語(yǔ)詞庫;exceptions.txt是用戶(hù)編輯的特殊短語(yǔ)轉換規則。
該命令執行后,將在當前目錄下產(chǎn)生一個(gè)名為"synonyms.dat"的文件,將該文件放在"uni.lib"同一目錄下,分詞系統將自動(dòng)啟動(dòng)特殊短語(yǔ)轉換功能。
注意:
1、在啟用了該功能后,如果分詞系統發(fā)現了一個(gè)特殊短語(yǔ),將直接輸出其在右側對應的替換的值;
2、右側被替換的值,請保證不會(huì )被分詞器進(jìn)行切分。(eg. C++ => C# 這個(gè)轉換的意義不大,并且可能導致C++這個(gè)短語(yǔ)永遠無(wú)法被檢索到?。?/p>
附錄:
首先來(lái)理解一下chunk,它是MMSeg分詞算法中一個(gè)關(guān)鍵的概念。Chunk中包含依據上下文分出的一組詞和相關(guān)的屬性,包括長(cháng)度(Length)、平均長(cháng)度(Average Length)、標準差的平方(Variance)和自由語(yǔ)素度(Degree Of Morphemic Freedom)。下面列出了這4個(gè)屬性:
| 屬性 | 含義 |
| 長(cháng)度(Length) | chuck中各個(gè)詞的長(cháng)度之和 |
| 平均長(cháng)度(Average Length) | 長(cháng)度(Length)/詞數 |
| 標準差的平方(Variance) | 同數學(xué)中的定義 |
| 自由語(yǔ)素度(Degree Of Morphemic Freedom) | 各單字詞詞頻的對數之和 |
Chunk中的4個(gè)屬性只有在需要該屬性的值時(shí)才進(jìn)行計算,而且只計算一次。
其次來(lái)理解一下規則(Rule),它是MMSeg分詞算法中的又一個(gè)關(guān)鍵的概念。實(shí)際上我們可以將規則理解為一個(gè)過(guò)濾器(Filter),過(guò)濾掉不符合要求的chunk。MMSeg分詞算法中涉及了4個(gè)規則:
這4個(gè)規則符合漢語(yǔ)成詞的基本習慣。
再來(lái)理解一下匹配方式復雜最大匹配(Complex maximum matching):
復雜最大匹配先使用規則1來(lái)過(guò)濾chunks,如果過(guò)濾后的結果多于或等于2,則使用規則2繼續過(guò)濾,否則終止過(guò)濾過(guò)程。如果使用規則2得到的過(guò)濾結果多于或等于2,則使用規則3繼續過(guò)濾,否則終止過(guò)濾過(guò)程。如果使用規則3得到的過(guò)濾結果多于或等于2,則使用規則4繼續過(guò)濾,否則終止過(guò)濾過(guò)程。如果使用規則 4得到的過(guò)濾結果多于或等于2,則拋出一個(gè)表示歧義的異常,否則終止過(guò)濾過(guò)程。
最后通過(guò)一個(gè)例句--“研究生命起源來(lái)簡(jiǎn)述”一下復雜最大匹配的分詞過(guò)程。MMSeg分詞算法會(huì )得到7個(gè)chunk,分別為:
| 編號 | chunk | 長(cháng)度 |
| 0 | 研_究_生 | 3 |
| 1 | 研_究_生命 | 4 |
| 2 | 研究_生_命 | 4 |
| 3 | 研究_生命_起 | 5 |
| 4 | 研究_生命_起源 | 6 |
| 5 | 研究生_命_起 | 5 |
| 6 | 研究生_命_起源 | 6 |
使用規則1過(guò)濾后得到2個(gè)chunk,如下:
| 編號 | chunk | 長(cháng)度 |
| 4 | 研究_生命_起源 | 6 |
| 6 | 研究生_命_起源 | 6 |
計算平均長(cháng)度后為:
| 編號 | chunk | 長(cháng)度 | 平均長(cháng)度 |
| 4 | 研究_生命_起源 | 6 | 2 |
| 6 | 研究生_命_起源 | 6 | 2 |
使用規則2過(guò)濾后得到2個(gè)chunk,如下:
| 編號 | chunk | 長(cháng)度 | 平均長(cháng)度 |
| 4 | 研究_生命_起源 | 6 | 2 |
| 6 | 研究生_命_起源 | 6 | 2 |
計算標準差的平方后為:
| 編號 | chunk | 長(cháng)度 | 平均長(cháng)度 | 標準差的平方 |
| 4 | 研究_生命_起源 | 6 | 2 | 0 |
| 6 | 研究生_命_起源 | 6 | 2 | 4/9 |
使用規則3過(guò)濾后得到1個(gè)chunk,如下:
| 編號 | chunk | 長(cháng)度 | 平均長(cháng)度 | 標準差的平方 |
| 4 | 研究_生命_起源 | 6 | 2 | 0 |
匹配過(guò)程終止。最終取“研究”成詞,以相同的方法繼續處理“生命起源”。
分詞效果:
研究_生命_起源_
研究生_教育_
詞匯長(cháng)度:
默認為5個(gè)UTF-8漢字,如果需要修改,可以如下操作:1. 打開(kāi):mmseg源代碼/css/segmenter.cpp2. 修改:#define MAX_TOKEN_LENGTH 15 //3*53. 重新編譯mmseg和coreseekcoreseek 中文分詞核心配置:
請參考:中文分詞核心配置mmseg.ini配置:(請將其放置到詞典文件uni.lib所在的目錄,并在文件結尾空兩行)
[mmseg]merge_number_and_ascii=0number_and_ascii_joint=compress_space=1seperate_number_ascii=0
配置說(shuō)明:【因為Sphinx-0.9.9發(fā)生變化,導致mmseg.ini的字母和數字切分規則部分無(wú)法正常應用,故暫停使用;下一版本將徹底解決該問(wèn)題】merge_number_and_ascii : ;合并英文和數字 abc123/x;如果0,則abc123切分為abc、123;如果1,則abc123為一個(gè)整體;【暫停使用】number_and_ascii_joint : 定義可以連接英文和數字的字符;該字符將把英文和數字作為一個(gè)整體處理;如果設置為-,則abc-123將被切分為abc123;【繼續有效】compress_space : 預留暫不支持seperate_number_ascii : 將數字打散;如果0,則123為一個(gè)整體;如果1,則123切分為1、2、3;【暫停使用】mmseg 同義詞/復合分詞處理:
mmseg 3.2.13版本開(kāi)始,提供了類(lèi)似復合分詞的處理方式,供coreseek進(jìn)行調用。其基本使用狀況為:詞庫包含: 南京西路、南京、西路索引時(shí): 文本中的“南京西路”會(huì )被同時(shí)索引為以上三者查詢(xún)時(shí): 輸入南京西路,可以直接匹配南京西路,而不匹配南京或者西路; 輸入南京或者西路,也可以搜索到南京西路用法:1. 處理unigram.txt生成同義詞庫文件mmseg-3.2.13源代碼/script/build_thesaurus.py unigram.txt > thesaurus.txt2. 生成同義詞詞典mmseg -t thesaurus.txt3. 將thesaurus.lib放到uni.lib同一目錄4. coreseek索引時(shí),會(huì )自動(dòng)進(jìn)行復合分詞處理;調用搜索時(shí),輸入查詢(xún)字符串則不進(jìn)行復合分詞處理,以確保查詢(xún)準確度。如果使用默認的詞庫,沒(méi)有做過(guò)自定義,則可以直接下載thesaurus.lib,放到uni.lib所在目錄!
聯(lián)系客服