Mecabへのユーザー辞書登録

tts

こんにちは、eQOL(イーキュオル)の山下です。

テキストを自動で読み上げるTextToSpeechが身近な存在になりつつあります。youTubeの音声が自動読み上げ音声であることも多くなりましたが、時折人間ではありえないような読み間違えがあリます。これらはあらかじめ人間が文章をチェックして読みを修正できれば問題はありませんがマンパワーが課題となります。さらにChatGPTなどの生成AIとの組み合せとなると、人間が介在して読みを補正することは現実的ではありません。生成AIが立派な文章を生成しても読み違えが起こるようでは、サービス自体への信用にも影響が出かねません。

テキストを「読み」に、そして「発声」へと変換する仕組みには、形態素解析という日本語ならではの技術が必要で、それを行う代表的なオープンソースライブラリとして知られるのがMecabです。テキストを音声に変換する日本語TextToSpeech(TTS)代表的オープンソースのOpenJTalkもMecabを利用しています。Mecabの辞書をカスタマイズしてみよう、というのか今回のブログの内容です。

MeCab で楽にシステム辞書に単語を追加する MeCab + neologd 辞書環境でユーザ辞書を追加する を参考にしています。

システム辞書(ipadic)とモデルの準備

以下の手順で作業ディレクトリを作成します。ディレクトリ名は任意です。

mkdir mecab-working-dir

https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7MWVlSDBCSXZMTXM にアクセスしてmecabのipadic辞書を作業ディレクトリにダウンロードし、以下で解凍します。

tar xvzf mecab-ipadic-2.7.0-20070801.tar.gz

次に、ユーザー辞書にcostを付加してシステム辞書と統合するためのmodelを次のURLを参考にダウンロードし、解凍します。https://taku910.github.io/mecab/dic.html

bzip2 -d mecab-ipadic-2.7.0-20070801.model.bz2

shファイルの追加

さらにこのディレクトリに以下の2つのshファイルを作成します。

add-cost.sh

# usage: supply the filename without extension to the first argument
# example: foo.csv → `./add-cost.sh foo`
DICT_INDEX_PATH=$(mecab-config --libexecdir)/mecab-dict-index
WORKING_DIR=./
FILENAME=$1

if [[ -z "$1" ]]; then
	echo "blank filename :/"
	exit 1
fi

$DICT_INDEX_PATH \
	-m "${WORKING_DIR}/mecab-ipadic-2.7.0-20070801.model" \
	-d "${WORKING_DIR}/mecab-ipadic-2.7.0-20070801" \
	-u "${FILENAME}-cost.csv" \
	-f utf-8 -t utf-8 \
	-a "${FILENAME}.csv" \
&& \
echo "added cost for ${FILENAME}.csv to ${FILENAME}-cost.csv"
make-dic.sh

# usage: supply the filename without extension to the first argument
# example: foo-cost.csv `./make-dic.sh foo`
DICT_INDEX_PATH=$(mecab-config --libexecdir)/mecab-dict-index
DICT_DIR='./mecab-ipadic-2.7.0-20070801'
FILENAME=$1
USER_PREFIX='foo' # assume all user files start with this

if [[ -z "$1" ]]; then
	echo "blank filename :/"
	exit 1
fi

cd $DICT_DIR 
OLD_FILE="${FILENAME}-cost.csv"

# remove old user definitions
ls | grep $USER_PREFIX | xargs rm

# move new file and make
mv ../"${FILENAME}-cost.csv" ./ \
&& $DICT_INDEX_PATH -f utf-8 -t utf-8 \
&& make install
echo "updated ipadic"

この時点で作業ディレクトリは

作業用ディレクトリ(mecab-working-dir)
|- add-cost.sh #ユーザー作成辞書にcostを付与するファイル
|- make-dic.sh #ユーザー作成辞書をシステム辞書に追加するファイル
|- mecab-ipadic-2.7.0-20070801/ # 解凍済み ipadicディレクトリ。この中にシステム辞書がある。
|- mecab-ipadic-2.7.0-20070801.model # モデルファイル

