最近、ボットに漢字を含む日本語の「読み」を解析させて遊んでいます。
前回の記事でmecab-ipadic-NEologdを使いましたが、今回は元となる辞書にipadicではなくunidicを利用しているmecab-unidic-NEologdを使ってみたので、その際のメモです。
まだ触ってみた感触だけですが、unidic版のNEologdのほうが「読み」を正しく解析できる場合が多いように思います。
mecab-unidic-NEologdの導入
mecab-unidic-NEologdを導入するために、まずはmecabとmecab-unidicをシステムに導入します。
手順については、mecab-unidic-NEologdのREADMEに詳しく書いてありますので、ここでは、OSXの場合の手順を抜粋しておきます。
1 2 3 4 5 6 7 8 9 10 11 |
# mecabとmecab-unidicと関連ツールをbrewでインストール $ brew install mecab mecab-unidic git curl xz # mecab-unidic-NEologdをgithubからクローン $ git clone --depth 1 https://github.com/neologd/mecab-unidic-neologd.git # mecab-ipadic-NEologdのインストールor更新 $ cd mecab-unidic-neologd $ ./bin/install-mecab-unidic-neologd -n # 途中でインストール可否を yes/no で聞かれます |
以上で導入が完了です。
コマンドラインから使ってみる
まずはmecabをコマンドラインから使ってみます。
コマンドに引数でmecab-unidic-NEologdのパスを渡すことで利用する辞書を変更できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# mecabの辞書のパスを確認 $ mecab-config --dicdir /usr/local/Cellar/mecab/0.996/lib/mecab/dic # さらにNEologdのディレクトリを確認 $ ls /usr/local/Cellar/mecab/0.996/lib/mecab/dic ipadic mecab-ipadic-neologd mecab-unidic-neologd unidic # 辞書を指定してmecabを実行 $ mecab -d /usr/local/Cellar/mecab/0.996/lib/mecab/dic/mecab-unidic-neologd 金曜日のスマたちへ 金曜日のスマたちへ キンヨウビノスマタチヘ キンヨウビノスマタチヘ 金曜日のスマたちへ 名詞-固有名詞-一般 EOS |
Node.jsから利用
次に、Node.jsから辞書を指定してmecabを使うためにmecab-asyncをnpmでカレントディレクトリに導入します。
1 2 |
$ npm install mecab-async |
次に、同じディレクトリに以下のunidic-neologd-test.coffeeを作ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Mecab = require 'mecab-async' mecab = new Mecab() Mecab.command = "mecab -d /usr/local/Cellar/mecab/0.996/lib/mecab/dic/mecab-unidic-neologd" mecab.parse process.argv[2], (err, result) -> console.log result readings = [] for token in result readings.push(token[1].split('\t')[0]) console.log readings |
hubotでの利用を見据えて、CoffeeScriptで実装してみました。
コマンド引数で形態素解析したい文字列を指定できます。
7行目で形態素解析の結果を、12行目で解析結果をもとに文字列の読みを出力します。
実行
前記のソースをCoffeeScriptで実行すればmecab-unidic-NEologdによる形態素解析の結果を確認できます。
NEologdの問題ではなく、mecab-ipadicとmecab-unidicの違いかと思いますが、例えば「神々」という漢字の読みが、ipadicではただしく読めていないですが、unidicの場合は読めています。
mecab-ipadic-NEologdの場合
1 2 3 4 5 6 7 |
coffee neologd-test.coffee 神々に対する総称 [ [ '神', '名詞', '一般', '*', '*', '*', '*', '神', 'カミ', 'カミ' ], [ '々', '記号', '一般', '*', '*', '*', '*', '々', '々', '々' ], [ 'に対する', '助詞', '格助詞', '連語', '*', '*', '*', 'に対する', 'ニタイスル', 'ニタイスル' ], [ '総称', '名詞', 'サ変接続', '*', '*', '*', '*', '総称', 'ソウショウ', 'ソーショー' ] ] [ 'カミ', '々', 'ニタイスル', 'ソウショウ' ] |
神々の”がみ”が読めていません。
mecab-unidic-NEologdの場合
1 2 3 4 5 6 7 |
$ coffee unidic-neologd-test.coffee 神々に対する総称 [ [ '神々', 'カミガミtカミガミt神々t名詞-普通名詞-一般tt' ], [ 'に', 'ニtニtにt助詞-格助詞tt' ], [ '対する', 'タイスルtタイスルt対するt動詞-一般tサ行変格t連体形-一般' ], [ '総称', 'ソーショーtソウショウt総称t名詞-普通名詞-サ変可能tt' ] ] [ 'カミガミ', 'ニ', 'タイスル', 'ソーショー' ] |
こちらは正しく読めています。
slackでボットを使って漢字混じりのメッセージの読みを取得する実験をしているのですが、
しばらくこのunidic版NEologdを使って試してみようと思っています。