Python fugashiとUniDicのユーザー辞書で形態素解析

Pythonで形態素解析器MeCabのCythonラッパーであるfugashiと形態素解析器MeCab用の解析用辞書であるUniDicを用いて形態素解析を行うことを考えたとき、UniDicをpipでインストールすることができますが、そうすると最新版でないことや、ユーザー辞書を容易に作成することができません。
そこで、ここではUniDicの最新版(2023-03-24)をダウンロードして形態素解析を行う方法と、そのユーザー辞書を作成して形態素解析を行う方法をお伝えします。

環境

今回の作業は、Windowsのwslで、python 3.13のdocker上で行っています。

UniDicのダウンロードと配置

まず最初に、UniDicの最新版を「UniDic」国語研短単位自動解析用辞書よりダウンロードしておきます。
UniDicには現代書き言葉や現代話し言葉、解析用の軽量版や辞書再学習用のフルパッケージ版などいくつもの種類があります。
ここでは、ユーザー辞書を作成するので、現代書き言葉の最新フルパッケージ版のunidic-cwj-202302_full.zipをダウンロードし、使用することにします。
ダウンロード後、適当なディレクトリを作成し、zipファイルを展開しておきます。今回は、unidic-cwj-202302_fullディレクトリに展開しました。


ls -lh

total 7.6G
-rw-r--r-- 1 1000 1000  766 Mar 14  2023 README_unidic-cwj_full.txt
-rw-r--r-- 1 1000 1000 257K Feb 21  2023 char.bin
-rw-r--r-- 1 1000 1000 4.3K Feb 21  2023 char.def
-rw-r--r-- 1 1000 1000  695 Feb 21  2023 dicrc
-rw-r--r-- 1 1000 1000 8.6K Feb 21  2023 feature.def
-rw-r--r-- 1 1000 1000 1.6M Feb 21  2023 left-id.def
-rw-r--r-- 1 1000 1000 224M Feb 21  2023 lex.csv
drwxr-xr-x 2 1000 1000 4.0K Jul  9 14:57 license
-rw-r--r-- 1 1000 1000 763M Feb 21  2023 matrix.bin
-rw-r--r-- 1 1000 1000 5.9G Feb 21  2023 matrix.def
-rw-r--r-- 1 1000 1000  79M Feb 21  2023 model.bin
-rw-r--r-- 1 1000 1000 364M Feb 21  2023 model.def
-rw-r--r-- 1 1000 1000 4.8K Feb 21  2023 rewrite.def
-rw-r--r-- 1 1000 1000 1.8M Feb 21  2023 right-id.def
-rw-r--r-- 1 1000 1000 232M Feb 21  2023 sys.dic
-rw-r--r-- 1 1000 1000 2.4K Feb 21  2023 unk.def
-rw-r--r-- 1 1000 1000 5.7K Feb 21  2023 unk.dic

動作確認

ダウンロードしたUniDicを使用して、fugashiの動作確認をします。


from fugashi import GenericTagger

tagger = GenericTagger('-d unidic-cwj-202302_full -r unidic-cwj-202302_full/dicrc')
text = '麩菓子は、麩を主原料とした日本の伝統的な駄菓子です。'
print(tagger.parse(text))

