安全圈 | 专注于最新网络信息安全讯息新闻

首页

用mecab打造一套實用的中文分詞系統

作者 trentadue 时间 2020-02-27
all

MeCab是一套日文分詞(形態分析)和詞性標注系統(Yet Another Part-of-Speech and Morphological Analyzer),rick曾經在這裡分享過MeCab的官方檔案中文翻譯:日文分詞器Mecab檔案,這款日文分詞器基於條件隨機場打造,有著諸多優點,譬如程式碼基於C++實現,基本內嵌CRF++程式碼,詞典檢索的算灋和資料結構均使用雙數組Double-Array,性能優良,並通過SWIG提供多種語言調用介面,可擴展性和通用性都非常不錯:

mecab(http://mecab.sourceforge.net/)是奈良先端科學技術大學院的工藤拓開發的日文分詞系統,該作者寫過多個machine learning方面的套裝軟體,最有名的就是CRF++,現時該作者在[email protected]工作。

mecab是基於CRF的一個日文分詞系統,程式碼使用c++實現,基本上內嵌了CRF++的程式碼,同時提供了多種指令碼語言調用的介面(python,perl,ruby等).整個系統的架構採用通用泛化的設計,用戶可以通過設定檔定制CRF訓練中需要使用的特徵範本。甚至,如果你有中文的分詞語料作為訓練語料,可以在該架構下按照其設定檔的規範定制一個中文的分詞系統。

日文NLP界有幾個有名的開源分詞系統,Juman,Chasen,Mecab. Juman和Chasen都是比較老的系統了,Mecab系統比較新,在很多方面都優於Juman和Chasen,mecab現時開發也比較活躍。Mecab雖然使用CRF實現,但是解析效率上確相當高效,據作者的介紹,Mecab比基於HMM的Chasen的解析速度要快。筆者在一臺Linux機器上粗略測試過其速度,將近達到2MB/s,完全達到了工程應用的需求,該系統現時在日文NLP界被廣泛使用。

我們曾經介紹過一個非常初級的CRF中文分詞實現方案:中文分詞入門之字標注法4,基於CRF++實現了一個Toy級別的CRF中文分詞系統,但是還遠遠不夠。在仔細看過這篇日文分詞系統MeCab的中文檔案並親測之後,不得不贊這真是一個理想的CRF分詞系統,除了上述所說的優點之外,在使用上它還支持Nbest輸出,多種輸出格式,全切分模式,系統詞典和用戶詞典定制等等,難怪這套分詞系統在日本NLP界被廣泛使用。

MeCab的諸多優點以及它的通用性一直深深吸引著我,但是除了日文資料,相關的中文或英文資料相當匱乏,曾經嘗試過基於MeCab的中文翻譯檔案以及程式碼中測試用例中的例子來訓練一套中文分詞系統,但是第一次以失敗告終。這幾天,由於偶然的因素又一次撿起了MeCab,然後通過Google及Google翻譯發現了這篇日文文章《MeCabで中國語の形態素解析(分かち書き)をしてみる》,雖其是日語所寫,但是主旨是通過MeCab構造一套中文(貌似是繁體)形態(中文分詞+詞性標注)分析系統,給了我很大的幫助。所以接下來,我會基於這篇文章的提示以及rick翻譯檔案中第八節“從原始詞典/語料庫做參數估計”的參攷,同時結合backoff2005中微軟研究院的中文分詞語料來訓練一套極簡的中文分詞系統,至於MeCab的相關介紹及安裝使用請參攷日文分詞器Mecab檔案,這裡不再贅述。以下是我在Mac OS下的操作記錄,同理可推廣制Linux下,至於Windows下,請自行測試。一些中文分詞的背景知識可參攷這裡過往的相關文章:中文分詞。

0、首先在和SIGHAN backoff2005的相關語料icwb2-data的同層次目錄裏建立一個msr_mecab_test目錄:

mkdir msr_mecab_testcd msr_mecab_test

然後在這個目錄下分別建立三個子目錄:seed,final,script:

mkdir seedmkdir finalmkdir script

1、準備Seed詞典

MeCab的詞典是CSV格式的. Seed詞典和用於發佈的詞典的格式基本上是相同的.

以下是詞典的詞條條目的例子.

進學校,0,0,0,名詞,一般,*,*,*,*,進學校,シンガクコウ,シンガクコー梅暦,0,0,0,名詞,一般,*,*,*,*,梅暦,ウメゴヨミ,ウメゴヨミ気圧,0,0,0,名詞,一般,*,*,*,*,気圧,キアツ,キアツ水中翼船,0,0,0,名詞,一般,*,*,*,*,水中翼船,スイチュウヨクセン,スイチューヨクセン前面4個欄位是必須的,

表層形(詞條本身)左連接狀態號右連接狀態號cost

我們的詞典源來自於icwb2-data/gold/msr_training_words.utf8,由於不含詞性等其他資訊,這裡我們提供一個非常簡單的Seed詞條格式,如下所示:1123項,0,0,0,0,0,0義演,0,0,0,0,0,0佳釀,0,0,0,0,0,0沿街,0,0,0,0,0,0老理,0,0,0,0,0,0三四十歲,0,0,0,0,0,0解波,0,0,0,0,0,0統建,0,0,0,0,0,0蓓蕾,0,0,0,0,0,0李佑生,0,0,0,0,0,0

1123项,0,0,0,0,0,0
义演,0,0,0,0,0,0
佳酿,0,0,0,0,0,0
沿街,0,0,0,0,0,0
老理,0,0,0,0,0,0
三四十岁,0,0,0,0,0,0
解波,0,0,0,0,0,0
统建,0,0,0,0,0,0
蓓蕾,0,0,0,0,0,0
李佑生,0,0,0,0,0,0

這裡提供一個python腳本用於製作seed詞典:make_mecab_seed_data.py:

可以將這個腳本拷貝到script目錄下,然後進入到seed目錄,執行python ../script/make_mecab_seed_data.py ../../icwb2-data/gold/msr_training_words.utf8 msr_words.csv即可得到MeCab所需的Seed詞典。

2、準備設定檔在seed目錄下準備5個最基礎的設定檔,分別是dicrc,char.def,unk.def,rewrite.def,feature.def,這5個設定檔我主要參攷自上述那篇日文文章,略作修改,其具體解釋可參攷中文翻譯檔案中的詳細描述:

1)dicrc:該檔案中設定詞典的各種動作的,以下為最小配寘:

