【Mecab】Docker上に構築した環境でSentiment Analysisライブラリ「oseti」を動かす

前書き

前回Google Colab上で自然言語処理の基礎でもある文章のポジティブ・ネガティブ判定を実践しました。
形態素分析についても記述しています。
melheaven.hatenadiary.jp


使用したのは、東北大学の乾・鈴木研究室の日本語評価極性辞書を活用したSentiment Analysisライブラリである「oseti」です。
今回はDocker上にFlaskでバックエンドを構築し、そちらで文章の可否判定を実現させます。
思ったより環境構築がうまくいかなかったのと、情報が少なかったのでまとめました。

環境構築

$ pip install oseti
$ pip install mecab-python3

エラー

しかしこのままでは以下のエラーが発生します。
どうやらsengiriというパッケージ内で発生したエラーなようでした。

File "/usr/local/lib/python3.6/site-packages/sengiri/sengiri.py", line 21, in _analyze_by_mecab
    (surface, features) = line.split('\t')
ValueError: too many values to unpack (expected 2)

Google Colabにて構築した環境だとすんなり動くが、Docker上だとこちらのエラーが発生します。
エラーの原因を探るために、osetiのインストール時に入るパッケージ群のバージョンが怪しいと感じて、調査しました。

うまく動作したGoogle Colab上のバージョンは以下の通り。

emoji-0.6.0 neologdn-0.4 oseti-0.2 sengiri-0.2.1 mecab-python3-0.7    

Dockerでバグった環境でのバージョンは”pip list”コマンドで調査しました。
emoji・neologdn・oseti・sengiriのバージョンは変わらずでしたが、mecab-python3のバージョンに違いがありました。
mecab-python3はpython3から形態素解析エンジンMecabを使用できるパッケージのようですが、バージョン1.0を超える・超えないでは大きな差異があるようです。(以下参照)

emoji-0.6.0 neologdn-0.4 oseti-0.2 sengiri-0.2.1 mecab-python3-1.02 

mecab-python3を0.7に合わせて再インストール。

$ pip uninstall mecab-python3
$ apt install mecab python-mecab mecab-ipadic-utf8
$ apt install mecab-jumandic-utf8 libmecab-dev file curl
$ pip install mecab-python3==0.7

これでosetiを使用する環境構築は終了です。

実装

以下はオブジェクト型指向を意識して、クラス型でポジネガ評価のスクリプトを記述しました。
commentsListは1記事あたりにつくコメントの数々、positiveList・negativeListは各コメントにつく「いいね」・「逆いいね」の数です。
結果的に全てのコメントを収集して、記事全体の評判を数値化しようとしています。

import oseti

class Eval():

    def __init__(self):
        self.analyzer = oseti.Analyzer()
        self.evaluate = []
        self.sum_posi = 0.0
        self.sum_nega = 0.0

    def evaluateComment(self, commentsList, positiveList, negativeList):
        for comment in commentsList:
            result = self.analyzer.analyze(comment)
            self.evaluate.append(sum(result))
        for i in range(len(commentsList)):
            self.sum_posi += self.evaluate[i]*int(positiveList[i])
            self.sum_posi += self.evaluate[i]*int(negativeList[i])
        return {'positive': self.sum_posi, 'negative': self.sum_nega}

結果

[0 1.0]とありますが、文章全体に対するポジティブ度を示しており、正値になるほどポジティブ、負値になるほどネガティブです。
つまり合計は1.0点でコメント自体は若干ポジティブな意味が存在していることがわかります。

f:id:electric-city:20210106015351p:plain
動作結果

おまけ(mecab-python3以上になってくると発生)

mecab-python3のバージョンが1.0以上になってくると、辞書ライブラリを別途用意する必要があるようです。すると以下のようなエラーが出現します。

If you are still having trouble, please file an issue here, and include the
ERROR DETAILS below:
https://github.com/SamuraiT/mecab-python3/issues
issueを英語で書く必要はありません。

------------------- ERROR DETAILS ------------------------
arguments:
error message: [ifs] no such file or directory: /usr/local/etc/mecabrc
---------------------------------------------------------------------------

Mecab関連のパッケージと辞書ライブラリをインストールするために、以下のコマンドを打ち込みました。

$ apt install aptitude
$ aptitude install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file -y
$ pip install unidic-lite

medium.com

参考

qiita.com