麩      名詞,普通名詞,一般,*,*,*,フ,麩,麩,ブ,麩,ブ,漢,フ濁,濁音形,*,*,*,*,体,ブ,ブ,ブ,フ,0,C3,*,17839859662209536,64901
菓子    名詞,普通名詞,一般,*,*,*,カシ,菓子,菓子,カシ,菓子,カシ,漢,カ濁,基本形,*,*,*,*,体,カシ,カシ,カシ,カシ,1,C1,*,1758677472256512,6398
は      助詞,係助詞,*,*,*,*,ハ,は,は,ワ,は,ワ,和,*,*,*,*,*,*,係助,ハ,ハ,ハ,ハ,*,"動詞%F2@0,名詞%F1,形容詞%F2@-1",*,8059703733133824,29321
、      補助記号,読点,*,*,*,*,*,、,、,*,、,*,記号,*,*,*,*,*,*,補助,*,*,*,*,*,*,*,6605693395456,24
麩      名詞,普通名詞,一般,*,*,*,フスマ,麩,麩,フスマ,麩,フスマ,和,*,*,*,*,*,*,体,フスマ,フスマ,フスマ,フスマ,"0,3",C2,*,18052890040082944,65676
を      助詞,格助詞,*,*,*,*,ヲ,を,を,オ,を,オ,和,*,*,*,*,*,*,格助,ヲ,ヲ,ヲ,ヲ,*,"動詞%F2@0,名詞%F1,形容詞%F2@-1",*,11381878116459008,41407
主      名詞,普通名詞,一般,*,*,*,シュ,主,主,シュ,主,シュ,漢,*,*,*,*,*,*,体,シュ,シュ,シュ,シュ,1,C3,*,4403827570778624,16021
原料    名詞,普通名詞,一般,*,*,*,ゲンリョウ,原料,原料,ゲンリョー,原料,ゲンリョー,漢,*,*,*,*,*,*,体,ゲンリョウ,ゲンリョウ,ゲンリョウ,ゲンリョウ,3,C2,*,3235046710452736,11769
と      助詞,格助詞,*,*,*,*,ト,と,と,ト,と,ト,和,*,*,*,*,*,*,格助,ト,ト,ト,ト,*,"名詞%F1,動詞%F1,形容詞%F2@-1",*,7099014038299136,25826
し      動詞,非自立可能,*,*,サ行変格,連用形-一般,スル,為る,し,シ,する,スル,和,*,*,*,*,*,*,用,シ,スル,シ,スル,0,C5,*,5370298291593857,19537
た      助動詞,*,*,*,助動詞-タ,連体形-一般,タ,た,た,タ,た,タ,和,*,*,*,*,*,*,助動,タ,タ,タ,タ,*,"動詞%F2@1,形容詞%F4@-2",*,5948916285711041,21642
日本    名詞,固有名詞,地名,国,*,*,ニッポン,日本,日本,ニッポン,日本,ニッポン,固,*,*,*,*,*,*,国,ニッポン,ニッポン,ニッポン,ニッポン,3,*,*,7821659499274752,28455
の      助詞,格助詞,*,*,*,*,ノ,の,の,ノ,の,ノ,和,*,*,*,*,*,*,格助,ノ,ノ,ノ,ノ,*,名詞%F1,*,7968444268028416,28989
伝統    名詞,普通名詞,一般,*,*,*,デントウ,伝統,伝統,デントー,伝統,デントー,漢,*,*,*,*,*,*,体,デントウ,デントウ,デントウ,デントウ,0,C2,*,7089659599528448,25792
的      接尾辞,形状詞的,*,*,*,*,テキ,的,的,テキ,的,テキ,漢,*,*,*,*,*,*,接尾相,テキ,テキ,テキ,テキ,*,C4,*,6892847018156544,25076
な      助動詞,*,*,*,助動詞-ダ,連体形-一般,ダ,だ,な,ナ,だ,ダ,和,*,*,*,*,*,*,助動,ナ,ダ,ナ,ダ,*,名詞%F1,*,6299110739157697,22916
駄      接頭辞,*,*,*,*,*,ダ,駄,駄,ダ,駄,ダ,漢,*,*,*,*,*,*,接頭,ダ,ダ,ダ,ダ,*,P2,*,6301034884506112,22923
菓子    名詞,普通名詞,一般,*,*,*,カシ,菓子,菓子,カシ,菓子,カシ,漢,カ濁,基本形,*,*,*,*,体,カシ,カシ,カシ,カシ,1,C1,*,1758677472256512,6398
です    助動詞,*,*,*,助動詞-デス,終止形-一般,デス,です,です,デス,です,デス,和,*,*,*,*,*,*,助動,デス,デス,デス,デス,*,"形容詞%F2@-1,動詞%F2@0,名詞%F2@1",*,7051468750332587,25653
。      補助記号,句点,*,*,*,*,*,。,。,*,。,*,記号,*,*,*,*,*,*,補助,*,*,*,*,*,*,*,6880571302400,25
EOS