cost-factor = 800bos-feature = BOS/EOS,*,*,*,*,*,*,*,*eval-size = 6unk-eval-size = 4config-charset = UTF-8

cost-factor = 800
bos-feature = BOS/EOS,*,*,*,*,*,*,*,*
eval-size = 6
unk-eval-size = 4
config-charset = UTF-8

2)char.def:定義未登陸詞處理的檔案.通常日語的詞法分析是基於字元的種類處理未登陸詞,Mecab中哪個文字屬於哪個字元種類,用戶可以進行細緻的指定;對於每個字元類別,需要採用哪種未登陸詞的識別處理,也可以進行詳細的定義。

DEFAULT 0 1 0 # DEFAULT is a mandatory category!SPACE 0 1 0CJK 0 0 2

DEFAULT 0 1 0 # DEFAULT is a mandatory category!
SPACE 0 1 0
CJK 0 0 2

宇宙空間\ \ 35;Do not remove this line,0x0020 is reserved for space0x00d0 space0x0009 space0x000B space0x000A space

# SPACE
0x0020 SPACE # DO NOT REMOVE THIS LINE, 0x0020 is reserved for SPACE
0x00D0 SPACE
0x0009 SPACE
0x000B SPACE
0x000A SPACE

3)unk.def:用於未登陸詞的詞典。

DEFAULT,0,0,0,unk,*,*SPACE,0,0,0,unk,*,*CJK,0,0,0,unk,*,*

DEFAULT,0,0,0,unk,*,*
SPACE,0,0,0,unk,*,*
CJK,0,0,0,unk,*,*

