そうだ、ぶぶ漬け食べよう。【京都弁で始める自然言語処理】

# はじめに
自然言語処理初めてやります。わくわく。
この記事は[Qiita x COTOHA APIプレゼント企画】COTOHA APIで、テキスト解析をしてみよう！](https://zine.qiita.com/event/collaboration-cotoha-api/?utm_source=qiita&utm_medium=banner)に参加しています。 ~~景品ほしすぎ！~~ 投稿間に合った。

# 早速本題。今からやること。
最初にざっと何やるか紹介します。
できたのが以下のやつ↓

```
python3 bubuduke.py "ヘタクソ"
「お上手どすな」
```

こんな感じの京都弁翻訳機を作っていきます。
ぶぶ漬けおいしい！やったー！
![bubu.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359997/bd8def10-a310-a1a1-d03f-4fe2e3618faf.jpeg)



# 本記事の流れ
- とりあえずCOTOHA APIを使ってみる(初めて使いました)
- 自然言語処理って何
- テキストを自然言語処理してみる

という流れで、気がついたら上のような便利ツールができているわけですね。めっちゃ簡単。

## とりあえずCOTOHA APIを使えるようにする
[ここ](https://api.ce-cotoha.com/contents/index.html)から今すぐ無料登録。メールアドレスを送信してアカウントを作りましょう。できたらログイン。そしたらこんな画面になる。(ここまで宣伝)
![cotohaapi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359997/77232ff6-2ff3-d7f7-5359-8fb2dffb72b0.png)

このサイトについてはあとでIDとか使うだけなのでこれで一旦終わり。

## 自然言語処理って何
めっちゃ簡単にいうと人間が普段使っている言葉(=自然言語)を処理すること。いや、そのままやないかい。
これの何が難しいかと言うと、**自然言語、中でも日本語がwell-definedでない** ということ。

### 日本語はwell-definedでない
「well-definedでない」というのは、定義によって一意の解釈又は値が割り当てられないということ。
ここでは一文に対して複数の解釈が考えられると言うことですね。

簡単な例を考えてみました。以下の通り。
![ toilet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359997/20697b4f-38b7-5cb8-a832-847a9b6303c1.png)
これを見てうんこを流しちゃダメだと思う人間はいないですよね。
ただ、この文章を文字通り擬似コードで書いてみるとこうなります。

```
if 流すもの == "トイレットペーパー" then
  流していい
```
あれ？うんこ流せない気がしてきました。


### 京都弁はその極みである。
今回取り扱ってみようと思った京都弁。例えばこんな感じ。
![ bubuduke.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359997/38e81117-e8bc-3176-0a63-d98c158d7f25.png)

上のは有名なぶぶ漬けですね。
ぶぶ漬けというのは京都弁ではお茶漬けのことを指すはず。
それなのに、ぶぶ漬けを勧められるということは、もう帰ってくれと言う意味になるんですね。
訳がわからない。

### とにかく京都弁は陰湿
もう1つ例を上げてみます。
![  tokei.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359997/38712a2f-f0fb-32e9-c705-f519bc5863b7.png)

ごめんなさい脱線が長いですね。
その他にも嫌味な京都言葉がたくさんあるのですが割愛。気になる方は[こちら](https://iirou.com/kazoekata/)が色々載ってていいと思います。
要するに、**京都弁は陰湿で、well-definedでない言葉の極み。**

自然言語処理では、こういった自然言語から、単語や構文を情報に照らし合わせて処理していきます。
結局自然言語についての説明しかしていないのですが。今から日本語という自然言語を処理し、こういった陰湿な京都弁"風"のリプライができるbotを実装していきます。


## テキストを自然言語処理してみる
ひとまずbotを作る部分は無視して、自然言語処理をやっていきます。
~~正直言ってここが本質なのでここ以外読まなくていいです。~~
ここからが本質なのですがCOTOHA 凄すぎてすぐ終わっちゃった。

### サンプル1
とりあえず入力を受け付けて、軽く処理してみます。
文章を受け取って名詞だけを返すデモです。
[名作](https://qiita.com/Harusugi/items/f499e8707b36d0f570c4)を参考にしました。
[ライブラリ](https://github.com/obilixilido/cotoha-nlp)の威力が半端なさすぎて何もわかってなくてもできてしまう。
まずライブラリを入れます。

```
pip install git+https://github.com/obilixilido/cotoha-nlp.git
```


<details><summary>作ったコードがこれ。</summary><div>

```python:samplecode1.py
from cotoha_nlp.parse import Parser

parser = Parser("Client ID",
  "Client secret",
  "https://api.ce-cotoha.com/api/dev/nlp",
  "https://api.ce-cotoha.com/v1/oauth/accesstokens"
)
s = parser.parse(input())

print(" ".join([token.form for token in s.tokens if token.pos in  ["名詞"]]))
```
</div></details>

あとでもう1度掲載しますが、サンプルコードはGitHubに上げているのでそちらもご覧になってください。
このコードを実行してみます。`python ファイル名 文字列`の順で入力すると文字列を処理した結果が返ってきます。

```
python samplecode1.py 春はあけぼの。そうだ、京都行こう。
```
そしたら返ってくる。

```
>>春 あけぼの 京都
```
いかがでしょうか。これだけのコードで十分立派な自然言語処理ができました。やばすぎ。
~~何も理解してない。~~

### 京都弁"風"変換スクリプト完成形
続いて、京都弁風botの実装に取り掛かっていこうと思います。
[先ほどのサイト](https://iirou.com/kazoekata/)からスクレイピングして、抽出した名詞と一致する日本語直訳があればその京都弁を返す。
普通の日本語の入力から作るための流れはこう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359997/a117d6c5-2489-22fd-610f-f8507b856267.png)

スクレイピングをするのでちょっとライブラリを入れます。

```
pip3 install requests
pip3 install beautifulsoup4
```


<details><summary>こんな感じになりました。</summary><div>

```python:bubuduke.py
from cotoha_nlp.parse import Parser
import requests
from bs4 import BeautifulSoup
import re

parser = Parser("Client ID",
  "Client secret",
  "https://api.ce-cotoha.com/api/dev/nlp",
  "https://api.ce-cotoha.com/v1/oauth/accesstokens"
)
# input
s = parser.parse(input())

# get nouns
nouns = [token.form for token in s.tokens if token.pos in  ["名詞"]]

# web scraping
r = requests.get('https://iirou.com/kazoekata/')
soup = BeautifulSoup(r.content, "html.parser")
block = soup.find_all("p")

# output
for noun in nouns:
  for tag in block:
    if noun in str(tag):
      #strongタグ内にある京都弁を切り出し
      output = re.findall('<strong>.*</strong>', str(tag))
      out = output[0]
      out = out.replace("<strong>", "")
      out = out.replace("</strong>", "")
      print(out)
```
</div></details>

早速実行。

```
python bubuduke.py "迷惑やで"
```
陰湿な京都弁が返ってくる！

```
>>「お嬢ちゃん、ピアノ上手になったなぁw」
```

これで自然言語処理パートは終わり。
次回、botを作るだけですね。ジャンルも変わりますし本記事はここまで。

# 次回やりたいこと
LINEのbotにしたい。
もう少し精度はあげたい。完全一致していない単語でも拾いたい。今のところ対応してる単語がめっちゃ少ないので。
その辺はまた今度書きます。

# おわりに
[今回使ったコードのリポジトリ](https://github.com/KoukiNAGATA/bubuduke)
[リファレンス](https://api.ce-cotoha.com/contents/reference/apireference.html) 
任意の言語、ライブラリ、フレームワーク等では結局公式リファレンスが1番使えます。

最後まで読んでいただきありがとうございました。
~~景品欲しすぎなので~~ LGTMお願いします。
LGTMが受け付けない方は[この辺](https://qiita.com/HirosuguTakeshita/items/f015fee48f42a41045ef)参考にいいねにしてね。