tohokuaikiのチラシの裏

技術的ネタとか。

polyglotで英語の構文解析をする

日本語だと、MeCabとか入れておけば大体大丈夫で日本語での検索も捗るんだけど、英語って言われると…となってしまったので

lab.astamuse.co.jp

を参考にCentOS7で解析してみる。

インストール

とりあえず環境

$ more /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

実行

python-numpyが必要らしい。・・・んだけど、yum listしてみると、python27-numpyしかない。

しかし、んー、27ってついてるけど・・・・

[itoh@localhost ~]$ which python2.7
/bin/python2.7
[itoh@localhost ~]$ which python
/bin/python
[itoh@localhost ~]$ ls -l /bin/python
lrwxrwxrwx 1 root root 7 Jan 26 11:05 /bin/python -> python2
[itoh@localhost ~]$ ls -l /bin/python2
lrwxrwxrwx 1 root root 9 Jan 26 11:05 /bin/python2 -> python2.7

まぁ、大丈夫そうだろう。

pipもpip2.7がいいのかな~?と思ってインストールしたけど diff /bin/pip /bin/pip2.7 したら違いがなかった。

# yum install python27-numpy
# yum install -y libicu-devel
# yum install -y pip2.7
# yum install python-devel
# pip2.7 install --upgrade pip
# pip2.7 install polyglot

Installing collected packages: PyICU, pycld2, morfessor, numpy, wheel, polyglot
  Running setup.py install for PyICU ... done
  Running setup.py install for pycld2 ... done
  Running setup.py install for morfessor ... done
  Running setup.py install for polyglot ... done
Successfully installed PyICU-2.0.3 morfessor-2.0.4 numpy-1.14.2 polyglot-16.7.4 pycld2-0.31 wheel-0.30.0

となったので問題ないんだろう。

モデルファイルのインストール

$ polyglot download embeddings2.en pos2.en

で、自分のホームディレクトリにpolyglot_dataディレクトリを作成してこれがモデルファイルらしい。

で、何をしたかったかというと、

PDFから抜き出したテキストファイルを字句解析したかったのだ。

ところが、pdftotextで抜き出したテキストをpolyglotで解析しようとすると、

pycld2.error: input contains invalid UTF-8 around byte 5302 (of 39198)

UTF-8じゃないのが入ってる」と言われてしまう。

じゃあ、Python上でPDFを抜き出してそれを渡そうと思い、textractをインストールすることにした。

#pip2.7 install textract

     #include <pulse/pulseaudio.h>
    compilation terminated.
    error: command 'gcc' failed with exit status 1

と怒られた。

pulseaudio-libs-devel が必要なのかな?

# yum install pulseaudio-libs-devel

してから再度実行するとインストールできたっぽい。

しかし、結局同じ結果に。うーん。

制御コードを除く

ということで、制御コードを除く処理を加えてみた。 PHPで制御文字を取り除く - tohokuaikiのチラシの裏

したら、問題なくパースしてくれた。オッケー。

nginxから使う

php-fpmとnginxから使ってみると、nginxからみたpolyglot_dataが無いって言われるのでエラーになる。

エラーが出るところを解析する。自分の環境では、/usr/lib/python2.7/site-packages/polyglot/load.py を無理やり編集。

  if not path.isdir(p):
    if downloader.status(package_id) != downloader.INSTALLED:
      raise ValueError("This resource is available in the index "
                       "but not downloaded, yet. Try to run\n\n"
                       "polyglot download {}".format(package_id))

とあるのを

  if not path.isdir(p):
    if downloader.status(package_id) != downloader.INSTALLED:
      raise ValueError("This resource is available in the index "
                       "but not downloaded, yet. Try to run\n\n"
                       "polyglot download {}".path.join(p, os.listdir(p)[0]))

として、エラーを見る。

すると、/var/opt/rh/rh-nginx112/lib/nginx/polyglot_data/embeddings2/en が無いって言われてるっぽいんで、

# ln -s /home/tohokuaiki/polyglot_data /var/opt/rh/rh-nginx112/lib/nginx/

としてやった。もうほんと、とりあえずって感じ。そうすると動いた。