4)rewrite.def:定義從特徵列到內部狀態特徵列的轉換映射。[unigram rewrite]*,*,* $1,$2,$3

[unigram rewrite]
*,*,* $1,$2,$3

[左重寫]*,*,*$1,$2,$3

[left rewrite]
*,*,* $1,$2,$3

[左重寫]*,*,*$1,$2,$3

[右重寫]*,*,*$1,$2,$3

[right rewrite]
*,*,* $1,$2,$3

5)feature.def:該檔案中定義了從內部狀態的素生列中抽取CRF的素生列的範本

UNIGRAM W0:%F[6]UNIGRAM W1:%F[0]/%F[6]UNIGRAM W2:%F[0],%F?[1]/%F[6]UNIGRAM W3:%F[0],%F[1],%F?[2]/%F[6]UNIGRAM W4:%F[0],%F[1],%F[2],%F?[3]/%F[6]

UNIGRAM W0:%F[6]
UNIGRAM W1:%F[0]/%F[6]
UNIGRAM W2:%F[0],%F?[1]/%F[6]
UNIGRAM W3:%F[0],%F[1],%F?[2]/%F[6]
UNIGRAM W4:%F[0],%F[1],%F[2],%F?[3]/%F[6]

UNIGRAM T0:%tUNIGRAM T1:%F[0]/%tUNIGRAM T2:%F[0],%F?[1] /%tUNIGRAM T3:%F[0],%F[1],%F?[2] /%tUNIGRAM T4:%F[0],%F[1],%F[2],%F?[3] %噸

UNIGRAM T0:%t
UNIGRAM T1:%F[0]/%t
UNIGRAM T2:%F[0],%F?[1]/%t
UNIGRAM T3:%F[0],%F[1],%F?[2]/%t
UNIGRAM T4:%F[0],%F[1],%F[2],%F?[3]/%t

UNIGRAM T0:%tUNIGRAM T1:%F[0]/%tUNIGRAM T2:%F[0],%F?[1] /%tUNIGRAM T3:%F[0],%F[1],%F?[2] /%tUNIGRAM T4:%F[0],%F[1],%F[2],%F?[3] %噸

BIGRAM B00:%L[0]/%R[0]BIGRAM B01:%L[0],%L?[1] /%R[0]雙RAM B02:%L[0]/%R[0],%R?[1] BIGRAM B03:%L[0]/%R[0],%R[1],%R?[2] BIGRAM B04:%L[0],%L?[1] /%R[0],%R[1],%R?[2] BIGRAM B05:%L[0]/%R[0],%R[1],%R[2],%R?[3] BIGRAM B06:%L[0],%L?[1] /%R[0],%R[1],%R[2],%R?[三]

BIGRAM B00:%L[0]/%R[0]
BIGRAM B01:%L[0],%L?[1]/%R[0]
BIGRAM B02:%L[0]/%R[0],%R?[1]
BIGRAM B03:%L[0]/%R[0],%R[1],%R?[2]
BIGRAM B04:%L[0],%L?[1]/%R[0],%R[1],%R?[2]
BIGRAM B05:%L[0]/%R[0],%R[1],%R[2],%R?[3]
BIGRAM B06:%L[0],%L?[1]/%R[0],%R[1],%R[2],%R?[3]

3、準備訓練語料

用於訓練的數據,和MeCab的輸出是相同格式的,

太郎名詞,固有名詞,人名,名,*,*,太郎,タロウ,タローは助詞,系助詞,*,*,*,*,は,ハ,ワ花子名詞,固有名詞,人名,名,*,*,花子,ハナコ,ハナコが助詞,格助詞,一般,*,*,*,が,ガ,ガ好き名詞,形容動詞語幹,*,*,*,*,好き,スキ,スキだ助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ.記號,句點,*,*,*,*,.,.,.EOS焼酎名詞,一般,*,*,*,*,焼酎,ショウチュウ,ショーチュー好き名詞,形容動詞語幹,*,*,*,*,好き,スキ,スキの助詞,連體化,*,*,*,*,の,ノ,ノ親父名詞,一般,*,*,*,*,親父,オヤジ,オヤジ.記號,句點,*,*,*,*,.,.,.EOS…Tab鍵分隔的第一個部分為詞條表層文字,隨後是CSV格式的特徵列,句子結束標誌為只包行EOS的行.

