Edited at

NLP(自然言語処理)ライブラリGiNZAとJanomeを比較してみた。


はじめに

つい先日GiNZAというNLPライブラリが公開されたので、既存のライブラリと性能を比較してみました。

比較対象はJanome。


サンプルテキスト

比較に用いた文字列はWikipediaにある原子力発電のページ

https://ja.wikipedia.org/wiki/原子力発電

上記のページでページ全体を選択してコピペして利用しました。


Janome

https://mocobeta.github.io/janome/

インストールは以下のコマンドを実行。

pip install janome

テストコードは以下のとおり。

from time import time

txt = """

原子力発電
出典: フリー百科事典『ウィキペディア(Wikipedia)』
ナビゲーションに移動検索に移動
〜中略〜
最終更新 2019年4月30日 (火) 14:38 (日時は個人設定で未設定ならばUTC)。
テキストはクリエイティブ・コモンズ 表示-継承ライセンスの下で利用可能です。追加の条件が適用される場合があります。詳細は利用規約を参照してください。
プライバシー・ポリシーウィキペディアについて免責事項開発者Cookieに関する声明モバイルビュー
Wikimedia Foundation Powered by MediaWiki
"""

t1 = time()

from janome.tokenizer import Tokenizer

t2 = time()

t = Tokenizer()
tokens = t.tokenize(txt.replace(' ',' '))

t_janome = ""
i = 0

for token in tokens:
if token.surface != "\n":
t_janome += " " + token.surface
i += 1

print(i, time() - t1, time() - t2)

実行結果は以下のとおり。

27935, 3.574777126312256, 3.574641227722168

検出した形態素は27,935個で、経過時間は3.57秒。


GiNZA

https://megagonlabs.github.io/ginza/

インストールは以下のコマンドを実行。

pip install "https://github.com/megagonlabs/ginza/releases/download/v1.0.2/ja_ginza_nopn-1.0.2.tgz"

テストコードは以下のとおり。

from time import time

txt = """

原子力発電
出典: フリー百科事典『ウィキペディア(Wikipedia)』
ナビゲーションに移動検索に移動
〜中略〜
最終更新 2019年4月30日 (火) 14:38 (日時は個人設定で未設定ならばUTC)。
テキストはクリエイティブ・コモンズ 表示-継承ライセンスの下で利用可能です。追加の条件が適用される場合があります。詳細は利用規約を参照してください。
プライバシー・ポリシーウィキペディアについて免責事項開発者Cookieに関する声明モバイルビュー
Wikimedia Foundation Powered by MediaWiki
"""

t1 = time()

import spacy

nlp = spacy.load('ja_ginza_nopn')

t2 = time()

doc = nlp(txt)

t_ginza = ""
i = 0

for sent in doc.sents:

for token in sent:

if token.orth_ != "\n":
t_ginza += " " + token.orth_
i += 1

print(i, time() - t1, time() - t2)

実行結果は以下のとおり。

25665, 18.349574089050293, 17.297925233840942

検出した形態素は25,665個で、経過時間は18.34秒。


考察

圧倒的にJanomeが早いです。

ただ、単語の分析はGiNZAの方が良いような印象をうけました。

例えば、「経済産業省」という単語をJanomeは「経済 産業 省」と分けましたが、GiNZAは「経済産業省」という一つの単語として認識していました。

文章に依存する話ではありますが、目的に応じて使い分けると良いかなと感じます。

ということで、次は何するかな(^-^)