記録帳

クラウド、データ分析、ウイスキーなど。

Python用ネガポジ分析ライブラリ「oseti」をWindows+Docker Desktop+jupyter notebookで動かす

梅雨が明けたっていうのに、微妙に雨模様ですね。という季節の挨拶からこんばんは。
皆さんは、もう何年もやり取りをしているLINEグループなどはありますでしょうか。
私はあります。5年間、ほぼ毎日発言しているLINEグループです。
高校の頃の友人とのグループなのですが、しょうもない話を永遠としております。

さて、そんなLINEグループでやりとりをしていて、ふと
「めちゃくちゃ発言数がたまってるから、これを何かデータ分析できないか…」
と考えました。
まずは、人別/月別で発言のネガティブ・ポジティブ判断をして、違いを見てみよう!ということで、
簡単に使えるネガポジ判定モデルがないかなと探しておりました。

そこで、osetiという神ライブラリに出会いました。
日本語評価極性辞書を利用したPython用Sentiment Analysisライブラリ oseti を公開しました - Qiita
ただ、導入に少し手間取ったので、備忘録も含めて爆速で実行環境をセットアップする方法を書き留めておこうと思います。

osetiとは

ネガポジを判定してくれる、pythonのライブラリです。
ネガポジを判定するには、まず教師データがいりますが、osetiではこちらの日本語評価極性辞書を利用しているそうです。
Open Resources/Japanese Sentiment Polarity Dictionary - 東北大学 乾研究室 / Inui Lab, Tohoku University

使い方はかなり簡単で、importして評価したい文を以下のように記載するだけです。
最大1.0~最小-1.0でポジティブ、ネガティブ度を判定します。
評価したい文が2文以上ある場合は、1文ずつのスコアを返します。(例の2つ目)

import oseti

analyzer = oseti.Analyzer()
analyzer.analyze('天国で待ってる。')
# => [1.0]
analyzer.analyze('遅刻したけど楽しかったし嬉しかった。すごく充実した!')
# => [0.3333333333333333, 1.0]

実行環境

OS:Windows 10 Home
バージョン:21H2

Docker Desktopはインストール済み。
バージョンは以下の通り。

docker_env

実行方法

① Dockerfileとdocker-compose.ymlを作成する

以下の2つの内容をコピペして、適当なworkディレクトリ配下に2つのファイルを作成してください。

FROM python:3.9

WORKDIR /app

SHELL ["/bin/bash", "-c"]

RUN apt-get update
RUN apt-get install libmecab2 libmecab-dev mecab mecab-ipadic mecab-ipadic-utf8 mecab-utils
ENV MECABRC "/etc/mecabrc"

RUN pip install --upgrade pip 
RUN pip install notebook pandas matplotlib oseti

version: '3'
services:
  app:
    build: .
    volumes:
      - ./:/app
    ports:
      - 8888:8888
    tty: true

② コンテナに入る

PowerShellを開いて、①のworkディレクトリに移動してください。
その後、以下の2つのコマンドを実行しましょう。
1つ目のコマンドがdockerのコンテナを作成、2つ目がそのコンテナへ入るコマンドです。

docker-compose up -d
docker-compose exec app bash

③ コンテナ内でjupyter notebookを実行する

PowerSellでコンテナ内に入れているので、あとは以下のコマンドを実行すればjupyter notebookが立ち上がります。
osetiに必要なライブラリや、oseti自体もすでに入っているのでそのままosetiが使えます。

jupyter notebook --port=8888 --ip=0.0.0.0 --allow-root --NotebookApp.token=''

④ ブラウザからjupyter notebookに接続する

コンテナ内で起動しているjupyter notebookですが、docker-compose.ymlでコンテナ内のportとホストのportをつなげてあります。
そのため、ホストOS(今回はwindows)のブラウザから、以下のurlに接続すればアクセスできます。
http://localhost:8888/

そこで、最初の例を実行すると、見事にosetiが使えています。

oseti_notebook

ハマったところ

大きく2つハマりました。

1つ目は、Windows特有の問題です。
始めは、dockerではなくWindowsのJupyterLab Desktopという、Windowsのアプリ上で実行しようとしました。
そうすると、c++のライブラリがないとか、Mecabの辞書がないとか、エラーが絶えず断念しました。
やっぱりDocker最強!!!

2つ目は、Mecabの問題です。
osetiは内部でMecabを使っているので、そちらをインストールしています。
しかし、ただインストールするだけだと、osetiを実行したときに
no such file or directory: /usr/local/etc/mecabrc
というエラーが出てしまいました。
mecabrcはMecabの設定ファイルで、デフォルトで使う辞書などを指定できます。
Mecabをインストールすると作成されるのですが、これが/etc直下にできているので、上記のようなエラーが出ます。
対処法としては、環境変数で/etc/mecabrcにパスを通してあげることです。Dockerfile内でそれをしています。

おわりに

ということで、久々の備忘録記事でした。
今回色々な記事を参考にしましたが、完全に同じ状況というのがなかなかなかったので、私以外の人類の誰か1人にでも役立てばうれしいです。
色々試行錯誤したことをDockerfileにまとめれば、それをそのまま利用できるので、再現性という意味でやはりDocker最強ですね。