ラベル MeCab の投稿を表示しています。 すべての投稿を表示
ラベル MeCab の投稿を表示しています。 すべての投稿を表示

2017年9月18日月曜日

形態素解析の速度比較

日本語形態素解析の速度比較をしてみました。
環境は、仮想マシン上でXeon 2コアを割り当てた4GBのメモリとSSDのストレージを使った環境です。
解析対象はWikipediaExtractorで分割したWikipediaのデータ5MB分です。

正確性でいけばJUMAN++なんでしょうが、やっぱり速さとの関係上、大量のドキュメント処理するにはMeCabかなという心象です。あとで試験してみたところkuromojiもなかなかに早いです。
実行したコマンド 実行時間
chasen -iw 2.525s
mecab -Owakati 2.330s
mecab -Owakati -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd 2.435s
mecab -Ochasen 4.098s
mecab -Ochasen -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd 3.887s
juman 30.607s
juman++ 10782.644s
kuromoji 4.862s
janome 716.016s
Janomeとkuromojiを加えました。
kuromojiはやい!


グラフ化してみるとこんな感じでした。(縦軸が対数になっているので注意してください。)

Janomeのテスト用コード

Janomeについては、テスト用に標準入力を受け取るようにコードを作ってパイプで繋げて計測しました。
ファイル: test_janome.py
import sys
from janome.tokenizer import Tokenizer

t = Tokenizer()
for line in sys.stdin:
    tokens = t.tokenize(line, wakati=True)
    print(" ".join(tokens))


kuromojiのテスト用コード

kuromojiについては、exampleディレクトリの下に、ちょうどいいサンプルがついてきますので、そのコードををほんの少し変更し、こちらもパイプで繋げて計測しました。
ファイル: TokenizerExample.java
package org.atilika.kuromoji.example;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;

import org.atilika.kuromoji.Token;
import org.atilika.kuromoji.Tokenizer;
import org.atilika.kuromoji.Tokenizer.Mode;

public class TokenizerExample {

        public static void main(String[] args) throws IOException {
                Tokenizer tokenizer;
                if (args.length == 1) {
                        Mode mode = Mode.valueOf(args[0].toUpperCase());
                        tokenizer = Tokenizer.builder().mode(mode).build();
                } else if (args.length == 2) {
                        Mode mode = Mode.valueOf(args[0].toUpperCase());
                        tokenizer = Tokenizer.builder().mode(mode).userDictionary(args[1]).build();
                } else {
                        tokenizer = Tokenizer.builder().build();
                }
                BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
                String line;
                while ((line = reader.readLine()) != null) {
                        List result = tokenizer.tokenize(line);
                        for (Token token : result) {
                                System.out.print(token.getSurfaceForm() + " ");
                        }
                }
        }
}

2017年9月9日土曜日

Python3からMeCabを使う@CentOS7


MeCabをソースからインストールします。
groongaのリポジトリ追加に抵抗がない場合は、そちらでも良いと思います。

今回のざっくりとした環境は下記のとおりです。CentOS7は最小インストールした直後の状態を想定しています。
  • CentOS 7.3
  • Python 3.4
  • mecab 0.996
  • ipadic 2.7.0-20070801

準備

Python3.4を入れるためにEPELのリポジトリを入れます。 あと、gcc-c++が入っていないと、./configureした際に「configure: error: Your compiler is not powerful enough to compile MeCab.」とエラーが出ますので、gcc-c++もインストールしておきます。
yum install epel-release
yum install python34 python34-devel python34-pip
yum install gcc gcc-c++
yum install wget

MeCab本体のインストール

まずは、本体のインストールを行います。ついでに辞書もダウンロードしてきます。configureのオプションでutf-8を入れるのを忘れないようにします。
mkdir download
mkdir src
cd download
wget 'https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7cENtOXlicTFaRUE' -O mecab-0.996.tar.gz
wget 'https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7MWVlSDBCSXZMTXM' -O mecab-ipadic-2.7.0-20070801.tar.gz
cd ~/src
tar xzvf ../download/mecab-0.996.tar.gz
cd mecab-0.996/
./configure --with-charset=utf8
make
make install
辞書を入れる前に実行してみるとエラーが出ます・・・。
mecab
param.cpp(69) [ifs] no such file or directory: /usr/local/lib/mecab/dic/ipadic/dicrc

