Ubuntu18.04に mecab+mecab-ipadic-NEeologd をインストールし、pythonスクリプトでWERを算出するまで

　まとまっていないタイトルで申し訳ございません。同じことをしようとしている方の助けになれば幸いです。基本的に以下の記事をつぎはぎさせていただいております。個人のメモ程度という認識で見てもらえればと思います。

（参考記事）
- [Ubuntu 18.04 LTSのPythonでMeCabを動かす方法](https://qiita.com/SUZUKI_Masaya/items/685000d569452585210c)
- [ubuntu 18.10 に mecab をインストール](https://qiita.com/ekzemplaro/items/c98c7f6698f130b55d53)
- [Custom Speech の精度の評価と向上](https://docs.microsoft.com/ja-jp/azure/cognitive-services/speech-service/how-to-custom-speech-evaluate-data)

# MeCab & mecab-ipadic-NEeologd のインストール

まずはMeCab本体のインストールです。`pip`をインストールしている前提です。

```shell
$ sudo apt-get install mecab mecab-ipadic-utf8 libmecab-dev swig
$ pip install mecab-python3
```

この時点で以下を試してみます。

```shell
$ mecab
新世紀エヴァンゲリオン
新      接頭詞,名詞接続,*,*,*,*,新,シン,シン
世紀    名詞,一般,*,*,*,*,世紀,セイキ,セイキ
エヴァンゲリオン        名詞,一般,*,*,*,*,*
EOS
```

次に辞書としてmecab-ipadic-NEeologdをインストールします。

```shell
$ git clone https://github.com/neologd/mecab-ipadic-neologd.git
$ cd mecab-ipadic-neologd
$ sudo bin/install-mecab-ipadic-neologdv
```

辞書の使用方法は以下の二つのうちどれか好きな方を

***方法1***
MeCabの引数に該当辞書のパスを与えます。自分の環境では以下のパスでした。

```shell
# 通常の辞書を使用する場合
$ mecab -d /var/lib/mecab/dic/debian

# インストールした辞書を使用
$ mecab -d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd
```

***方法2***
`mecabrc`を編集する。こうする事で、デフォルトの辞書が変更されます。
`dicdir = /var/lib/mecab/dic/debian`となっている部分を`dicdir = /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd`に変更します。

新しい辞書で先ほどのワードを調べてみると、確かに固有名詞として<font color="Red">『新世紀エヴァンゲリオン』</font>が登録されていることが確認できます。

```shell
$ mecab
新世紀エヴァンゲリオン
新世紀エヴァンゲリオン  名詞,固有名詞,一般,*,*,*,新世紀エヴァンゲリオン,シンセイキエヴァンゲリオン,シンセイキエヴァンゲリオン
EOS
```

# pythonでmecabを使う

いざpythonでmecabを使おうとすると、`RuntimeError`が発生、エラーメッセージを確認してみると

```
error message: [ifs] no such file or directory: /usr/local/etc/mecabrc
```

とのこと、自分がインストールするとデフォルトで`/etc/mecabrc`にインストールされていたので、ここにパスを通すことで解消されました。

```
$ echo "export MECABRC='/etc/mecabrc'" >> ~/.bashrc
$ source .bashrc
```

# WERの算出
WER(文字誤り率)はSST(Speach to Text)、いわゆる音声認識の分野で使われる評価指標です。発話をどれだけ正確に文字起こしできているか評価します。（図は[Custom Speech の精度の評価と向上](https://docs.microsoft.com/ja-jp/azure/cognitive-services/speech-service/how-to-custom-speech-evaluate-data)より抜粋）

実際に発話された単語総数：$N$
本当は発話されていないのに誤って挿入された単語数：$I$
発話されたのにテキスト化されなかった単語数：$D$
置き換えられた単語数：$S$

![スクリーンショット 2021-02-04 150422.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323251/db3cc2af-0a6e-4ca7-56ce-c28a21cf17c2.png)


としたときに以下の式で定義されます。

```math
WER = \frac{I + D + S}{N}
```

***算出法1***

[GitHubリンク](https://github.com/kchan7/WER-CER) に、日本語対応したWER計算スクリプトがあるのでこちらを使用すると簡単に計算できます。(使用するにはmecab-python3以外にnumpyも必要)

```
$ git clone git@github.com:kchan7/WER-CER.git
$ cd WER-CER
$ python wer.py original_file.txt target_file.txt
```

結果

```
REF: 吾輩は猫である
HYP: 吾輩は猫である
EVA:
WER: 0.00%
REF: 名前 は まだ 無い
HYP: 名前 は まだ ない
EVA:         S
WER: 25.00%
REF: どこ で 生れ  た かとん と 見当 が つか ぬ
HYP: どこ で 生まれ た かとん と 見当 が つか ぬ
EVA:      S
WER: 10.00%
REF: 何 でも 薄暗い じめじめ した 所     で ニャーニャー 泣い て いた事 だけ は 記憶 し て いる
HYP: 何 でも 薄暗い じめじめ し  た ところ で ニヤニヤ   泣い て いた事 だけ は 記憶 し て いる
EVA:               S  S I     S
WER: 23.53%
REF: 吾輩 は ここ で 始め て   人間 という もの を 見 た
HYP: 吾輩 は ここ で    初めて 人間 という もの を 見 た
EVA:           D  S
WER: 16.67%
REF: しかも あと で  聞く と それ は 書生 という 人間   中 で 一番 獰悪 な 種族 で あっ た そうだ
HYP: しかも    後で 聞く と それ は 小生 という 人間 の 中 で 一番 当惑 な 種族 で あっ た そうだ
EVA:     D  S            S         I        S
WER: 25.00%
```

***算出法2***

`jiwer`ライブラリを使用します。

```
$ pip install jiwer

# 以下はPythonスクリプト
from jiwer import wer

ground_truth = "hello world"
hypothesis = "hello duck"

error = wer(ground_truth, hypothesis)
print(error)   # -> 0.5
```