我們的中文分詞訓練語料來源於icwb2-data/training/msr_training.utf8,和詞典格式一樣,我們提供一份格式非常簡單的用於MeCab訓練的分詞語料,如下所示:

“0,0,0,0,0,0人們0,0,0,0,0,0常0,0,0,0,0,0說0,0,0,0,0,0生活0,0,0,0,0,0是0,0,0,0,0,0一0,0,0,0,0,0部0,0,0,0,0,0教科書0,0,0,0,0,0,0,0,0,0,0,0

“ 0,0,0,0,0,0
人们 0,0,0,0,0,0
常 0,0,0,0,0,0
说 0,0,0,0,0,0
生活 0,0,0,0,0,0
是 0,0,0,0,0,0
一 0,0,0,0,0,0
部 0,0,0,0,0,0
教科书 0,0,0,0,0,0
, 0,0,0,0,0,0

同樣提供一個可用於語料格式轉換的腳本:make_mecab_train_data.py

可將其拷貝到script目錄下,然後執行python ../script/make_mecab_train_data.py ../../icwb2-data/training/msr_training.utf8 corpus即可。

4、生成訓練用的二進位詞典

好了,目前為止,我們需要訓練用的詞典,設定檔及訓練語料已準備就緒:

seed詞典(CSV格式檔案集合)所有的設定檔(char.def,unk.def,rewrite.def,feature.def)訓練用的數據(檔名:corpus)

在seed目錄下運行以下命令,生成學習用的二進位詞典:

/usr/local/libexec/mecab/mecab-dict-index

也可以通過-d,-o選項指定輸入輸出目錄來運行該命令/usr/local/libexec/mecab/mecab-dict-index -d \$WORK/seed -o \$WORK/seed-d:包含seed詞典和設定檔的目錄(預設為目前的目錄)-o:訓練用二進位詞典的輸出目錄(預設為目前的目錄)

執行過程如下:

./pos-id.def is not found. minimum setting is usedreading ./unk.def…3emitting double-array: 100% |###########################################|./model.def is not found. skipped../pos-id.def is not found. minimum setting is usedreading ./msr_words.csv…88119emitting double-array: 100% |###########################################|./matrix.defis not found. minimum setting is used.reading ./matrix.def…1x1

./pos-id.def is not found. minimum setting is used
reading ./unk.def ... 3
emitting double-array: 100% |###########################################|
./model.def is not found. skipped.
./pos-id.def is not found. minimum setting is used
reading ./msr_words.csv ... 88119
emitting double-array: 100% |###########################################|
./matrix.def is not found. minimum setting is used.
reading ./matrix.def ... 1x1

完成!

done!

5、CRF模型參數訓練

在seed目錄下執行如下命令,訓練CRF模型:/usr/local/libexec/mecab/mecab-cost-train -c 1.0 corpus model

可以使用-d參數指定使用的詞典/usr/local/libexec/mecab/mecab-cost-train -d \$WORK/seed -c 1.0 \$WORK/seed/corpus \$WORK/seed/model-d:包含訓練用二進位詞典的目錄(預設為目前的目錄)-c: CRF的超參數(hyper-parameter)-f:特徵頻率的閾值-p NUM:實行NUM個並行訓練(預設為1)corpus:訓練數據檔名model:輸出CRF參數檔名

這個訓練過程需要一會兒時間,最終的輸出大致如下:

adding virtual node: 0,0,0,0,0,0adding virtual node: 0,0,0,0,0,0adding virtual node: 0,0,0,0,0,0adding virtual node: 0,0,0,0,0,0…Number of sentences: 86918Number of features: 28eta: 0.00005freq: 1eval-size: 6unk-eval-size: 4threads: 1charset: EUC-JPC(sigma^2):1.00000

