MeCabで漢字のフリガナを取得
MSエクセルだと環境によってですがPHONETIC関数やVBAのApplication.GetPhonetic関数で、漢字を含む文字列の「読み」をカタカナ変換することができます。 これをMSエクセルのない環境で処理したいと思って形態素解析器であるMeCabを使って実現しました。
形態素解析器
日本語のセンテンスを単語単位に分解するアプリを、形態素解析器と呼びます。オープンソースで使えるものの中で有名なものにMeCabがあります。Windows用のバイナリは辞書も付属していて手軽に利用できますのでこちらを使いたいと思います。
他、現在もメンテナンスが行われているオープンソースの形態素解析器にはSudachiがあります。
MeCabはGPLライセンス他(ライセンスの詳細はこちらに記されています)、SudachはApache Licenseで提供されています。
辞書
MeCabにしてもSudachiにしても、辞書が重要になります。これは通常使う「辞書」の意味に似ていて、単語の品詞や読みをデータ化して保持しているファイルです。
MeCabのWindows用のバイナリにはIPADICという辞書が付属していますが、他にもいくつかの辞書データに対応できるような設計になっています。Sudachiの方もビルド済みの辞書が提供された上で自分でビルドすることも可能です。
またディープラーニング等でも登場する「学習」という要素があります。辞書にあるデータは単に1対1で結びつくのではなく、前後の文脈からも判断することで単語の区切りを把握します。また、MeCabでは「再学習」という機能を使って部分的に学習データを更新することが可能です。
実際の辞書においても収録単語の改廃があることからも想像がつくと思いますが、MeCabの付属の辞書は2013年のものになりますのでそのままだと、ユースケースによっては力不足になるかもしれません。
MeCabのインストール
MeCabのインストールは、Windowsなら先のサイトからダウンロードして.exeファイルを起動してウィーザードに従ってインストールします。途中文字コードを聞いてくると思いますが特に意図がなければ「Shift-JIS」を選択してください。
Windowsならデスクトップにショートカットができるので、それをクリックしたあと出てくるウインドウに文字を入力してエンターキーを押すと解析を開始します。
簡単インストール 簡単 名詞,形容動詞語幹,*,*,*,*,簡単,カンタン,カンタン インストール 名詞,一般,*,*,*,*,インストール,インストール,インストール EOS
Debian(Linux)から実行するにはechoの結果をmecabへパイプします。
echo 今日はいい天気です | mecab 今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー は 助詞,係助詞,*,*,*,*,は,ハ,ワ いい 形容詞,自立,*,*,形容詞・イイ,基本形,いい,イイ,イイ 天気 名詞,一般,*,*,*,*,天気,テンキ,テンキ です 助動詞,*,*,*,特殊・デス,基本形,です,デス,デス EOS
辞書の更新
同梱版の辞書は、古いのに加えてコンパクトサイズになっています。2013年の時点では(おそらく)存在しなかった言葉である「エモい」や、和布蕪(メカブ)という単語は辞書にヒットしていません。
エモい和布蕪 エモ 名詞,一般,*,*,*,*,* い 動詞,自立,*,*,一段,連用形,いる,イ,イ 和布 名詞,一般,*,*,*,*,和布,ワカメ,ワカメ 蕪 名詞,一般,*,*,*,*,蕪,カブラ,カブラ EOS
辞書の更新をします。MeCabではUniDicという辞書も利用可能になっています。こちらはメンテナンスが続いているようです。Unidic:「現代書き言葉」からファイルをダウンロードして展開します。
UniDicのライセンスは「クリエイティブコモンズライセンス:表示-非営利-継承(CC BY-NC-SA)」で、商用には使えないので注意が必要です。詳しくはThe UniDic Consortiumのページをご確認ください。
展開されたフォルダの中にあるファイル(フォルダ以外)をunidicフォルダに入れてC:¥Program Files (x86)¥MeCab¥dic¥フォルダに移動させます。(char.bin,char.def,dicrc,feature.def,left-id.def,lex_3_1.csv,matrix.bin,model.bin,README,rewrite.def,right-id.def,sys.dic,unk.def,unk.dic)
-dオプションでファイル群を入れたフォルダを指定して実行します。ただし、UniDicは文字コードがUTF-8で保存されていますのでそのまま実行すると文字化けしてしまいます。
コマンドプロンプト表示後「chcp 65001」と入力することで、文字コードをUTF-8に変えられるのでechoによる入力が可能になります。ただしechoによるパイプを使わないで、プロンプトを起動してしまうと文字化けしてしまいます。
Power Shell(Windows Terminalを含む)だと残念ながらうまく動かないようです。Power Shellでも「chcp 65001」とするか「$OutputEncoding = [System.Text.Encoding]::GetEncoding('utf-8')」で文字コードをUTF-8に変更することはできますが、echoの値として渡される文字コードはUTF-16(コードページ1200)となるようで文字化けが発生します。
chcp 65001を実行したコマンドプロンプトで、UniDicを使用して実行してみます。パスが通っていないので、バイナリのある場所まで移動した後に行います。
C:¥Program Files (x86)¥MeCab¥bin> echo エモい和布蕪 | .¥mecab.exe -d ..¥dic¥unidic エモい 形容詞,一般,,,形容詞,連体形-一般,エモイ,エモい,エモい,エモイ,エモい,エモイ,混,"","","","","","",相,エモイ,エモイ,エモイ,エモイ,"","","",90877668316291777,330611 和布蕪 名詞,普通名詞,一般,,,,メカブ,和布蕪,和布蕪,メカブ,和布蕪,メカブ,和,"","","","","","",体,メカブ,メカブ,メカブ,メ カブ,"1","C1","",51802124610314752,188455 EOS
辞書が変わって出力される要素も増えましたが、意図したように単語が分割されました。列の名称は-Overboseオプションを付与することで出力されるようになりますが、その日本語名は先のunidicのページに詳しい解説があります。
今回利用したバージョンでの出力順は次のようになっていました。
- surface:単語
- pos1:品詞大分類
- pos2:品詞中分類
- pos3:品詞小分類
- pos4:品詞細分類
- cType:活用型
- cForm:活用形
- lForm:語彙素読み
- lemma:語彙素
- orth:書字形出現形
- pron:発音形出現形
- orthBase:書字形基本形
- pronBase:発音形基本形
- goshu:語種
- iType:語頭変化化型
- iForm:語頭変化形
- fType:語末変化化型
- fForm:語末変化形
- iConType:語頭変化結合型
- fConType:語末変化結合型
- lType:語彙素類
- kana:仮名形出現形
- kanaBase:仮名形基本形
- form:語形出現形
- formBase:語形基本形
- aType:
- aConType:
- aModType:
- lid:語彙表ID
- lemma_id:語彙素ID
フリガナを取得
出力順は、dicrc先ほどコピーして作成したフォルダ内のdicrcで定義に従っているものです。
dicrc
... node-format-unidic22= %m¥t%f[0],%f[1],%f[2],%f[3],%f[4],%f[5],%f[6],%f[7],%f[8],%f[9],%f[10],%f[11],%f[12],"%f[13]","%f[14]","%f[15]","%f[16]","%f[17]","%f[18]",%f[19],%f[20],%f[21],%f[22],%f[23],"%f[24]","%f[25]","%f[26]",%f[27],%f[28]¥ ...
この部分を%fの添え字の何番にどの列名が入っているかはファイルの中にも説明がありますが、これを分割された単語(%m)も、タブ(¥t)も,も改行(¥n)もEOSもつけず添え字20のカナだけだせば実現できそうです。
ファイルに記述のある「output-format-type =」の行ではデフォルトでnode-format-のどの設定を使うかを設定しています。デフォルトでは「unidic22」となっていますが、ここでは「yomi」という項目を追加するのに合わせてここでも設定を「yomi」にします。
bos-は開始時に挿入する文字、eos-は終了時に挿入する文字です。 unk-は辞書から取得できなかった時出力される項目となるようです。%Mにしておくとカナに変換できない場合は元の文字を返します。この挙動はエクセルのPHONETIC関数と同じですが、漢字は排除したいというような場合には空白にしておく方法もあります。
もとのフォーマットで実行したい場合は 「-O unidic22」としてフォーマットを指定することで可能です。yomi側をオプションで指定するようにしてもいいですが。
dicrc
... ; unidic22から修正 output-format-type = yomi ... ; 新規追加 node-format-yomi =%pS%f[20] unk-format-yomi = %M bos-format-yomi = eos-format-yomi = \n ...
設定の修正が終わったら先ほどと同じようにchcp 65001を実行したコマンドプロンプトで実行します。
echo エモい和布蕪 | .\mecab.exe -d ..\dic\unidic エモイメカブ echo 沙羅曼蛇 | .\mecab.exe -d ..\dic\unidic シャラ曼蛇
ファイル処理
先のように、Windows上のPower Shellからechoを使って実行すると出力が文字化けしてしまいますが、ファイルからの入力にすることでその不具合を回避することができます。変換したい文字列が行で区切られたUTF-8で書かれたテキストファイルを用意します。ちなみに、ファイル内の改行コードはCRLFでもLFでもどちらでも可能なようでした。
変換前.txt
頑張れ自分 日本海側は荒れた天気になるでしょう マスクをしていますが花粉症ではありません
先ほどまではechoとパイプを使って文字を渡していましたが、-oオプションで出力先ファイルを指定した後で、最後に変換元ファイル名を渡すことでそれを読み込む指示となります。
上記の例を実行をすると次のようになりました。
変換後.txt
ガンバレジブン ニッポンカイガワハアレタテンキニナルデショウ マスクヲシテイマスガカフンショウデハアリマセン
Sudachi
せっかくなのでSudachiの方も少しだけふれておきます。
ページから本体と「system_core.dic」という表記がある辞書ファイルをダウンロードし本体のルートフォルダ(sudachi-0.5.3.jarと同じ階層)に辞書ファイルをコピーすれば準備完了です。
こちらははJavaのアプリケーションとなっていますので、Javaランタイムが必要です。バージョン17(Debian 17-ea+19-Debian-1)と、バージョン8(Windowsの Temurin build 1.8.0_302-b08)で試してみたところどちらでも問題なく動くようでした。
使い方はjava利用する都合でjava -jarとなる以外同じ要領です。ただしSudachiではデフォルトでは読みが出力されないので-aオプションをつける必要があります。
echo 今日は猫の日です | java -jar sudachi-0.5.3.jar -a 今日 名詞,普通名詞,副詞可能,*,*,* 今日 今日 キョウ 0 [981] は 助詞,係助詞,*,*,*,* は は ハ 0 [] 猫 名詞,普通名詞,一般,*,*,* 猫 猫 ネコ 0 [] の 助詞,格助詞,*,*,*,* の の ノ 0 [] 日 名詞,普通名詞,副詞可能,*,*,* 日 日 ヒ 0 [] です 助動詞,*,*,*,助動詞-デス,終止形-一般 です です デス 0 [] EOS
Sudachiでは提供されているコマンドラインインターフェースだけで読みだけ取得することはできなさそうです。