🍀

無料版Herokuで「Mecab+軽量化NEologd」を使った形態素解析に成功した

2022/05/16に公開

新語などに対応したNEologd+Macabを使った形態素解析をHeroku上で行うことに成功したので軽量化手法とともにご紹介します。
手順だけ教えろって方は後半を見てください。
(どうせ来月には忘れている自分のためです)

NEologdはHerokuで使えない

「mecab-ipadic-neologd」とはMacabを新語などに対応させた辞書のことで、例えば通常のMecab辞書だと「鬼滅の刃」は一つの固有名詞だと認識できません。
しかしNEologdを辞書として使うとことで固有名詞として形態素解析を行ってくれます。

$ mecab -d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd
小宮果穂        名詞,固有名詞,人名,一般,*,*,小宮果穂,コミヤカホ,コミヤカホ
EOS

軽量化すればいい!

ネット上にある殆どの記事は「無料枠だとNEologdが使えない」と書いており、そのとおりでHerokuの無料枠では容量制限500MBの都合上、使えない問題があります。
しかし、公式ドキュメントにて提示されている軽量化手法を使えば制限をかいくぐって使うことが可能になります。

詳しく説明すると、辞書のビルド時に --eliminate-redundant-entry パラメータを渡すことで、正規化した日本語テキストを単語分割するための別称・異表記・表記揺れなどを除去する事ができるそうです。
公式のREADME.ja.md

このパラメータを使うと実際に通常1.03GBの辞書が400MBまで小さくなります。
!
開発者様曰く「一切おすすめしない」とのことですが、この際は仕方ないしただ単に新語を固有名詞として認識させたいのが目的であれば特に問題はないと思います。

HerokuでPython+Mecab+NEologdをデプロイ

環境

OS     ->  Ubuntu 20.04 LTS
Env    ->  WSL2 on Windows10
Python ->  3.10
Heroku ->  heroku/7.53.0 win32-x64 node-v12.21.0

※事前にHeroku CLIをインストールしておいてください。WindowsでもWSL上のUbuntuでもどちらでも良いです。

Mecabのインストール

Mecab本体及び、IPA辞書・Python版のMecabをインストールします。

sudo apt install mecab
sudo apt install libmecab-dev
sudo apt install mecab-ipadic-utf8
sudo pip3 install mecab-python3

辞書のビルド

まずはNEologdの最新のリポジトリから辞書をクローンしてビルドしましょう。
Windowsではなく、WSL上のLinuxでやってください。

$ git clone --depth 1 git@github.com:neologd/mecab-ipadic-neologd.git
$ cd mecab-ipadic-neologd
# ここで先程説明したパラメータを付与してビルドを実行することがポイントです。
$ ./bin/install-mecab-ipadic-neologd -n -y --eliminate-redundant-entry

Pythonで一度動作を確認

ちゃんと一度辞書・Mecabが動作するのかをチェックしましょう。
適当なディレクトリを作成して、そこに辞書を移動させる。

# NEologdの辞書の在り処は以下を叩けばわかるよ
 $ echo `mecab-config --dicdir`"/mecab-ipadic-neologd"
 $ sudo mv /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd ./

そしてmain.pyという名前のPythonファイルを作成して以下をコピペ。

import MeCab
CONTENT = 'ゆっくり実況とは、音声合成ソフトを使用したゲーム実況や車載などの動画である。'

tagger = MeCab.Tagger(r'-d "./mecab-ipadic-neologd"')
parse = tagger.parse(CONTENT)
print(parse, "\n")

あとはPythonファイルを実行して、ちゃんと「ゆっくり実況」が固有名詞として認識できていればOKです。

Herokuへデプロイ

最後にHerokuへデプロイしましょう。基本的には以下記事を参考にしました。感謝申し上げます。

https://qiita.com/shimajiroxyz/items/1a7629e6c5da907b2926

以下の内容で作業ディレクトリで「Procfile」「requirements.txt」「runtime.txt」を作成。

Procfile
web: python main.py
requirements.txt
mecab-python3
unidic-lite
runtime.txt
python-3.10.2

そして、以下のコマンドを順に叩く。(Heroku CLIをインストールしてたのがWindowsだった都合上PowerShellでやりましたが、bashでも同様です)

$ heroku login
# ここでブラウザに自動遷移されるのでログインしましょう
$ heroku create [アプリ名]
$ heroku git:remote -a [アプリ名]
$ git init
$ git add .
$ git commit -am "initial commit"
$ git push heroku master
-----> Building on the Heroku-20 stack
-----> Using buildpack: heroku/python
-----> Python app detected
-----> Using Python version specified in runtime.txt
-----> No change in requirements detected, installing from cache
-----> Using cached install of python-3.10.2
-----> Installing pip 22.0.4, setuptools 60.10.0 and wheel 0.37.1
-----> Installing SQLite3
-----> Installing requirements with pip
-----> Discovering process types
       Procfile declares types -> web
-----> Compressing...
       Done: 205.6M
-----> Launching...
       Released v4
       https://******.herokuapp.com/ deployed to Heroku

ログで動作確認

あとはHerokuのログを見てちゃんと動作している事を確認しましょう。

heroku[web.1]: Process exited with status 0
heroku[web.1]: State changed from starting to crashed
app[api]: Build succeeded
heroku[web.1]: State changed from crashed to starting
heroku[web.1]: Starting process with command `python main.py`
app[web.1]: ゆっくり実況       名詞,固有名詞,一般,*,*,*,ゆっくり実況,ユックリジッキョウ,ユックリジッキョー
app[web.1]: と 助詞,格助詞,引用,*,*,*,と,ト,ト
app[web.1]: は 助詞,係助詞,*,*,*,*,は,ハ,ワ
app[web.1]: 、 記号,読点,*,*,*,*,、,、,、
app[web.1]: 音声合成ソフト     名詞,固有名詞,一般,*,*,*,音声合成ソフト,オンセイゴウセイソフト,オンセイゴーセイソフト
app[web.1]: を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
app[web.1]: 使用       名詞,サ変接続,*,*,*,*,使用,シヨウ,シヨー
app[web.1]: した       名詞,一般,*,*,*,*,した,シタ,シタ
app[web.1]: ゲーム実況 名詞,固有名詞,一般,*,*,*,ゲーム実況,ゲームジッキョウ,ゲームジッ キョー
app[web.1]: や 助詞,並立助詞,*,*,*,*,や,ヤ,ヤ
app[web.1]: 車載       名詞,サ変接続,*,*,*,*,車載,シャサイ,シャサイ
app[web.1]: など       助詞,副助詞,*,*,*,*,など,ナド,ナド
app[web.1]: の 助詞,連体化,*,*,*,*,の,ノ,ノ
app[web.1]: 動画       名詞,一般,*,*,*,*,動画,ドウガ,ドーガ
app[web.1]: で 助詞,格助詞,一般,*,*,*,で,デ,デ
app[web.1]: ある       動詞,自立,*,*,五段・ラ行,基本形,ある,アル,アル
app[web.1]: 。 記号,句点,*,*,*,*,。,。,。
app[web.1]: EOS

以上、私が大学の空きコマまで調べ上げた方法でした。ちゃんとできてたら後はFlaskでAPIにするなりなんなりどうぞ。

Discussion