MeCab辞書のインストール

辞書のconfigureオプションにもutf-8を指定します。
cd ..
tar xvzf ../download/mecab-ipadic-2.7.0-20070801.tar.gz
cd mecab-ipadic-2.7.0-20070801/
./configure --with-charset=utf8
make
sudo make install
とりあえず実行してみて、下記のように分解されればインストールは終了です。
echo "これは、テストです。"|mecab
これ    名詞,代名詞,一般,*,*,*,これ,コレ,コレ
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
、      記号,読点,*,*,*,*,、,、,、
テスト  名詞,サ変接続,*,*,*,*,テスト,テスト,テスト
です    助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
。      記号,句点,*,*,*,*,。,。,。
EOS

Pythonバインディングのインストール

次にPython3から呼び出せるように環境を整えていきます。pipでmecab-python3というライブラリを入れます。
pip3 install mecab-python3
ld.so.confを編集して2行目を加えます。
ファイル: /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/local/lib/ # この行を追加
ldconfigで共有ライブラリの依存関係を更新します。
ldconfig
/usr/local/lib/をld.so.confに書く前に実行すると下記のエラーが表示されます。
ImportError: libmecab.so.2: cannot open shared object file: No such file or directory
適当なプログラムを書いてみます。
ファイル: test.py
import MeCab

mecab = MeCab.Tagger("-Ochasen")
print(mecab.parse("これは、テストです。"))
実行して、先ほどと同様の結果が得られれば、成功です。
python3 test.py
これ    コレ    これ    名詞-代名詞-一般
は      ハ      は      助詞-係助詞
、      、      、      記号-読点
テスト  テスト  テスト  名詞-サ変接続
です    デス    です    助動詞  特殊・デス      基本形
。      。      。      記号-句点
EOS
Pythonから呼び出した結果は、Tabでsplitして変数に格納して使うか、-Ochasenを-Owakachiにして空白などで結合して使うことが多いようです。 また、プログラムが古めですので、実際に使うには辞書が不足しているため、辞書を追加したほうがいいです。
echo "クラウド"|mecab
クラ    名詞,固有名詞,一般,*,*,*,クラ,クラ,クラ
ウド    名詞,一般,*,*,*,*,ウド,ウド,ウド
EOS
wikipediaの見出しを使うことが多いみたいです。

mecab-ipadic-NEologdの追加

辞書が古いので、新しい辞書を追加します。gitとpatchが必要になりますので入れておきます。
yum install git patch
mecab-ipadic-neologdをダウンロードしてインストールします。途中で、インストールするか聞かれますので、「yes」と入力してください。辞書は「/usr/local/lib/mecab/dic/mecab-ipadic-neologd」にインストールされます。
cd ~/src
git clone https://github.com/neologd/mecab-ipadic-neologd.git
cd mecab-ipadic-neologd/
./bin/install-mecab-ipadic-neologd -n
#長々とメッセージが流れた後にインストールするか聞かれます。
[install-mecab-ipadic-NEologd] : Do you want to install mecab-ipadic-NEologd? Type yes or no.
yes 
インストールが完了したら、先ほどは認識できなかった「クラウド」という単語が登録されているか確認してみます。
echo "クラウド"|mecab -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd
クラウド        名詞,固有名詞,人名,一般,*,*,CLOUD,クラウド,クラウド
EOS
Pythonから呼び出すときもこのディレクトリを含めて呼び出すことを忘れないようにしてください。
mecab = MeCab.Tagger("-Ochasen -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd")
なお、NEologdのGitHUBのページには正規化の方法が詳しく書いてあり、正規化用のPythonのコードもついていて大変参考になります。なお、この正規化をやったうえで、個人的にさらに気になる点があるとすれば、下記の部分です。
  • 数字と数字の間のカンマの削除(12,345,678とか)
  • カタカナの単位(メートルとか)
  • 100mm以上のミリメートル
  • 漢数字(11兆9000億円→11900000000000円)