エイプリルフールに発表される新元号が、偽物かどうかAIだけで判別する物語 【完】

# はじめに
[エイプリルフールに発表される新元号が、偽物かどうかAIだけで判別する物語](https://qiita.com/Wisteria30/items/ba6ced1d55d12ce79943)の続き  
以下ポエム(改めて見直すと、テストになってないのでガバガバ記事ですが、暖かい目で見ていただけると幸いです)

# 新元号は令和
<img src="https://2.bp.blogspot.com/-c-Ws8qkxBq4/XKF92e4mmBI/AAAAAAABSHQ/YHiJQq1xOQwpQFXKHhrvZmPa4EhW6xCUQCLcBGAs/s450/gengou_happyou_reiwa.png" width="300">  

西暦2019年4月1日11時30分(ちょい過ぎ)から新元号の記者会見が始まった。  
そして菅官房長官によって発表された新元号「令和」  
典拠は日本最古の歌集「万葉集」の梅の花の歌より  

```
　于時初春令月 氣淑風和
（時に、初春の令月にして、気淑く風和ぎ）
```

初めて中国古典ではなく、日本古典から採用されたらしい。  
予想ガチ勢がAIの学習用辞書データに四書五経とか使っていたら、外れている可能性が高そうである。Wikipediaを辞書データにしてよかった。(中国の詩文集「文選」に似たようなフレーズが存在し、著者はそれを参考にしたという説もあるらしい。つまり中国古典を辞書にしても当たっていた可能性もある。)  
後、元号発表がお祭騒ぎだったからか、あまりデマ元号は流れているのを見なかった。

# 元号判別機は「令和」を元号として判別したのか
グダグダと話したが、「令和」は元号として判定されました、めでたしめでたし。

```
-----令和-----
適切な語と語の距離感 0.06 <= x <= 0.54
語と語の距離感: 0.1180524155497551
適切な一語目 0.1 <= x <= 0.56, 適切な二語目 0.03 <= y <= 0.49
一語目　平均: 0.1357724815607071, 二語目　平均: 0.1358799934387207
元号かもしれないです！
(MTSHの確認は人がしてください)
```

# せっかくなので精度を見てみる
これ前の記事でやらなきゃいけないこと、、、  
令和を除く全ての元号を訓練データにしたので、正直なところテストデータがそれこそ新元号「令和」しかなかった。(勉強不足なので他に良い方法があるのかもしれない)  
だからと言ってテストデータ１つに対して正解したので精度100%というのもありえない話なので、この際、判別機を少しいじってでも(前回でいうフィルター)過去の元号にも当てはめてエセ精度を見てみようの回。
以下で行う精度は学習データをテストデータにするエセもエセなので気楽に馬鹿らしく見ていきましょう。（書いてた時は血迷ってました。）

テストで使う元号の総数は243

```python
# 過去の元号 +「令和」のリストをgengoとする
all_gengo_len = len(gengo)
# 243
```

## 過去元号フィルターを外す
[過去の元号フィルター](https://qiita.com/Wisteria30/items/ba6ced1d55d12ce79943#%E9%81%8E%E5%8E%BB%E5%85%83%E5%8F%B7%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC)を外す。  
ルール: これまでに元号として用いられたものでないこと  
を適用しているが、過去の元号も元号っぽいか判別するので当然外す。  
外す作業は`judge`関数から適宜行なっている。

では精度はどうだろう。

```python
# judge関数はTrueかFalseを返す
unfil_kakogengo_len = len([gen for gen in gengo if judge(gen, model, mecab)])
# 70

# 精度
unfil_kakogengo_len/all_gengo_len*100
# 28.80658436213992
```

低い、ハサミギロチンの命中と同じレベル。この数字だけ見れば「令和」もヤマカンで当たったように見える。  
しかし、１つ１つを見るとMeCabに品詞として発見されているものが多く見える。過去の元号は既存の単語なのだから引っ掛かって当然か。

```
-----平成-----
既存の品詞のようです
元号ではなさそうです
      ・
      ・
      ・
-----大化-----
既存の品詞のようです
元号ではなさそうです
```

## 既存品詞フィルターを外す
[既存品詞フィルター](https://qiita.com/Wisteria30/items/ba6ced1d55d12ce79943#%E6%97%A2%E5%AD%98%E5%93%81%E8%A9%9E%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC)を外す。  
ルール: 俗用されているものでないこと  
を適用していたもの。先ほどの例でも既存の品詞として多くの元号が引っ掛かっていたので、外す。

```python
# 同上
unfil_kakogengo_hinsi_len = len([gen for gen in gengo if judge(gen, model, mecab)])
# 140

# 精度
unfil_kakogengo_hinsi_len/all_gengo_len*100
# 57.61316872427984
```

精度は倍ほど上がったがそれでもまだ57%、さいみんじゅつと同レベル。  
内訳は以下の通り

1. 元号の可能性がある (57.61316872427984%)
2. 単語間の距離が適切でない (27.160493827160494%)
3. 常用漢字ではない (12.345679012345679%)
4. 単語の意味が元号向きではない (2.880658436213992%)

3番に関してはどうしようもない。過去の元号は読み書きのしやすさなど重視していなかったのだろうが、ここは外せない。  
先ほどから精度を出すために一部のフィルターを外しているが、あくまで元号判別の機能を残すことは忘れてはいけない。(全て外せば100%なのは当たり前）  
では2番と4番も外せないのだろうか。

## １つの仮説
前回の記事の中で、ルール: 国民の理想としてふさわしいようなよい意味を持つものであること  
に関して、その漢字の出し方について考察し、そこで以下のような仮説を立てた。(参考: [やっぱり最大の難関は「よい意味の判断」](https://qiita.com/Wisteria30/items/ba6ced1d55d12ce79943#%E3%82%84%E3%81%A3%E3%81%B1%E3%82%8A%E6%9C%80%E5%A4%A7%E3%81%AE%E9%9B%A3%E9%96%A2%E3%81%AF%E3%82%88%E3%81%84%E6%84%8F%E5%91%B3%E3%81%AE%E5%88%A4%E6%96%AD))

> - 過去の元号もそれ以前の元号で使われたことのある漢字と関連性がある
> - 元号の一語目は他の元号の一語目と関連性があり、二語目も同様である 

重要なのは、この仮説では元号にふさわしい漢字を絞り込んだのではなく、元号の一語目・二語目それぞれにふさわしい漢字を絞り込んだという点である。

ここで１つの仮説が出てきた。  
それは  **過去の元号は、いい感じの距離感を持つ、いい意味の漢字2文字から成り立っていて、それを基に一語目・二語目それぞれにふさわしい漢字が決まるならば、同様にふさわしい距離感も保証される**というものだ。  

それはつまり、元記事の[平成の次の元号を、AIだけで決めさせる物語](https://qiita.com/youwht/items/0b204c3575c94fc786b8)で考察していた「元号として適切な組み合わせ・元号としての組み合わせのバランス」は元号の一語目・二語目それぞれにふさわしい漢字が決まったならば、既に求められているということだ。

はっきり言って、仮説の上に立つ仮説なので正しい保証はどこにもないが、なんだか正しそうな気がする。 (ヤケクソ)

## 二語の距離感フィルターを外す
上記の仮説に従えば、[語の適正フィルター](https://qiita.com/Wisteria30/items/ba6ced1d55d12ce79943#%E8%AA%9E%E3%81%AE%E9%81%A9%E6%AD%A3%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC)に通りさえすれば、[二語の距離感フィルター](https://qiita.com/Wisteria30/items/ba6ced1d55d12ce79943#%E4%BA%8C%E8%AA%9E%E3%81%AE%E8%B7%9D%E9%9B%A2%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC)を通さずとも元号として適切な距離感を持つので、信じて外す。

```python
# 同上
unfil_kakogengo_hinsi_ad_len = len([gen for gen in gengo if judge(gen, model, mecab)])
# 198

# 精度
unfil_kakogengo_hinsi_ad_len/all_gengo_len*100
# 81.48148148148148
```

精度が80%を超えた。ようやくハイドロポンプの命中率にまで持ってくることができた。
もうこれ以上は外せるフィルターがないので、これで打ち止め。

# 終わりに
「令和」が無事元号で良かった！  
インスタを巧みに使う官庁も流石にエイプリルフールには乗らなかったようで。

ついでにエセ精度も評価してみた。判別機として機能するギリギリのラインで過去の元号を判別すると８割以上の確率で正解を出すことが分かった。  
これに関しては、同じデータを使っているので、精度も何もないのだがそこも含めてポエムなのでご愛嬌ということで。

他のテストデータも試してみたいところではあるが、ホイホイ元号が変わるのも面倒なので、しばらくは「令和」が続くことを祈ることにする。


# 【補足】 リークされた元号候補も判別してみる
コメントで面白そうな情報とリンクをいただいたので判別してみる。

> リークされた他の案も調べてみてください！ 
https://www3.nhk.or.jp/news/html/20190402/k10011870221000.html 

リークされた「令和」を除いた5つの原案は以下の通り
「英弘」・「久化」・「広至」・「万和」・「万保」

#### はい、どん！

```
-----英弘-----
常用漢字ではないようです
元号ではなさそうです
-----久化-----
適切な語と語の距離感 0.06 <= x <= 0.54
語と語の距離感: -0.21727973222732544
単語間の距離が適切ではないようです
元号ではなさそうです
-----広至-----
適切な語と語の距離感 0.06 <= x <= 0.54
語と語の距離感: 0.21013568341732025
適切な一語目 0.1 <= x <= 0.56, 適切な二語目 0.03 <= y <= 0.49
一語目　平均: 0.004297872539609671, 二語目　平均: 0.16898992657661438
単語の意味が元号向きではないようです
元号ではなさそうです
-----万和-----
適切な語と語の距離感 0.06 <= x <= 0.54
語と語の距離感: 0.05686895176768303
単語間の距離が適切ではないようです
元号ではなさそうです
-----万保-----
適切な語と語の距離感 0.06 <= x <= 0.54
語と語の距離感: 0.11570872366428375
適切な一語目 0.1 <= x <= 0.56, 適切な二語目 0.03 <= y <= 0.49
一語目　平均: 0.05171163007616997, 二語目　平均: 0.1425367295742035
単語の意味が元号向きではないようです
元号ではなさそうです
```

まさかの全て元号ではないという判定。
単語間の距離が適切ではないものに関しては仮説に基づいてフィルターを外してみる。

```
-----久化-----
適切な一語目 0.1 <= x <= 0.56, 適切な二語目 0.03 <= y <= 0.49
一語目　平均: 0.40043678879737854, 二語目　平均: 0.03221416100859642
元号かもしれないです！
(MTSHの確認は人がしてください)
-----万和-----
適切な一語目 0.1 <= x <= 0.56, 適切な二語目 0.03 <= y <= 0.49
一語目　平均: 0.05171163007616997, 二語目　平均: 0.1358799934387207
単語の意味が元号向きではないようです
元号ではなさそうです
```

それぞれ考察してみる。
### 「英弘」
「弘」が常用漢字ではなく、JIS第1水準漢字なため。
JIS第1水準漢字は画数の多い漢字も入っているので、これは致し方ない。
ただし、過去に「弘化」・「弘治」など「弘」を使った元号がいくつかあるので対策を考えるべきかもしれない。
### 「久化」
元号かもしれない。(元号ではなかったが)
「久」・「化」ともに元号経験のある漢字なので、この中では一番安牌。
むしろ安牌過ぎて選ばれなかった可能性。
### 「広至」
「広」が元号向きの単語ではないため。
いい意味には見えるけど、個人的にコレジャナイ感はわかる。
### 「万和」
「万」が元号向きの単語ではないため。
鶴は千年亀は万年、「万」は「亀」と深い関係性があるような気もするがダメみたい。
### 「万保」  
上と同じく、「万」が元号向きの単語ではないため。
一語目に「千」・「百」を比較として入れてみるとこっちはOKだった。

## まとめ
令和以外の元号候補は「久化」を除いて全て撃沈する面白い結果がみれた。
AI的に見ても他の候補は元号足り得なかったのか。
はたまた、碌に機能しないオンボロ判別機だったのか。
結果論で言うなら、元号になった原案にのみ正常に機能した素晴らしい判別機だ。（笑）
その辺りは見る人の評価に任せたいと思う。