非rootなレンタルサーバでmecab-python3を使うまでの道のり（rye, mecab, neologd, XServer）

XServerのCLIで最新のPython、MeCab(neologd dic)＆mecab-python3を使うまでの記録。検索しても出てこなかったので残しておきます。非root環境で同じようなことをしなければならない時の参考にもなるかもしれません。

## なぜレンタルサーバでPython?
諸事情でExcelファイル（個人情報などは含んでいない漏れても大丈夫なデータ）から毎日大量の漢字をひらがなにして、DBに入れる必要がでてきました。ひらがな化はWebAPIでいくつか出ているのですが、今回は万単位の行の文字列をひらがな化するため、WebAPIだと制限に引っかかってしまいます。

こういう用途だとVPSやEC2的なものを使うのが一般的ですが、これだけの為にサーバの管理はできればしたくありません。この部分だけLambdaにしても良かったのですが、DBに入れることを考えるとやや面倒。検索してもapt installで一発的なものが多かったのですが、レンタルサーバでもPythonは仮想環境(venv)で動くようなのでとりあえず試してみました。

## 手順
- sshでサーバに入れるようにする（省略）
- Ryeを入れる
- MeCabを入れる
- mecab-ipadic-neologdを入れる
- mecab-python3を入れる

## Ryeを入れる
普段同様の環境を作るときはdockerを使っているのですが、レンタルサーバだとそう言うわけにも行きません。また、pip的なものでいろいろパッケージ入れたり、新しいpythonを使いたいので、今風?なRyeで環境を作ることにしました。pipの代わりのuvも早くて使いやすかったです。

https://rye-up.com/guide/installation/
```bash
$ cd ~
$ curl -sSf https://rye-up.com/get | bash   # 途中yesとかuv使うとか選んだ
$ echo 'source "$HOME/.rye/env"' >> ~/.bashrc

一度ログオフして再ログイン（source ~/.bashrcとかしてもよい）

$ rye --version
rye 0.32.0
commit: 0.32.0 (e1b4f2a29 2024-03-29)
platform: linux (x86_64)
self-python: cpython@3.12.2
symlink support: true
uv enabled: true
```

## MeCabを入れる
非rootなのでコンパイルして自分のディレクトリに入れる必要があります。めんどくさい。今回は公式からややパッチのあたっている下記を使用しました。

https://github.com/shogo82148/mecab

```bash
$ cd ~
$ mkdir -p ~/bin/mecab    # 好きなところに
$ mkdir ~/temp && cd ~/temp
$ wget https://github.com/shogo82148/mecab/releases/download/v0.996.10/mecab-0.996.10.tar.gz
$ tar xvfz mecab-0.996.10.tar.gz
$ cd mecab-0.996.10
$ ./configure --with-charset=utf-8 --enable-utf8-only --prefix=/home/{{username}}/bin/mecab
$ make
$ make install
```
思ったよりもすんなり入った！
```bash
$ vi ~/.bash_profile
PATH=$PATH:$HOME/bin:$HOME/bin/mecab/bin
                     ^^^^^^^^^^^^^^^^^^^
一度ログオフして再ログイン

$ mecab --version
mecab of 0.996.10
```

## mecab-ipadic-neologdを入れる
今回の用途では標準辞書ではひらがな化があまりできなかったのでNeologism辞書を使うことにしました。

https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md

```bash
$ cd ~/temp/
$ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
$ mkdir -p /home/{{username}}/bin/mecab/dic/mecab-ipadic-neologd/
$ cd mecab-ipadic-neologd
$ ./bin/install-mecab-ipadic-neologd -n -p /home/{{username}}/bin/mecab/dic/mecab-ipadic-neologd/
                          ここがポイント ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
```
インストールはやや時間かかる。

確認
```bash
$ mecab -d "/home/{{username}}/bin/mecab/dic/mecab-ipadic-neologd/"
鬼滅の刃
鬼滅の刃        名詞,固有名詞,一般,*,*,*,鬼滅の刃,キメツノヤイバ,キメツノヤイバ
```

## mecab-python3
これが情報なくて大変だった。
XServerにはclangが入ってなかったので、gccに身代わりさせます。*1。
サーバにclangが入っていたら下記は必要ないです。
```bash
$ mkdir ~/bin
$ cd bin
$ ln -s /usr/bin/g++ ./clang++
$ ln -s /usr/bin/gcc ./clang
$ vi ~/.bash_profile
PATH=$PATH:$HOME/bin:$HOME/bin/mecab/bin
　　　　　　^^^^^^^^^^
```

ryeでプロジェクト作る。ryeの使い方は検索してください。
```bash
$ mkdir project
$ cd project
$ rye init
$ rye add mecab-python3
$ rye sync
```

### 確認
起動時はLD_LIBRARY_PATHで、ライブラリパスを指定する必要があります。*2
.bashrc等に`export LD_LIBRARY_PATH=`として書いてもよいのかもしれませんが、今回は下記の方法にしました。
```bash
$ LD_LIBRARY_PATH=/home/{{username}}/bin/mecab/lib/ rye run python
```
```python
import MeCab
sample_txt ="鬼滅の刃、スターバックス、経営方針"
mecab = MeCab.Tagger('-d /home/{{username}}/bin/mecab/dic/mecab-ipadic-neologd')
print("Neologd辞書: \n",mecab.parse(sample_txt))
```
```
Neologd辞書:
鬼滅の刃        名詞,固有名詞,一般,*,*,*,鬼滅の刃,キメツノヤイバ,キメツノヤイバ
、      　　　  記号,読点,*,*,*,*,、,、,、
スターバックス  名詞,固有名詞,組織,*,*,*,スターバックス,スターバックス,スターバックス
、              記号,読点,*,*,*,*,、,、,、
経営方針        名詞,固有名詞,一般,*,*,*,経営方針,ケイエイホウシン,ケイエイホーシン
EOS
```

### 「No such file or directory: 'clang' 'clang++'」が出た *1
`rye add mecab-python3` (pip install mecab-python3でも一緒だった)時に、上記エラーメッセージが出てインストールできなかった。XServerにはclangは入っていないらしい。検索してみたところclangはgccとかなり互換があるとのことだったので、ダメ元でclang -> gcc、clang++ -> g++へのシンボリックリンクを張ったらちゃんと入った。嬉しい。

### 「ImportError: libmecab.so.2: cannot open shared object file」が出た *2
pythonで`import MeCab`したときに、上記エラーメッセージが出て動かなかった。apt install などでいれると/usr/lib/などに入るらしいのですが、非rootなので当然いれることはできません。libmecab.so.2はmecabを入れた場所にあるので、python起動時に`LD_LIBRARY_PATH`で指定してあげると解消しました。

## 最後に
- サーバ管理しなくてよいのは楽だけど、ryeで入れたpythonやらパッケージやらは自分で管理しないとだめなので、そこはちょっとめんどくさい
- rye使いやすい
- コンパイルを伴うpythonパッケージはレンタルサーバではハマりそうです