【Python】GiNZAをインストールして使おうとしたらモジュールがないって怒られた

Python
スポンサーリンク
スポンサーリンク

GINZA

GiNZAとは?

Githubページ

「GiNZA」は、ワンステップでの導入、高速・高精度な解析処理、単語依存構造解析レベルの国際化対応などの特長を備えた日本語自然言語処理オープンソースライブラリです。

https://www.recruit.co.jp/newsroom/2019/0402_18331.html

Pythonで使用できる日本語用自然言語処理ライブラリです。

これを使うだけで形態素解析が簡単にできる優れもの。

また、「spaCy」を利用することで高速な処理が可能とのことです。

簡単に言うなら、処理するのは「spaCy」、日本語解析するための辞書が「GiNZA」ということでしょうか。

違うかもしれません。詳しい人指摘して。

 

GiNZAのインストール

Githubのページに書いておりますが、pipでインストールするだけです。

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

とても簡単。

これを実施するだけで、「spacy-2.1.3」と「ja-ginza-nopn-1.0.2」がインストールされます。

ちなみに、spacy-2.1.4をすでに使っている人は勝手にダウングレードされるので注意。

 

エラーについて

ここからが本題です。

GiNZAを使おうとしたらモジュールエラーを吐き、1日間無駄にした話です。

 

環境

cat /etc/redhat-release
 CentOS Linux release 7.6.1810 (Core)

uname -a
 Linux [ホスト名] 3.10.0-862.11.6.el7.x86_64 #1 SMP Tue Aug 14 21:49:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

python --version
 Python 3.6.6

pip list | grep -e ginza -e spacy
 ja-ginza-nopn     1.0.2
 spacy             2.1.3

 

テスト用プログラム

上記にてGiNZAのインストールを行い、以下のテスト用プログラムを書きました。

import spacy

def main():
  nlp = spacy.load('ja_ginza_nopn')
  doc = nlp('依存構造解析の実験を行っています。')
  for sent in doc.sents:
    for token in sent:
      print(token.i, token.orth_, token.lemma_, token.pos_, token.dep_, token.head.i)
    print('EOS')

# 直接実行されたときはmain関数を呼び出す
if __name__ == "__main__":
  main()

ほぼほぼGiNZAのgithubのサンプルコードままです。

 

エラー内容

そして実行してみる。

python ginzatest.py
ImportError: [E048] Can't import language ja_ginza from spacy.lang: No module named 'spacy.lang.ja_ginza'

あれ?

どうやら「ja_ginza」というモジュールが見つかんないです、と怒られているようです。

 

対処内容

四苦八苦した様を描き起こしておきます。

解決方法だけ見たい方は「パスを通す」という項目までスキップしてください。

 

GiNZAを再インストールしてみる

正直なんでエラーを吐いているのか全然分からなかったため、とりあえず再インストールしてみました。

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

結果、直らず。

 

spacyをアップデートしてみる

どうやらpipでインストールできるspacyの最終版は2.1.4であることを聞き、とりあえずアップデートしてみる。

pip install -U spacy
ERROR: ja-ginza-nopn 1.0.2 has requirement spacy==2.1.3, but you'll have spacy 2.1.4 which is incompatible.

なんかエラーを吐くけどおかまいなし。

GiNZAがspacy2.1.3しか対応してませんよ、ってエラーですね。

アップデート後、テストプログラムを実行してみるが直らず。

とりあえず再度2.1.4をアンインストールして元に戻す。

 

パスを通す

ここまでやって、原因はインストール失敗とかではなく別のところにあると判断。(遅い)

切り分けとして、spacyのほかのモジュールを読み込むことはできるのか?を試してみました。

というわけで、英語用のモジュール enを読み込んでみる。

OSError: [E053] Could not read meta.json from en/meta.json

ありゃ?と思い調べてみると、どうやら「en_core_web_sm」っていうものを入れろって書いてあったので入れてみる。

python -m spacy download en_core_web_sm

んでもう一回実行。

OSError: [E050] Can't find model 'en'. It doesn't seem to be a shortcut link, a Python package or a valid path to a data directory.

ありゃ?と思い、(二度目)英語を頑張って読んでみると、「dataディレクトリにパスを通せよ」と怒られている。

ここらへんで全てを察するのですが、spacyは言語用のモジュールを読み込むときに、dataディレクトリから読んでいるみたいなのです。

dataディレクトリは私の環境では以下にありました。

find / | grep spacy | grep data
 /usr/local/lib64/python3.6/site-packages/spacy/data

というわけで以下にen_core_web_smのパスを通す。

ln -s /usr/local/lib/python3.6/site-packages/en_core_web_sm  /usr/local/lib64/python3.6/site-packages/spacy/data/en

んで実行!無事成功です。

 

ここまでやったらGiNZAモジュールが見つからなかった原因もわかりました。

結局、enモジュールと同じでパスが通っていないだけだと思います。

ので、パスを通してあげましょう。

ln -s /usr/local/lib64/python3.6/site-packages/spacy/lang/ja_ginza /usr/local/lib64/python3.6/site-packages/spacy/data/ja_ginza

んで、実行してみます。

python ginzatest.py
 0 依存 依存 NOUN compound 2
 1 構造 構造 NOUN compound 2
 2 解析 解析 NOUN nmod 4
 3 の の ADP case 2
 4 実験 実験 NOUN obj 6
 5 を を ADP case 4
 6 行っ 行う VERB root 6
 7 て て SCONJ mark 6
 8 い 居る AUX aux 6
 9 ます ます AUX aux 6
 10 。 。 PUNCT punct 6
 EOS

おお~!!

 

まとめ

というわけで、単純にパスが通っていなかったことが原因でした。

というか、インストールしただけでみんな使えてるみたいなんですけど、なんで私は使えなかったんだろうか・・・

パーミッションがなくてdataディレクトリにリンク張れなかったとかなのかな・・・

 

 

コメント

タイトルとURLをコピーしました