UniDicのユーザー辞書を作成

fugashiは形態素解析器MeCabのCythonラッパーなので、UniDicのユーザー辞書の作成は実際にはMeCabで行うことになり、左文脈IDや右文脈ID、コストの値があらかじめ必要になります。しかし、これらの値を求めるのは大変なので、ここではMeCabのコストの自動推定機能を使うことにします。ただ、このコストの自動推定もひと手間加えないと上手くいきません。

matrix.defの退避

matrix.defのコピーをmatrix.def.copyとしてとっておきます。

matrix.defの書き換え

matrix.defの1行目に記載されている値を確認します。


head -n 1 matrix.def

21202 18859

この2つの値が逆順になっているようなので、手動で書き換えます。


sed -i -e "1c18859 21202" matrix.def

エントリのCSV

エントリのCSVを準備します。ここでは、「麩菓子」で一つの単位として扱われるようにします。user_unidic.csvとして保存しておきます。


麩菓子,,,,名詞,普通名詞,一般,*,*,*,フガシ,麩菓子,麩菓子,フガシ,麩菓子,フガシ,漢,*,*,*,*,*,*,体,フガシ,フガシ,フガシ,フガシ,*,*,*,*,*

コストの自動推定

先ほど作成したuser_unidic.csvを元にコストの自動推定を行います。コストの自動推定後のCSVをuser_unidic_completion.csvとして出力することにします。


fugashi-build-dict -m unidic-cwj-202302_full/model.bin -d unidic-cwj-202302_full -u user_unidic_completion.csv -a user_unidic.csv

コストの自動推定後のCSVは次のようになりました。


麩菓子,16563,17911,9916,名詞,普通名詞,一般,*,*,*,フガシ,麩菓子,麩菓子,フガシ,麩菓子,フガシ,漢,*,*,*,*,*,*,体,フガシ,フガシ,フガシ,フガシ,*,*,*,*,*

退避したmatrix.defを元に戻す

退避しておいたmatrix.def.copyをmatrix.defに戻します。

ユーザー辞書の作成

先ほど作成したuser_unidic_completion.csvを使って、ユーザー辞書user_unidic.dicを作成するには次のようにします。


fugashi-build-dict -d unidic-cwj-202302_full -u user_unidic.dic user_unidic_completion.csv

/usr/local/bin/fugashi-build-dict -f utf8 -t utf8 -d unidic-cwj-202302_full -u user_unidic.dic user_unidic_completion.csv
unidic-cwj-202302_full/pos-id.def is not found. minimum setting is used
reading user_unidic_completion.csv ... 1
emitting double-array: 100% |###########################################| 

done!

ユーザー辞書を使って形態素解析する

作成したユーザー辞書user_unidic.dicを使って形態素解析するには次のようにします。


from fugashi import GenericTagger

tagger = GenericTagger('-d unidic-cwj-202302_full -r unidic-cwj-202302_full/dicrc -u user_unidic.dic')
text = '麩菓子は、麩を主原料とした日本の伝統的な駄菓子です。'
print(tagger.parse(text))

