Common Lispで書かれた形態素解析器cl-igo / cl-mecabを使ってみた
cl-igoはCommon Lispから使える形態素解析器で、辞書にはmecab互換の辞書が使える。
roswellから入るようにgithubにミラーを作ったので、
ros install masatoi/charseq masatoi/cl-igo
でインストールできる。SBCL推奨とのこと。
igoのバイナリ辞書を作る
- IPA辞書をダウンロード https://sourceforge.net/projects/mecab/files/mecab-ipadic/2.7.0-20070801/
- igo-0.4.5.jarをダウンロード https://osdn.net/projects/igo/downloads/55029/igo-0.4.5.jar/
mecab-ipadic-2.7.0-20070801.tgzとigo-0.4.5.jarが同じディレクトリに入っているとして、
tar xzvf mecab-ipadic-2.7.0-20070801.tar.gz java -cp ./igo-0.4.5.jar net.reduls.igo.bin.BuildDic ipadic mecab-ipadic-2.7.0-20070801 EUC-JP
でipadicというディレクトリができている。~/igo/ipadicにでも置いておくとする。
使ってみる
(ql:quickload :igo) ;; 辞書を読み込む (igo:load-tagger "/home/wiz/igo/ipadic/") (igo:parse "庭には二羽にわとりがいる。")
(("庭" "名詞,一般,*,*,*,*,庭,ニワ,ニワ" 0) ("に" "助詞,格助詞,一般,*,*,*,に,ニ,ニ" 1) ("は" "助詞,係助詞,*,*,*,*,は,ハ,ワ" 2) ("二" "名詞,数,*,*,*,*,二,ニ,ニ" 3) ("羽" "名詞,接尾,助数詞,*,*,*,羽,ワ,ワ" 4) ("にわとり" "名詞,一般,*,*,*,*,にわとり,ニワトリ,ニワトリ" 5) ("が" "助詞,格助詞,一般,*,*,*,が,ガ,ガ" 9) ("いる" "動詞,自立,*,*,一段,基本形,いる,イル,イル" 10) ("。" "記号,句点,*,*,*,*,。,。,。" 12))
(igo:wakati "庭には二羽にわとりがいる。")
("庭" "に" "は" "二" "羽" "にわとり" "が" "いる" "。")
mecab-ipadic-neologdのインストール
mecab-ipadic-neologdは新語などを大幅に増やした辞書で、SNSのデータを分析したいようなときに重要になる。
Ubuntu14.04でのインストール例は、
# 必要パッケージをインストール sudo apt-get install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git cd mecab-ipadic-neologd/ # 途中で確認が出るのでyesを入力 ./bin/install-mecab-ipadic-neologd -n # インストール先 echo `mecab-config --dicdir`"/mecab-ipadic-neologd" # /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd # 動作確認 mecab -d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd
igoのバイナリ辞書を作る
mecab-ipadic-neologdはUTF-8のみ対応ということなので、文字コードにUTF-8を指定してバイナリ辞書を作る。
cd build/ java -cp ../../igo-0.4.5.jar net.reduls.igo.bin.BuildDic ipadic-neologd mecab-ipadic-2.7.0-20070801-neologd-20161201/ UTF-8
これでipadic-neologdというディレクトリができる。これはJava版のIgoからなら以下のようにして使える。
java -cp ../../igo-0.4.5.jar net.reduls.igo.bin.Igo ipadic-neologd
しかしCommon Lisp版はEUC-JPのみ対応のようで、igo:load-taggerで読み込もうとするとエラーになってしまう。うーむ。
cl-mecabを使ってみる
Quicklispから入るcl-mecabでneologdが使えるかどうか試してみる。
with-mecabマクロに上記のmecabのコマンドラインオプションを渡すことができる。
2019年末版 形態素解析器の比較 - Qiita にあるneko.txtで試してみる。
(time (with-open-file (f "~/Downloads/neko.txt") (labels ((iter () (let ((text (read-line f nil nil))) (if text (progn (igo:parse text) (iter)))))) (iter)))) Evaluation took: 0.088 seconds of real time 0.087601 seconds of total run time (0.087601 user, 0.000000 system) 100.00% CPU 332,963,144 processor cycles 210,504,608 bytes consed (time (cl-mecab:with-mecab ("-d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd") (with-open-file (f "~/Downloads/neko.txt") (labels ((iter () (let ((text (read-line f nil nil))) (if text (progn (cl-mecab:parse* text) (iter)))))) (iter))))) Evaluation took: 0.376 seconds of real time 0.376776 seconds of total run time (0.336570 user, 0.040206 system) 100.27% CPU 1,432,001,462 processor cycles 207,520,864 bytes consed
やはりCommon Lispネイティブな分cl-igoの方が若干速い。