adding virtual node: 0,0,0,0,0,0
adding virtual node: 0,0,0,0,0,0
adding virtual node: 0,0,0,0,0,0
adding virtual node: 0,0,0,0,0,0
...
Number of sentences: 86918
Number of features: 28
eta: 0.00005
freq: 1
eval-size: 6
unk-eval-size: 4
threads: 1
charset: EUC-JP
C(sigma^2): 1.00000

=891815.15638差值=0.03530iter=5誤差=0.13537 F=0.97672.00403iter=10 err=0.07276 F=0.99114 target=833719.13204 diff=0.00211 ter=1199266目標=831599.69205差异=0.00005iter=16錯誤=0.06502 F=0.99274目標=831544.40251差异=0.00007iter=17錯誤=0.06480 F=0.99279目標=831518.14668差异=0.00003iter=18錯誤=0.06475 F=0.99280目標=831504.33361差异=0.00002iter=19錯誤=0.06470 F=0.99281目標=831502.92263差异=0.00000

iter=0 err=0.29595 F=0.94870 target=2267078.26396 diff=1.00000
iter=1 err=0.13623 F=0.97665 target=1056367.13470 diff=0.53404
iter=2 err=0.13849 F=0.97610 target=1005496.50043 diff=0.04816
iter=3 err=0.14630 F=0.97388 target=924449.25300 diff=0.08060
iter=4 err=0.13693 F=0.97643 target=891815.15638 diff=0.03530
iter=5 err=0.13537 F=0.97672 target=869032.52748 diff=0.02555
iter=6 err=0.11850 F=0.98127 target=854787.02218 diff=0.01639
iter=7 err=0.10803 F=0.98411 target=845031.70611 diff=0.01141
iter=8 err=0.08712 F=0.98848 target=838863.46990 diff=0.00730
iter=9 err=0.07940 F=0.99001 target=835481.49751 diff=0.00403
iter=10 err=0.07276 F=0.99114 target=833719.13204 diff=0.00211
iter=11 err=0.06556 F=0.99263 target=833462.32905 diff=0.00031
iter=12 err=0.06569 F=0.99258 target=831886.20533 diff=0.00189
iter=13 err=0.06568 F=0.99259 target=831739.11465 diff=0.00018
iter=14 err=0.06559 F=0.99262 target=831643.59710 diff=0.00011
iter=15 err=0.06531 F=0.99266 target=831599.69205 diff=0.00005
iter=16 err=0.06502 F=0.99274 target=831544.40251 diff=0.00007
iter=17 err=0.06480 F=0.99279 target=831518.14668 diff=0.00003
iter=18 err=0.06475 F=0.99280 target=831504.33361 diff=0.00002
iter=19 err=0.06470 F=0.99281 target=831502.92263 diff=0.00000

=891815.15638差值=0.03530iter=5誤差=0.13537 F=0.97672.00403iter=10 err=0.07276 F=0.99114 target=833719.13204 diff=0.00211 ter=1199266目標=831599.69205差异=0.00005iter=16錯誤=0.06502 F=0.99274目標=831544.40251差异=0.00007iter=17錯誤=0.06480 F=0.99279目標=831518.14668差异=0.00003iter=18錯誤=0.06475 F=0.99280目標=831504.33361差异=0.00002iter=19錯誤=0.06470 F=0.99281目標=831502.92263差异=0.00000

完成!正在寫入模型檔案。。。

Done! writing model file ... model is not a binary model. reopen it as text mode...
reading ./unk.def ... 3
reading ./msr_words.csv ... 88119
emitting ../final/left-id.def/ ../final/right-id.def
emitting ../final/unk.def ... 3
emitting ../final/msr_words.csv ... 88119
emitting matrix : 100% |###########################################|
emitting matrix : 133% |########################################### copying ./char.def to ../final/char.def
copying ./rewrite.def to ../final/rewrite.def
copying ./dicrc to ../final/dicrc
copying ./feature.def to ../final/feature.def
copying model to ../final/model.def

