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

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からJUMANを使う@CentOS7


JUMANは、京都大学黒橋・河原研究室で開発されている日本語の形態素解析システムです。これを入れると、日本語の形態素解析ができます。(雑な説明でごめんなさい)
今回のざっくりとした環境は下記のとおりです。CentOS7は最小インストールした直後の状態を想定しています。
  • JUMAN 7.01
  • Python 3.4
  • CentOS 7.3

準備

コンパイルしてインストールしますので、gccを入れておいてください。
yum install bzip2 gcc
yum install epel-release
yum install python34 python34-devel python34-pip

JUMANのインストール

ダウンロードしてコンパイルしてインストールするだけです。あまり迷うところもないような気がします。
mkdir download
mkdir src cd download/ wget 'http://nlp.ist.i.kyoto-u.ac.jp/DLcounter/lime.cgi?down=http://nlp.ist.i.kyoto-u.ac.jp/nl-resource/juman/juman-7.01.tar.bz2&name=juman-7.01.tar.bz2' -O juman-7.01.tar.bz2 cd ~/src tar xvf ../download/juman-7.01.tar.bz2 cd juman-7.01/ ./configure make make install
実行すると下記のような出力を得ることができます。
echo "これは、テストです。" | juman
これ これ これ 指示詞 7 名詞形態指示詞 1 * 0 * 0 NIL
は は は 助詞 9 副助詞 2 * 0 * 0 NIL
、 、 、 特殊 1 読点 2 * 0 * 0 NIL
テスト てすと テスト 名詞 6 サ変名詞 2 * 0 * 0 "代表表記:テスト/てすと カテゴリ:抽象物 ドメイン:教育・学習"
です です だ 判定詞 4 * 0 判定詞 25 デス列基本形 27 NIL
。 。 。 特殊 1 句点 1 * 0 * 0 NIL
EOS

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

あとは、Pythonから呼び出せるようにWrapperをインストールするだけです。PyKNPというPythonバインディングをインストールすることになりますが、pipでは入りませんので、京都大学からダウンロードして、インストールします。また、Pythonのsixというライブラリも必要になりますので、あらかじめインストールしておきます。(sixはPython2とPython3の互換ライブラリです)
pip3 install six
cd ~/download/
wget 'http://nlp.ist.i.kyoto-u.ac.jp/DLcounter/lime.cgi?down=http://lotus.kuee.kyoto-u.ac.jp/nl-resource/pyknp/pyknp-0.3.tar.gz&name=pyknp-0.3.tar.gz' -O pyknp-0.3.tar.gz
cd ~/src/
tar xzvf ../download/pyknp-0.3.tar.gz
cd pyknp-0.3/
python3 setup.py install
テストプログラムを作ります。
ファイル: test.py
from pyknp import Juman

j = Juman()
r = j.analysis('これは、テストです。')
for m in r.mrph_list():
    print (m.midasi, m.yomi, m.genkei, m.hinsi, m.bunrui, m.katuyou1, m.katuyou2, m.imis, m.repname)
無事動作することが確認できました。
python3 test.py 
これ これ これ 指示詞 名詞形態指示詞 * * NIL
は は は 助詞 副助詞 * * NIL
、 、 、 特殊 読点 * * NIL
テスト てすと テスト 名詞 サ変名詞 * * 代表表記:テスト/てすと カテゴリ:抽象物 ドメイン:教育・学習 テスト/てすと
です です だ 判定詞 * 判定詞 デス列基本形 NIL
。 。 。 特殊 句点 * * NIL
JUMANは、Wikipediaから辞書を持ってきているようですので、MeCabと違って辞書などを登録しなくとも新しめの単語を認識することができます。
echo "クラウド"|juman

クラウド クラウド クラウド 名詞 6 普通名詞 1 * 0 * 0 "自動獲得:Wikipedia Wikipedia多義"
EOS