最近ずっとMeCabの話が続いていますがまたMeCabの話です。今回の記事では辞書に登録されていない単語を辞書に追加する方法を紹介します。
今日時点の情報ですが、neologdの更新が2020年9月14日を最後に止まってしまっている今となっては非常に重要なテクニックだと思います。
MeCab辞書への単語登録については、こちらのページに記載されています。
参考: 単語の追加方法
ただし、主に文字コード周りの問題もありこちらのドキュメントをただそのまま実行してもうまくいきませんでした。入手したファイルの文字コード変換などドキュメントにない手順も実行しているので、この記事を参考に作業される方は慎重に自己責任で行ってください。
単語の追加は、「システム辞書」へ追加する方法と「ユーザ辞書」へ追加する方法の二つがあります。速度等の面で「システム辞書」への追加の方がメリットがあるようなのです。しかし、まだ慣れないうちにそちらを書き換えてしまうのは怖いのでシステム辞書は初期設定のまま残したいのと、登録内容を変えながら色々試したいので、まずはユーザ辞書を使う方法を試してみます。
サンプルのテキストは、前回の制約付き解析機能の記事で適当に作った
「このブログはクラウド環境で動いています」を使いましょう。
IPA辞書では、「ブログ」と「クラウド」が未知語です。%sで形態素種別を出すと、ブログが1(未知語)で、クラウドも辞書にないのでクラとウドに分かれてるのがわかりますね。
$ mecab -F %m\\t%s\\t%H\\n
このブログはクラウド環境で動いています
この 0 連体詞,*,*,*,*,*,この,コノ,コノ
ブログ 1 名詞,一般,*,*,*,*,*
は 0 助詞,係助詞,*,*,*,*,は,ハ,ワ
クラ 0 名詞,固有名詞,一般,*,*,*,クラ,クラ,クラ
ウド 0 名詞,一般,*,*,*,*,ウド,ウド,ウド
環境 0 名詞,一般,*,*,*,*,環境,カンキョウ,カンキョー
で 0 助詞,格助詞,一般,*,*,*,で,デ,デ
動い 0 動詞,自立,*,*,五段・カ行イ音便,連用タ接続,動く,ウゴイ,ウゴイ
て 0 助詞,接続助詞,*,*,*,*,て,テ,テ
い 0 動詞,非自立,*,*,一段,連用形,いる,イ,イ
ます 0 助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
EOS
さて、単語の追加方法の記事に従って、辞書データを作っていきましょう。ついでなのですが、このブログのタイトルの「分析ノート」も登録しておきます。
辞書のもとになる語彙ファイル名は sample.csv としました。作業場所は任意のディレクトリで良いようです。
辞書のフォーマットは、
表層形,左文脈ID,右文脈ID,コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用型,活用形,原形,読み,発音
ですが、コスト値や文脈IDが空のCSVファイルをもとにそれらを埋メタファイルを生成してくれる -a オプションというのがあるようなので、それを使う前提で左右文脈IDとコストの3列は空にします。
作ったCSVファイルをcatしたのが以下です。IPA辞書のデータを見る限りでは、最後に改行をつけないようにし、ファイル末尾に空行ができないようにした方が良さそうです。
$ cat sample.csv
ブログ,,,,名詞,一般,*,*,*,*,ブログ,ブログ,ブログ
クラウド,,,,名詞,一般,*,*,*,*,クラウド,クラウド,クラウド
分析ノート,,,,名詞,固有名詞,一般,*,*,*,分析ノート,ブンセキノート,ブンセキノート
次に、コストの自動推定の準備をしていきます。モデルファイルと辞書データが必要です。
まずモデルファイルというのが必要なので、ドキュメントにあるリンクから入手してください。直接ダウンロードす場合はここ。mecab-ipadic-2.7.0-20070801.model.bz2 というファイル名で手に入り、bz2という拡張子でわかる通り、bzip2という方法で圧縮されているので解凍しておきます。また、文字コードがEUC-JPなので、UTF-8に変換しておきます。(この種の手順がドキュメントにない手順です。)
$ bunzip2 mecab-ipadic-2.7.0-20070801.model.bz2
# 解凍したファイルがあることを見る
$ ls
mecab-ipadic-2.7.0-20070801.model
# 文字コード確認
$ nkf -g mecab-ipadic-2.7.0-20070801.model
EUC-JP
# 文字コード変換
$ nkf -w --overwrite mecab-ipadic-2.7.0-20070801.model
また、このモデルファイルの中(6行目)に、文字コードがeuc-jpだと設定されている部分があるので、utf-8に書き換えておきます。
$ vim mecab-ipadic-2.7.0-20070801.model
# 元の6行目
charset: euc-jp
# 以下の内容に変更して保存
charset: utf-8
次に、システム辞書のデータを入手しておきます。実はいつも使っているHomebrewで入れたコンパイル済みのIPA辞書のデータを使えると思っていたのですが、後に紹介するコスト推定コマンドで、以下のエラーが出ました。
no such file or directory: /usr/local/lib/mecab/dic/ipadic/feature.def
IPA辞書をHomebrewで入れると、feature.def ファイルが辞書フォルダにないみたいですね。
コンパイル前の辞書データについては、以前の記事で書きました通り入手できます。記事の通り文字コードの変換も必要なのでやっておきましょう。
参考: MeCabのIPA辞書の中身を確認する
こちらのページから、mecab-ipadic-2.7.0-20070801.tar.gzをダウンロードして展開しておきます。(Macはダブルクリックで展開可能)
参考: MeCab: Yet Another Part-of-Speech and Morphological Analyzer
文字コードを変換して、辞書フォルダにおいておきます。
(コンパイル前の辞書データ一式だけあればいいのかと思っていたのですが、コンパイル済みの各ファイル群はそれはそれで必要らしいので、不足していたfeature.defをそこに持っていきます)
$ cd mecab-ipadic-2.7.0-20070801
$ nkf -w --overwrite feature.def
$ cp feature.def /usr/local/lib/mecab/dic/ipadic/
$ ls /usr/local/lib/mecab/dic/ipadic/
{辞書ディレクトリ}/ipadic/配下の他のファイル群は、実体がCellarディレクトリ配下にあり、リンクになっているのですが、feature.defだけ実態がここに置かれることになり嫌な感じです。しかし、今回は一旦これで進めます。
これで、 CSVファイル、モデルファイル、辞書データの3つが揃いました。
さて、ここからコマンドで作業していきます。
ドキュメントでは、
/usr/local/libexec/mecab/mecab-dict-index
というコマンドが叩かれていますが、MacにHomeBrewでインストールした場合はパスが変わります。
こちらの記事に探し方書いてますので、コマンドのパスはこちらから探してください。
参考: MeCabの設定ファイルや辞書、ツールの配置場所をコマンドで取得する
僕の環境では、以下のパスでした。
/usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index
一応コマンドのヘルプも見ておきます。
$ /usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index -h
MeCab: Yet Another Part-of-Speech and Morphological Analyzer
Copyright(C) 2001-2012 Taku Kudo
Copyright(C) 2004-2008 Nippon Telegraph and Telephone Corporation
Usage: /usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index [options] files
-d, --dicdir=DIR set DIR as dic dir (default ".")
-o, --outdir=DIR set DIR as output dir (default ".")
-m, --model=FILE use FILE as model file
-u, --userdic=FILE build user dictionary
-a, --assign-user-dictionary-costs only assign costs/ids to user dictionary
-U, --build-unknown build parameters for unknown words
-M, --build-model build model file
-C, --build-charcategory build character category maps
-s, --build-sysdic build system dictionary
-m, --build-matrix build connection matrix
-c, --charset=ENC make charset of binary dictionary ENC (default EUC-JP)
-t, --charset=ENC alias of -c
-f, --dictionary-charset=ENC assume charset of input CSVs as ENC (default EUC-JP)
-w, --wakati build wakati-gaki only dictionary
-p, --posid assign Part-of-speech id
-F, --node-format=STR use STR as the user defined node format
-v, --version show the version and exit.
-h, --help show this help and exit.
それでは、先ほど作った辞書のcsvファイルに、文脈IDとコストを埋めていきましょう。
以下のようにファイルやディレクトリがあるのを確認してコマンドを組み立てていきます。
(本当は他にも作業中に出たフィルがありますが省略。)
$ ls
mecab-ipadic-2.7.0-20070801.model
sample.csv
出来上がったコマンドが以下です。sample2.csv というファイルにコストや品詞IDが埋まったデータを出力します。(ブログ幅の影響で見た目が複数行になってしまっていますが1行で打ち込むか、改行をエスケープするかしてください。)
$ /usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index -m mecab-ipadic-2.7.0-20070801.model -d /usr/local/lib/mecab/dic/ipadic -u sample2.csv -f utf-8 -t utf-8 -a sample.csv
以下のように出力され、 sample2.csvファイルが出来上がります。 中を見ると、抜けてたデータが補完されているのがわかります。
mecab-ipadic-2.7.0-20070801.model is not a binary model. reopen it as text mode...
reading sample.csv ...
done!
# 出来上がったファイルの中身を見る
$ cat sample2.csv
ブログ,1285,1285,3285,名詞,一般,*,*,*,*,ブログ,ブログ,ブログ
クラウド,1285,1285,3285,名詞,一般,*,*,*,*,クラウド,クラウド,クラウド
分析ノート,1288,1288,8019,名詞,固有名詞,一般,*,*,*,分析ノート,ブンセキノート,ブンセキノート
いよいよこの左右品詞idと正規コストのそろったデータからユーザ辞書を作ります。
コマンドは以下の通りです。
$ /usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index -d /usr/local/lib/mecab/dic/ipadic -u sample.dic -f utf-8 -t utf-8 sample2.csv
# 以下出力
reading sample2.csv ... 3
emitting double-array: 100% |###########################################|
done!
sample.dic ってファイルが出来上がります。
出来上がったユーザ辞書を利用するときは、 -u オプションで辞書ファイルを指定します。
システム辞書を指定する -d は 辞書があるディレクトリを指定、ユーザ辞書を指定する -u は辞書ファイルを指定という違いがあるので注意してください。
念の為helpを抜粋しておきます。
$ mecab --help
MeCab: Yet Another Part-of-Speech and Morphological Analyzer
Copyright(C) 2001-2012 Taku Kudo
Copyright(C) 2004-2008 Nippon Telegraph and Telephone Corporation
Usage: mecab [options] files
-d, --dicdir=DIR set DIR as a system dicdir
-u, --userdic=FILE use FILE as a user dictionary
では使ってみましょう。未知語で無くなっているのを見るために形態素種別(%s)も表示します。
$ mecab -F %m\\t%s\\t%H\\n -u sample.dic
このブログはクラウド環境で動いています
この 0 連体詞,*,*,*,*,*,この,コノ,コノ
ブログ 0 名詞,一般,*,*,*,*,ブログ,ブログ,ブログ
は 0 助詞,係助詞,*,*,*,*,は,ハ,ワ
クラウド 0 名詞,一般,*,*,*,*,クラウド,クラウド,クラウド
環境 0 名詞,一般,*,*,*,*,環境,カンキョウ,カンキョー
で 0 助詞,格助詞,一般,*,*,*,で,デ,デ
動い 0 動詞,自立,*,*,五段・カ行イ音便,連用タ接続,動く,ウゴイ,ウゴイ
て 0 助詞,接続助詞,*,*,*,*,て,テ,テ
い 0 動詞,非自立,*,*,一段,連用形,いる,イ,イ
ます 0 助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
EOS
想定通りきちんと動作しましたね。