完成!

done!

也可以使用-d -o選項指定詞典/usr/local/libexec/mecab/mecab-dict-gen -o \$WORK/final -d \$WORK/seed -m \$WORK/seed/model-d:包含seed詞典和設定檔的目錄(預設為目前的目錄)-o:用於發佈的詞典的輸出目錄-m: CRF的參數檔案用於發佈的詞典,必須輸出到和seed詞典不同的目錄,通常把包含發佈詞典的final目錄打包之後用於發佈.

7、生成用於解析器的詞典進入到final目錄下cd ../final執行/usr/local/libexec/mecab/mecab-dict-index

reading ./unk.def…3emitting double-array: 100% |###########################################|./pos-id.def is not found. minimum setting is usedreading ./msr_words.csv…88119emitting double-array: 100% |###########################################| reading ./matrix.def…3x3emitting matrix:100%|###########################################|

reading ./unk.def ... 3
emitting double-array: 100% |###########################################|
./pos-id.def is not found. minimum setting is used
reading ./msr_words.csv ... 88119
emitting double-array: 100% |###########################################|
reading ./matrix.def ... 3x3
emitting matrix : 100% |###########################################|

完成!

done!

也可以使用-d -o選項指定詞典usr/local/libexec/mecab/mecab-dict-index -d \$WORK/final -o \$WORK/final-d:包含seed詞典和設定檔的目錄(預設為目前的目錄)-o:用於解析器的二進位詞典的輸出目錄(預設為目前的目錄)

至此,MeCab中文分詞所需的詞典和模型檔案準備就緒,都在final目錄下,可以測試一下,回到上一層目錄(cd ..),然後執行

mecab -d ./final/

讓MeCab加載中文分詞所需的相關詞典檔案,待加載完畢,輸入一行中文句子:

揚帆遠東做與中國合作的先行

回車後我們得到逐行的分詞結果,和輸入的訓練檔案格式相似:

揚帆0,0,0遠東0,0,0做0,0,0與0,0,0中國0,0,0合作0,0,0的0,0,0先行0,0,0EOS

如果想得到NBest的輸出結果,可以這樣執行:

mecab -d ./final/ -N2揚帆遠東做與中國合作的先行揚帆0,0,0遠東0,0,0做0,0,0與0,0,0中國0,0,0合作0,0,0的0,0,0先行0,0,0EOS揚帆0,0,0遠東0,0,0做0,0,0與0,0,0中0,0,0國0,0,0合作0,0,0的0,0,0先行0,0,0EOS

如果想得到單行的分詞結果,可以這樣執行:

mecab -d ./final/ -O wakati揚帆遠東做與中國合作的先行揚帆遠東做與中國合作的先行

如果想直接對檔案分詞,可以這樣執行:

mecab -d ./final/ INPUT -o OUTPUT

基於以上資訊,我們可以利益backoff2005的評估腳本來評估本次分詞的結果,首先利用mecab對msr的測試檔案進行中文分詞:

mecab -d ./final/ -O wakati ../icwb2-data/testing/msr_test.utf8 -o msr_test.mecab

然後用測試腳本來評估MeCab的中文分詞結果檔案msr_test.mecab的準確率和召回率,執行:

../icwb2-data/scripts/score ../icwb2-data/gold/msr_training_words.utf8 ../icwb2-data/gold/msr_test_gold.utf8 msr_test.mecab > msr_test.mecab.score

最終的結果如下:=== SUMMARY:=== TOTAL INSERTIONS: 4984=== TOTAL DELETIONS: 474=== TOTAL SUBSTITUTIONS: 4828=== TOTAL NCHANGE: 10286=== TOTAL TRUE WORD COUNT: 106873=== TOTAL TEST WORD COUNT: 111383=== TOTAL TRUE WORDS RECALL: 0.950=== TOTAL TEST WORDS PRECISION: 0.912=== F MEASURE: 0.931=== OOV Rate: 0.026=== OOV Recall Rate: 0.000=== IVRecall Rate: 0.976### msr_test.mecab 4984 474 4828 10286 106873 111383 0.950 0.912 0.931 0.026 0.000 0.976

