Common Lispで書かれた形態素解析器cl-igo / cl-mecabを使ってみた

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で読み込もうとするとエラーになってしまう。うーむ。

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の方が若干速い。