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

## はじめに
MeCabを使ったユーザー辞書作成はこれまでもたくさん取り組まれてきていると思いますが、CentOSの後継の１つとされているAlmaLinux上のMeCabを使ったユーザー辞書の作成と、作成した辞書をPythonで用いる方法は、なかなかまとめられていない...と思い、ここに備忘録として記したいと思います
## 目次
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 8.6 (Sky Tiger)
```

```bash
python3 --version
#実行結果
Python 3.6.8
```

```bash
which python3
#実行結果
/usr/bin/python3
```

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

mecabをインストールするために必要になるgroongaリポジトリを追加します
```bash
sudo dnf -y install --nogpgcheck https://packages.groonga.org/almalinux/8/x86_64/Packages/groonga-release-2021.10.30-1.noarch.rpm
```

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

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

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
python3 -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
```

できましたね！

## おわりに
この記事では、AlmaLinux8でMeCab+NEologdを使った辞書を作成して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