=== SUMMARY:
=== TOTAL INSERTIONS: 4984
=== TOTAL DELETIONS: 474
=== TOTAL SUBSTITUTIONS: 4828
=== TOTAL NCHANGE: 10286
=== TOTAL TRUE WORD COUNT: 106873
=== TOTAL TEST WORD COUNT: 111383
=== TOTAL TRUE WORDS RECALL: 0.950
=== TOTAL TEST WORDS PRECISION: 0.912
=== F MEASURE: 0.931
=== OOV Rate: 0.026
=== OOV Recall Rate: 0.000
=== IV Recall Rate: 0.976
### msr_test.mecab 4984 474 4828 10286 106873 111383 0.950 0.912 0.931 0.026 0.000 0.976

我們得到一個準確率91.2%,召回率95%,F值為93.1%的中文分詞器。當然,這只是一個初步測試,還有許多工作要做,譬如添加詞典,添加語料,設計特徵範本等等。

我們再說一下如何在Python中調用MeCab進行中文分詞,其他各種語言的綁定的安裝方法參見perl/README,ruby/README,python/README,java/README),寫得很清楚。首先下載mecab-python-0.996.tar.gz,一路解壓安裝,安裝成功後打開python解譯器,這裡使用ipython:

In [1]:import sys

In [1]: import sys

In [2]:import MeCabIn [3]:m = MeCab.Tagger(“-d ./final/ -O wakati”)In [4]:m.parse(“揚帆遠東做與中國合作的先行”)Out[4]:'\xe6\x89\xac\xe5\xb8\x86 \xe8\xbf\x9c\xe4\xb8\x9c \xe5\x81\x9a \xe4\xb8\x8e \xe4\xb8\xad\xe5\ x9b\xbd \xe5\x90\x88\xe4\xbd\x9c \xe7\x9a\x84 \xe5\x85\x88\xe8\xa1\x8c \n'

In [2]: import MeCab

In [3]: m = MeCab.Tagger("-d ./final/ -O wakati")

In [4]: m.parse("扬帆远东做与中国合作的先行")
Out[4]: '\xe6\x89\xac\xe5\xb8\x86 \xe8\xbf\x9c\xe4\xb8\x9c \xe5\x81\x9a \xe4\xb8\x8e \xe4\xb8\xad\xe5\x9b\xbd \xe5\x90\x88\xe4\xbd\x9c \xe7\x9a\x84 \xe5\x85\x88\xe8\xa1\x8c \n'

In [2]:import MeCab

In [3]:m = MeCab.Tagger(“-d ./final/ -O wakati”)

In [4]:m.parse(“揚帆遠東做與中國合作的先行”)Out[4]:'\xe6\x89\xac\xe5\xb8\x86 \xe8\xbf\x9c\xe4\xb8\x9c \xe5\x81\x9a \xe4\xb8\x8e \xe4\xb8\xad\xe5\x9b\xbd \xe5\x90\x88\xe4\xbd\x9c \xe7\x9a\x84 \xe5\x85\x88\xe8\xa1\x8c \n'

In [5]:print m.parse(“揚帆遠東做與中國合作的先行”)揚帆遠東做與中國合作的先行

In [5]: print m.parse("扬帆远东做与中国合作的先行")
扬帆 远东 做 与 中国 合作 的 先行

最後再說一下之所以說實用,並不是說馬上給出一個實用的中文分詞系統,而是在這個通用的分詞框架下,我們可以做很多有趣的事情和測試,最終定制屬於我們自己的實用的中文分詞和詞性標注系統,也歡迎大家一起來探索。

注:原創文章,轉載請注明出處“我愛自然語言處理”:www.52nlp.cn

本文連結位址:http://www.52nlp.cn/用mecab打造一套實用的中文分詞系統

一個能聊天有趣有AI的NLP公眾號