cl-igoはCommon Lispから使える形態素解析器で、辞書にはmecab互換の辞書が使える。
roswellから入るようにgithubにミラーを作ったので、
ros install masatoi/charseq masatoi/cl-igo
でインストールできる。SBCL推奨とのこと。
igoのバイナリ辞書を作る
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で読み込もうとするとエラーになってしまう。うーむ。
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の方が若干速い。