AlmaLinux9上でMeCab+NEologdで辞書を作成してPythonから呼び出す

## はじめに
[以前の記事](https://qiita.com/heimaru1231/items/1f4f03088bc0f6bdefc6)において、AlmaLinux8でのMeCabを使ったユーザー辞書の作成と、作成した辞書のPythonでの読み込み方法についてまとめましたが、AlmaLinux9でも試してみましたので、ここに備忘録として記したいと思います。

## 目次
1. 実行環境
2. MeCab+Neologdの準備
2-1. MeCabのインストール
2-2. mecab-ipadic-NEologdのダウンロード
2-3. MeCabの実行
3. MeCabを使ったユーザー辞書の作成
4. 作成したユーザー辞書をPythonから呼び出す
4-1. mecab-Python3のインストール
4-2. pythonの実行

## 1.実行環境
```bash
cat /etc/redhat-release
#実行結果
AlmaLinux release 9.0 (Emerald Puma)
```

```bash
python --version
#実行結果
Python 3.9.10
```

```bash
which python
#実行結果
/bin/python
```

## 2. MeCab+Neologdの準備
### 2-1. MeCabのインストール

mecabをインストールするために必要になるgroongaリポジトリを追加します

:::note warn
groongaリポジトリの取得先はAlmaLinux8と異なるので注意してください
:::
```bash
sudo dnf -y install --nogpgcheck https://packages.groonga.org/almalinux/9/x86_64/Packages/groonga-release-2022.3.6-1.noarch.rpm
```


追加したリポジトリのメタデータキャッシュを作成しておきます
```bash
sudo dnf -y makecache
```

MeCabをインストールします
```bash
sudo dnf -y install mecab mecab-ipadic mecab-devel
```

MeCabのバージョンを確認しておきます
```bash
mecab -v
#実行結果
mecab of 0.996
```

### 2-2. mecab-ipadic-NEologdのダウンロード
MeCabのシステム辞書として今回は mecab-ipadic-NEologd を使用していきます。Gitからダウンロードします
以下のコマンドの実行が完了すると、カレントディレクトリに mecab-ipadic-neologd のフォルダが作成されます
```bash
git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
```

mecab-ipadic-NEologd をインストールします（すこし時間がかかると思います）
```bash
cd mecab-ipadic-neologd
./bin/install-mecab-ipadic-neologd -n -a
```

:::note warn
インストールの最後の方で以下のような表示が出ますので yes を入力して Enter します
[install-mecab-ipadic-NEologd] : Do you want to install mecab-ipadic-NEologd? Type yes or no.
:::

### 2-3. MeCabの実行
mecab-ipadic-neologd がインストールできたので、MeCabを実行してみます
実行するときにシステム辞書として `-d /usr/lib64/mecab/dic/mecab-ipadic-neologd/` を指定することに注意しましょう
```bash
mecab -d /usr/lib64/mecab/dic/mecab-ipadic-neologd/

今日はお昼ごはんにカレーライスを食べました。  #適当に文章を入力してみてください

今日	名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
お	接頭詞,名詞接続,*,*,*,*,お,オ,オ
昼ごはん	名詞,固有名詞,一般,*,*,*,昼ごはん,ヒルゴハン,ヒルゴハン
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
カレーライス	名詞,一般,*,*,*,*,カレーライス,カレーライス,カレーライス
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
食べ	動詞,自立,*,*,一段,連用形,食べる,タベ,タベ
まし	助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
EOS
```

ちなみに、mecabのデフォルトのシステム辞書`/usr/lib64/mecab/dic/ipadic/`を指定して実行してみると、出力結果が変化することがわかると思います。
　※`お昼ごはん`に着目してみてください。
```bash
mecab -d /usr/lib64/mecab/dic/ipadic/

今日はお昼ごはんにカレーライスを食べました。  #同じ文章を入れてみてください

今日	名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
お昼	名詞,副詞可能,*,*,*,*,お昼,オヒル,オヒル 
ごはん	名詞,一般,*,*,*,*,ごはん,ゴハン,ゴハン
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
カレーライス	名詞,一般,*,*,*,*,カレーライス,カレーライス,カレーライス
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
食べ	動詞,自立,*,*,一段,連用形,食べる,タベ,タベ
まし	助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
EOS
```
:::note info
ipadic と ipadic-neologd とで行いたい自然言語処理の結果が異なってくるので、用途にあわせて指定するようにしてみてください
:::

## 3. MeCabを使ったユーザー辞書の作成
それでは、実際にユーザ辞書を作成してみます。ユーザー辞書を作成するには、登録したい語句についてレコードを作成する必要があります。そのレコードのフォーマットは次のとおりです。
```bash
表層形,左文脈ID,右文脈ID,コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用型,活用形,原形,読み,発音
#たとえば
お昼ごはん,,,10,名詞,一般,*,*,*,*,お昼ごはん,オヒルゴハン,オヒルゴハン,オヒルゴハン
```

レコードができたら csvファイル として保存します。作成した csvファイルが UTF-8 とすることに注意してください
```bash:userdic-data.csv
お昼ごはん,,,10,名詞,一般,*,*,*,*,お昼ごはん,オヒルゴハン,オヒルゴハン,オヒルゴハン
```
:::note info
ファイルを作成したときに、そのファイルの文字コードを確認するためには nkf コマンドで確認すると良いです。nkfコマンドはデフォルトでインストールされていませんので、別途インストールしたあと確認してみてください
```bash
nkf -g ./userdic-data.csv
UTF-8
```
:::

ユーザー辞書としたい語句のレコードを記載した csvファイル が作成できたら以下のコマンドを実行して、ユーザ辞書を作成します。正常に終了すると、以下のような実行結果になります。
```bash:
/usr/libexec/mecab/mecab-dict-index -d /usr/lib64/mecab/dic/mecab-ipadic-neologd -u ./user.dic -f utf-8 -t utf-8 ./userdic-data.csv
#実行結果
reading ./userdic-data.csv ... 1
emitting double-array: 100% |###########################################| 

done!
```

ユーザー辞書（user.dic）が作成できたら、ユーザー辞書の動作を確認してみましょう。`お昼ごはん`をひとまとまりで認識できるように csvファイル に記載したので、ちゃんと正しく動いていますね
```bash:
mecab -d /usr/lib64/mecab/dic/mecab-ipadic-neologd/ -u ./user.dic

今日はお昼ごはんにカレーライスを食べました。

今日	名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
お昼ごはん	名詞,一般,*,*,*,*,お昼ごはん,オヒルゴハン,オヒルゴハン,オヒルゴハン
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
カレーライス	名詞,一般,*,*,*,*,カレーライス,カレーライス,カレーライス
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
食べ	動詞,自立,*,*,一段,連用形,食べる,タベ,タベ
まし	助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
EOS
```

## 4. 作成したユーザー辞書をPythonから呼び出す
では、Pythonプログラム上で作成したユーザー辞書を指定して、Pythonで扱えるようにしてみましょう

### 4-1. venv環境の作成
Pythonの仮想環境を作成しておきます。ここでは env というディレクトリにPythonの仮想環境を入れることとします
```bash
python -m venv env
```

コマンドが終了したら、仮想環境のPythonをアクティベートします
```bash
#アクティベートするときは以下のコマンドを入力します
source ~/env/bin/activate

#アクティベートを解除するときは以下のコマンドを入力します
deactivate
```

アクティベートしたあとに `which python` を実行すると、仮想環境のpythonが呼び出されるようになります。
ここでは仮想環境の`pip`に`mecab-python3`をインストールして呼び出すようにしていきます。
```bash
which python
#実行結果
~/env/bin/python
```

### 4-2. mecab-Python3のインストール
仮想環境のPythonをアクティベートしている状態で、まず`pip`のアップデートをしておきます
```bash
pip install --upgrade pip
```

`pip`のアップデートができたら、`mecab-python3`のモジュールをインストールします
```bash
pip install mecab-python3
```

### 4-3. pythonの実行
pythonでmecabを実行するのに必要なモジュールを準備できたので、実際にPythonからMeCabを呼び出し、作成したユーザー辞書を使った動作を確認してみましょう。

:::note info
MeCabを実行するのに必要なファイルへのパスをおさらいしておきます
設定ファイル： /etc/mecabrc
システム辞書： /usr/lib64/mecab/dic/mecab-ipadic-neologd
ユーザー辞書： ./user.dic
:::

`-r /etc/mecabrc`でMeCabの設定ファイルを、`-d /usr/lib64/mecab/dic/mecab-ipadic-neologd`でシステム辞書を、`-u ./user.dic`で作成したユーザー辞書の指定します
```python:check.py
import MeCab

tagger = MeCab.Tagger('-r /etc/mecabrc -d /usr/lib64/mecab/dic/mecab-ipadic-neologd -u ./user.dic')
print(tagger.parse('今日はお昼ごはんにカレーライスを食べました。'))
```

上記のコードのPythonプログラムファイルを作成できたら、実際に実行してみましょう。

:::note warn
Pythonを実行するとき仮想環境がアクティベートされていることを確認してください
:::
```bash
python check.py 
#実行結果
今日	名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
お昼ごはん	名詞,一般,*,*,*,*,お昼ごはん,オヒルゴハン,オヒルゴハン,オヒルゴハン
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
カレーライス	名詞,一般,*,*,*,*,カレーライス,カレーライス,カレーライス
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
食べ	動詞,自立,*,*,一段,連用形,食べる,タベ,タベ
まし	助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
EOS
```

できましたね！

## おわりに
AlmaLinux9では、リポジトリのパスが違ったりデフォルトのPythonバージョンが違うだけで同じように動作することがわかりました。参考になれば幸いです。

## 参考文献
以下の方々のサイトを参考にさせていただきました。ありがとうございました。

https://mebee.info/2021/02/18/post-29277/

https://zenn.dev/suyaa/articles/cb8a7e0c2767b3

http://taku910.github.io/mecab/dic.html

https://qiita.com/str32/items/c1ced3b017ff5cacc4dc

https://rcg.jp/almalinux8_initial_setting/#toc15

https://qiita.com/fiftystorm36/items/b2fd47cf32c7694adc2e