麩菓子  名詞,普通名詞,一般,*,*,*,フガシ,麩菓子,麩菓子,フガシ,麩菓子,フガシ,漢,*,*,*,*,*,*,体,フガシ,フガシ,フガシ,フガシ,*,*,*,*,*
は      助詞,係助詞,*,*,*,*,ハ,は,は,ワ,は,ワ,和,*,*,*,*,*,*,係助,ハ,ハ,ハ,ハ,*,"動詞%F2@0,名詞%F1,形容詞%F2@-1",*,8059703733133824,29321
、      補助記号,読点,*,*,*,*,*,、,、,*,、,*,記号,*,*,*,*,*,*,補助,*,*,*,*,*,*,*,6605693395456,24
麩      名詞,普通名詞,一般,*,*,*,フスマ,麩,麩,フスマ,麩,フスマ,和,*,*,*,*,*,*,体,フスマ,フスマ,フスマ,フスマ,"0,3",C2,*,18052890040082944,65676
を      助詞,格助詞,*,*,*,*,ヲ,を,を,オ,を,オ,和,*,*,*,*,*,*,格助,ヲ,ヲ,ヲ,ヲ,*,"動詞%F2@0,名詞%F1,形容詞%F2@-1",*,11381878116459008,41407
主      名詞,普通名詞,一般,*,*,*,シュ,主,主,シュ,主,シュ,漢,*,*,*,*,*,*,体,シュ,シュ,シュ,シュ,1,C3,*,4403827570778624,16021
原料    名詞,普通名詞,一般,*,*,*,ゲンリョウ,原料,原料,ゲンリョー,原料,ゲンリョー,漢,*,*,*,*,*,*,体,ゲンリョウ,ゲンリョウ,ゲンリョウ,ゲンリョウ,3,C2,*,3235046710452736,11769
と      助詞,格助詞,*,*,*,*,ト,と,と,ト,と,ト,和,*,*,*,*,*,*,格助,ト,ト,ト,ト,*,"名詞%F1,動詞%F1,形容詞%F2@-1",*,7099014038299136,25826
し      動詞,非自立可能,*,*,サ行変格,連用形-一般,スル,為る,し,シ,する,スル,和,*,*,*,*,*,*,用,シ,スル,シ,スル,0,C5,*,5370298291593857,19537
た      助動詞,*,*,*,助動詞-タ,連体形-一般,タ,た,た,タ,た,タ,和,*,*,*,*,*,*,助動,タ,タ,タ,タ,*,"動詞%F2@1,形容詞%F4@-2",*,5948916285711041,21642
日本    名詞,固有名詞,地名,国,*,*,ニッポン,日本,日本,ニッポン,日本,ニッポン,固,*,*,*,*,*,*,国,ニッポン,ニッポン,ニッポン,ニッポン,3,*,*,7821659499274752,28455
の      助詞,格助詞,*,*,*,*,ノ,の,の,ノ,の,ノ,和,*,*,*,*,*,*,格助,ノ,ノ,ノ,ノ,*,名詞%F1,*,7968444268028416,28989
伝統    名詞,普通名詞,一般,*,*,*,デントウ,伝統,伝統,デントー,伝統,デントー,漢,*,*,*,*,*,*,体,デントウ,デントウ,デントウ,デントウ,0,C2,*,7089659599528448,25792
的      接尾辞,形状詞的,*,*,*,*,テキ,的,的,テキ,的,テキ,漢,*,*,*,*,*,*,接尾相,テキ,テキ,テキ,テキ,*,C4,*,6892847018156544,25076
な      助動詞,*,*,*,助動詞-ダ,連体形-一般,ダ,だ,な,ナ,だ,ダ,和,*,*,*,*,*,*,助動,ナ,ダ,ナ,ダ,*,名詞%F1,*,6299110739157697,22916
駄      接頭辞,*,*,*,*,*,ダ,駄,駄,ダ,駄,ダ,漢,*,*,*,*,*,*,接頭,ダ,ダ,ダ,ダ,*,P2,*,6301034884506112,22923
菓子    名詞,普通名詞,一般,*,*,*,カシ,菓子,菓子,カシ,菓子,カシ,漢,カ濁,基本形,*,*,*,*,体,カシ,カシ,カシ,カシ,1,C1,*,1758677472256512,6398
です    助動詞,*,*,*,助動詞-デス,終止形-一般,デス,です,です,デス,です,デス,和,*,*,*,*,*,*,助動,デス,デス,デス,デス,*,"形容詞%F2@-1,動詞%F2@0,名詞%F2@1",*,7051468750332587,25653
。      補助記号,句点,*,*,*,*,*,。,。,*,。,*,記号,*,*,*,*,*,*,補助,*,*,*,*,*,*,*,6880571302400,25
EOS

「麩菓子」で一つの単位として扱われるようになりました。

参考