MeCab で楽にシステム辞書に単語を追加する

11793 ワード

やりたいこと: MeCab に簡単に自分で定義した単語を使いたい

MeCab と ipadic 辞書を使っている環境で、頻繁にシステム辞書に単語を追加するスクリプトを書きました。この記事では、システム辞書の更新の仕組みとスクリプトの紹介をします。

スクリプト自体は公式に書いてあるものをそのまま使っています。(https://taku910.github.io/mecab/dic.html 「システム辞書への追加」を参照)

システム辞書とユーザ辞書の関係は前に書いた記事も見てみてください。

作業の概要

ユーザ辞書に単語を追加する場合

ソース: https://blog.apar.jp/linux/2796/, https://taku910.github.io/mecab/dic.html

ユーザ辞書を使って単語を更新していく場合、最初に dicrc で使うユーザ辞書を指定する (詳しくはこの記事)。

新しい単語を追加するときは、コストなしの CSV を作成・編集して、 mecab-dict-index でコストつきの CSV 作成と辞書ファイル (.dic) のコンパイルをする。

システム辞書に単語を追加する場合

ソース: https://blog.apar.jp/linux/2796/, https://taku910.github.io/mecab/dic.html

本題のシステム辞書への単語の追加はこの手順でやる。コストなしの CSV を作成・編集 (1) と、 mecab-dict-index でコストつきの CSV 作成 (2) まではユーザ辞書と同じ。そのあとは、ユーザ辞書をコンパイルする代わりに、システム辞書のディレクトリにコストつきの CSV を移動して (3) システム辞書を再コンパイルすると、システム辞書に追加した単語が反映される。

スクリプト

前述の内容を踏まえて、2つのスクリプトを用意する。

  • コストなし CSV → コストつき CSV の生成
  • コストつき CSV の移動・辞書の再コンパイル

コストなし CSV → コストつき CSV の生成

前提1: スクリプトファイルがあるディレクトリに UTF-8版の ipadic の辞書とモデルファイルが置いてある
前提2: コストなし CSV は UTF-8 で作成してある

作業用ディレクトリの作成ipadic 辞書のダウンロードについてはそれぞれリンク先を参照。

もし違うディレクトリに辞書を解凍していた場合、下記のスクリプトの -m オプションと -d オプションを修正する。

作業用ディレクトリ
|- add-cost.sh # このスクリプト
|- mecab-ipadic-2.7.0-20070801/ # 解凍済み ipadic
|- mecab-ipadic-2.7.0-20070801.model # モデルファイル

スクリプト

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"
$ ls
foo.csv # コストなしの CSV を作っておく
$ ./add-cost.sh foo # 拡張子なしのファイル名を与える
$ ls
foo.csv foo-cost.csv # コストつきの CSV が生成される

解説

mecab-configmecab と一緒についてくるので追加インストールは不要。 --libexecdir オプションで mecab-dict-index のディレクトリを出力してくれる。ちなみに --dicdir でシステム辞書がインストールされてるディレクトリもわかる。

そのあとのコマンドは公式「コストの自動推定機能」のセクションの通り。

コストつき CSV の移動・辞書の再コンパイル

ソース: https://taku910.github.io/mecab/dic.html 「システム辞書への追加」

前提1: このスクリプトと同じディレクトリに ipadic を解凍したものが置いてある (前のスクリプトと同じ)
前提2: 以前作成したコストつき CSV は同じ prefix を使ってる (USER_PREFIX の行)

ディレクトリ構造が違う場合は、 DICT_DIRmv の箇所を修正する。

スクリプト

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"

解説

まず前に作成された古いコストつき CSV を削除してする (ls の行)。このスクリプトでは、これまでに作成されたコストつき CSV は foo で始まることを想定している (foo-1.csv とか)

次に、新しく作成したファイルを作業用ディレクトリから辞書のディレクトリに移動して、最後に辞書ディレクトリで make install を実行して辞書を再コンパイルする。

作業用ディレクトリ
|- make-dic.sh # このスクリプト
|- foo-cost.csv # 移動前
|- mecab-ipadic-2.7.0-2007080
   |- foo-cost.csv # 移動後

全体の流れ

上の2つのスクリプトを使って、 foo.csv というコストなし CSV から辞書を修正する例。

$ cd mecab-working-dir # 作業用ディレクトリに移動
$ ls
mecab-ipadic-2.7.0-2007080 # 辞書ファイル
mecab-ipadic-2.7.0-2007080.model # モデルファイル

$ vim foo.csv
# foo.csv を作成・編集する

# コストをつける
$ ./add-cost.sh foo
$ ls
foo.csv
foo-cost.csv # コストつき CSV
mecab-ipadic-2.7.0-2007080
mecab-ipadic-2.7.0-2007080.model

# 辞書を再コンパイル
$ ./make-dic.sh foo

$ mecab
# 新しい単語が認識できるか確認

最後のステップで動作確認したらおわり🥳