となっています。

ユーザー辞書csvファイルの作成

システム辞書のcsvファイルを見ると以下のような構成になっています。

仕舞い,1285,1285,5543,名詞,一般,*,*,*,*,仕舞い,シマイ,シマイ
綺,1285,1285,5622,名詞,一般,*,*,*,*,綺,アヤギヌ,アヤギヌ
洋裁,1285,1285,5618,名詞,一般,*,*,*,*,洋裁,ヨウサイ,ヨーサイ
組打ち,1285,1285,5622,名詞,一般,*,*,*,*,組打ち,クミウチ,クミウチ
畿内,1285,1285,5770,名詞,一般,*,*,*,*,畿内,キナイ,キナイ
明き家,1285,1285,5402,名詞,一般,*,*,*,*,明き家,アキヤ,アキヤ
酔,1285,1285,4879,名詞,一般,*,*,*,*,酔,ヨイ,ヨイ
乱臣,1285,1285,5622,名詞,一般,*,*,*,*,乱臣,ランシン,ランシン
シルバー,1285,1285,2925,名詞,一般,*,*,*,*,シルバー,シルバー,シルバー
放課後,1285,1285,5494,名詞,一般,*,*,*,*,放課後,ホウカゴ,ホーカゴ
漢籍,1285,1285,5622,名詞,一般,*,*,*,*,漢籍,カンセキ,カンセキ
玉髄,1285,1285,5622,名詞,一般,*,*,*,*,玉髄,ギョクズイ,ギョクズイ
・
・
・

これと同じフォーマットでユーザー辞書用csvを作成していくことになりますが、左から2、3、4番目の数字は何の意味か、新語に対してはどうすれば良いかわかりません。これを自動で設定してくれるのがadd-cost.shです。

例として、「クラエス家」を登録してみます。これをシステム辞書では「クラエスカ」と読んでしまうので「クラエスケ」で登録します。ユーザー登録csvは以下のようにします。

user.csv

クラエス家,,,,名詞,一般,*,*,*,*,クラエス家,クラエスケ,クラエスケ,追加エントリ

左から2、3、4番目は空欄にしておき、作業ディスク直下にuser.csv(ファイル名は任意)として保存します。

./add-cost.sh user #拡張子なしのファイル名

を実行すると、user-cost.csvが作成されます。

user-cost.csv

クラエス家,1285,1285,3285,名詞,一般,*,*,*,*,クラエス家,クラエスケ,クラエスケ,追加エントリ

mecab-ipadic-2.7.0-20070801.modelで計算された数字が新たに追加されました。

システム辞書へのユーザー辞書追加

作成されたuser-cost.csvファイルをmecab-ipadic-2.7.0-20070801ディレクトリに移動します。

作業用ディレクトリ(mecab-working-dir)
|- add-cost.sh #ユーザー作成辞書にcostを付与するファイル
|- make-dic.sh #ユーザー作成辞書をシステム辞書に追加するファイル
|- mecab-ipadic-2.7.0-20070801/ # 解凍済み ipadicディレクトリ。この中にシステム辞書がある。
   |- user-cost.csv #移動後
|- mecab-ipadic-2.7.0-20070801.model # モデルファイル
 |- user.csv

作業用ディレクトリにて以下を実行します。

./make-dic.sh user #-costは不要

以上でmecab-ipadic-2.7.0-20070801内のシステム辞書sys.dicが書き換えられます。

システム辞書確認

ターミナルにてmecabコマンドを実行する方法が最も簡単です。

mecab

を実行した後、「クラエス家」と入力すると、

クラエス家      名詞,一般,*,*,*,*,クラエス家,クラエスケ,クラエスケ,追加エントリ
EOS

と、システム辞書に新語が登録されていることが確認できました。