誰でも簡単にラインで自然言語処理をできるようにしてみた

# 2020/0829
**LINE Bot公開終了しました**

##どゆこと？
投稿した文章に対して、11種類の自然言語処理を行ってくれるLINE Botです。
友達追加して解析したい文を投げる（&解析方法を選ぶ）だけで解析結果を見やすい形で返してくれます。

＞＞＞
![qiita_upload.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304608/0d307940-591d-b109-9728-e6ad136f0666.gif)
＞＞＞

ひとまず試してみたい方はこちら（友達追加用QRコード）→
![189tfayy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304608/1f965970-2a19-e1e5-3ded-0a33027e885d.png)

なおBot名の提案大募集中です。
（仮で付けたら一週間名称変更できませんでした...）

##使い方
日本語で始まる文章を投げて、
<img width="265" alt="pr1.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304608/1d7e703e-db7c-b8bc-d1d8-d6541f42c292.jpeg">

解析方法*番号を半角数字で入力するだけ！
<img width="266" alt="pr2.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304608/ba1c9af2-3a1d-90e2-0829-b19e8253ded0.jpeg">


解析結果が見やすい&読みやすい形で返ってきます。
<img width="263" alt="pr3.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304608/eed6f657-9ca9-dd04-0bb5-0e61d03cb3d2.jpeg">


*)解析方法は
 1 = 構文解析
 2 = 固有表現抽出
 3 = キーワード抽出
 4 = 照応解析
 5 = 類似度算出
 6 = 文タイプ判定
 7 = ユーザ属性推定
 8 = 言い淀み除去
 9 = 音声認識誤り検知
10 = 感情分析
11 = 要約
の[１１種類](https://api.ce-cotoha.com/contents/reference/apireference.html)から選択できます。



##使ってみた結果
###構文解析
投入した文章
>このももとあのももはももたろうのももです。すももももももももたろうのなかまのももです。

結果
<img width="266" alt="pr1.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304608/4f0f2895-f0bf-4ba8-0809-030cbcf675ea.jpeg">


<details><summary>解析結果全文</summary><div>
>＜構文解析＞
結果は
「表記」
(カナ読み / lemma / 品詞 / 副品詞)
の形で出力されます！

>この
(コノ / この / 連体詞 / )

>もも
(モモ / 桃 / 名詞 / )
と
(ト / と / 格助詞 / 連用)

>あの
(アノ / あの / 連体詞 / )

>もも
(モモ / 桃 / 名詞 / )
は
(ハ / は / 連用助詞 / )

>ももたろう
(モモタロウ / 桃太郎 / 名詞 / )
の
(ノ / の / 格助詞 / 連体)

>もも
(モモ / 桃 / 名詞 / )
です
(デス / です / 判定詞 / 終止)
。
( / 。 / 句点 / )

>すもも
(スモモ / 李 / 名詞 / )
も
(モ / も / 連用助詞 / )

>もも
(モモ / 桃 / 名詞 / )
も
(モ / も / 連用助詞 / )

>ももたろう
(モモタロウ / 桃太郎 / 名詞 / )
の
(ノ / の / 格助詞 / 連体)

>なかま
(ナカマ / 仲間 / 名詞 / )
の
(ノ / の / 格助詞 / 連体)

>もも
(モモ / 桃 / 名詞 / )
です
(デス / です / 判定詞 / 終止)
。
( / 。 / 句点 / )
</div></details>

ちゃんと認識できてますね！


###固有表現抽出
文章：
[日本国憲法](http://www.shugiin.go.jp/internet/itdb_annai.nsf/html/statics/shiryo/dl-constitution.htm)から
>朕は、日本国民の総意に基いて、新日本建設の礎が、定まるに至つたことを、深くよろこび、枢密顧問の諮詢及び帝国憲法第七十三条による帝国議会の議決を経た帝国憲法の改正を裁可し、ここにこれを公布せしめる。

結果：
<img width="267" alt="2.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304608/ca122639-41fa-c72e-3203-6c5c8482f608.jpeg">

<details><summary>解析結果全文</summary><div>
>＜固有表現抽出＞
>結果は
「表記」
(標準表記 / 固有表現クラス / 拡張固有表現クラス)
の形で出力されます！

>定まる
(定まる / PSN /  /  )

>枢密顧問の諮詢及び帝国憲法第七十三条
(枢密顧問の諮詢及び帝国憲法第七十三条 / ART /  /  )

>帝国議会の議決を経た帝国憲法
(帝国議会の議決を経た帝国憲法 / ART /  /  )

>日本国民
(日本国民 / ORG / Ethnic_Group /  )

>新日本建設
(新日本建設 / ORG / Company /  )
</div></details>

「新日本建設(新日本建設 / ORG / Company /  )」
その発想はなかった...！


###キーワード抽出
文章（引用元：[COTOHA API](https://api.ce-cotoha.com/contents/index.html)）：
>全部で14の自然言語処理・音声処理APIをご提供

>言語のなかでも特にむずかしいとされる日本語の高精度な解析が可能なCOTOHA API。
テキスト解析や対話エンジン(テキスト/音声)などにご利用いただけます。

結果：
<img width="265" alt="3.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304608/83ddeefd-b995-1503-276c-66975c2309bb.jpeg">

「COTOHA API」も抽出できています！

###照応解析
文章：
>山田君は山田研究所の所員です。彼は自然言語解析をテーマとしていますが、それは彼らの研究のほんの一部にすぎません。

結果：
<img width="265" alt="4.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304608/124917c2-e0ec-3ae4-79f9-7f14a7ae1425.jpeg">

けっこういい感じ！


###（意味的）類似度判定
日本と韓国の憲法（の中身）が似ていると聞いたことがあるので、
じゃあ前文は？
ってことでやってみました。

文章：
<details><summary>[日本国憲法前文](https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E5%9B%BD%E6%86%B2%E6%B3%95%E5%89%8D%E6%96%87)</summary><div>
>日本国民は、正当に選挙された国会における代表者を通じて行動し、われらとわれらの子孫のために、諸国民との協和による成果と、わが国全土にわたって自由のもたらす恵沢を確保し、政府の行為によつて再び戦争の惨禍が起ることのないようにすることを決意し、ここに主権が国民に存することを宣言し、この憲法を確定する。そもそも国政は、国民の厳粛な信託によるものであつて、その権威は国民に由来し、その権力は国民の代表者がこれを行使し、その福利は国民がこれを享受する。これは人類普遍の原理であり、この憲法は、かかる原理に基くものである。われらは、これに反する一切の憲法、法令及び詔勅を排除する。
日本国民は、恒久の平和を念願し、人間相互の関係を支配する崇高な理想を深く自覚するのであつて、平和を愛する諸国民の公正と信義に信頼して、われらの安全と生存を保持しようと決意した。われらは、平和を維持し、専制と隷従、圧迫と偏狭を地上から永遠に除去しようと努めてゐる国際社会において、名誉ある地位を占めたいと思ふ。われらは、全世界の国民が、ひとしく恐怖と欠乏から免かれ、平和のうちに生存する権利を有することを確認する。
われらは、いづれの国家も、自国のことのみに専念して他国を無視してはならないのであつて、政治道徳の法則は、普遍的なものであり、この法則に従ふことは、自国の主権を維持し、他国と対等関係に立たうとする各国の責務であると信ずる。
日本国民は、国家の名誉にかけ、全力をあげてこの崇高な理想と目的を達成することを誓ふ。
</div></details>

<details><summary>[大韓民国憲法前文](https://ja.wikipedia.org/wiki/%E5%A4%A7%E9%9F%93%E6%B0%91%E5%9B%BD%E6%86%B2%E6%B3%95%E5%89%8D%E6%96%87)</summary><div>
>悠久な歴史と伝統に輝く我々大韓国民は、3・1運動で建立された大韓民国臨時政府の法統と、不義に抗拒した4・19民主理念を継承し、祖国の民主改革と平和的統一の使命に立脚して、正義・人道と同胞愛で民族の団結を強固にし、全ての社会的弊習と不義を打破し、自律と調和を土台に自由民主的基本秩序をより確固にし、政治・経済・社会・文化のすべての領域において各人の機会を均等にし、能力を最高度に発揮してもらい、自由と権利に拠る責任と義務を完遂するようにし、(国)内では国民生活の均等な向上を期し、外(交)では恒久的な世界平和と人類共栄に貢献することで我々と我々の子孫の安全と自由と幸福を永遠に確保することを確認しつつ、1948年7月12日に制定され8次にわたり改正された憲法を再度国会の議決を経って国民投票によって改正する。
</div></details>

結果：
<img width="263" alt="5.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304608/9be0c8c9-c279-8a88-6910-cc1fe4caa6b5.jpeg">

＞＞＞**99.8%**＜＜＜

マジ？

###文タイプ判定
文章（引用元：[JR東日本　新幹線の運行状況](https://traininfo.jreast.co.jp/train_info/shinkansen.aspx)）：
>北陸新幹線は、台風１９号の影響で、暫定ダイヤで運転しています。時刻等の詳細はＪＲ東日本ホームページをご確認下さい。

結果：
<img width="265" alt="6.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304608/934773ed-c0dd-b2bc-eded-e7013f6d84bf.jpeg">

文章（叙述、質問、命令）の中では「命令」、
発話行為１９種の中で「directive (=指示)」
とかなり正確！



###ユーザー属性推定
文章：
>古池や蛙飛びこむ水の音

松尾芭蕉の属性は...

<img width="266" alt="7.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304608/d7cbfa66-64c7-aa36-a2fd-97e338850367.jpeg">

うーん？
どうやって推定してるんですかね？

###言い淀み除去
文章：
>あなたは、あのー、お母様と、お、お父様と、えーっと妹さんと、その、こちらに、えーっと、いらしたんですね

結果：
<img width="266" alt="8.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304608/c71a3f86-b669-a6e4-6f74-d32b028f54ab.jpeg">

わりといい感じ？


###音声認識誤り検知
文章：
もう一回[日本国憲法](http://www.shugiin.go.jp/internet/itdb_annai.nsf/html/statics/shiryo/dl-constitution.htm)から
>朕は、日本国民の総意に基いて、新日本建設の礎が、定まるに至つたことを、深くよろこび、枢密顧問の諮詢及び帝国憲法第七十三条による帝国議会の議決を経た帝国憲法の**快晴**を裁可し、ここにこれを公布せしめる。

結果：
<img width="264" alt="9.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304608/ed51c062-e332-2f5f-412f-ceb45b8f1766.jpeg">
修正候補に関しては文内容との整合性を考慮していないっぽい。


###感情分析
文章：

>嬉しそうに見えてたけど、実は悲しかったらしい。

結果：
<img width="264" alt="10.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304608/cba8a9a4-1d81-6d4d-6cf6-16608b486a35.jpeg">

Positive wordとNegative word１個ずつならNeutralになるかと思ったけど違った。

###要約
ちょうど近所のスーパーからLINEで広告が送られてきたので...
文章：
>こんにちは(わーい)

>明日 2/12（水）～2/15（土）
全国お取り寄せグルメを販売いたします！

>今回は北海道の定番商品(きらきら)
「オタル製菓」の大鵬をご用意しました(ぴかっ)
米ぬか油でカラッと揚げた生地に、香り豊かな本醸造醤油（保存料無添加）とビート糖をブレンドした独自の甘辛い糖蜜を掛けたスナック菓子です。

>是非、ご賞味ください。

>ご来店お待ちしています(きゅん)

結果：
<img width="266" alt="11.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304608/95478def-a4bf-1dba-9701-c83877a88cd6.jpeg">

＞＞＞＞ご来店お待ちしています(きゅん)。＜＜＜＜

確かに重要...！

##使ったもの
・GAS (Google App Script)
・LINE API
・[COTOHA API](https://api.ce-cotoha.com/contents/index.html)

##コード（後日公開予定）
公開するには汚すぎたので、綺麗にしてからあげます...


##参考
・[スプレッドシート内を検索](https://tonari-it.com/gas-spreadsheet-find/)
・[curl→gsに変換](https://qiita.com/murase/items/7a75f07d417366b2dbc8)
・[自然言語処理を簡単に扱えると噂のCOTOHA APIをPythonで使ってみた](https://qiita.com/gossy5454/items/83072418fb0c5f3e269f)

また以下のコードどこから引用したのかわからなくなってしまったので、お心当たりある方は大変恐縮ですが該当コードが書かれている記事のURLを添えてコメントお願いします。
すぐに参考の方に追加させていただきます。

こんな感じのコード：

```js:
/*
LINEから送信されたデータをメイン処理する
———————————–*/
function doPost(e) {
  /* レスポンスを取得 */
  const responseLine = e.postData.getDataAsString();
  /* JSON形式に変換する */
  const responseLineJson = JSON.parse(responseLine).events[0];
  /* イベントへの応答に使用するトークンを取得 */
  const replyToken = responseLineJson.replyToken;

  var json = JSON.parse(e.postData.contents);
  //user_idの取得、var宣言をしなければグローバル化
  LINE_user_id = json.events[0].source.userId;

  /*– メッセージイベントの場合 ———————–*/
  if (responseLineJson.type == 'message') {
    messageController(responseLineJson, replyToken);
  }
}


/*
メッセージイベントの処理
———————————–*/
function messageController(events, replyToken) {
  const message = events.message;
  const input = message.text;
  var content = processing(input);
  var LineMessageObject = [{
      'type': 'text',
      'text': content
  }];

  replyLine(LineMessageObject, replyToken);
}

/*
LINEに返信する処理
———————————–*/
function replyLine(LineMessageObject, replyToken) {
    const replyHeaders = {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ' + LINE_TOKEN
    };

    const replyBody = {
        'replyToken': replyToken,
        'messages': LineMessageObject
    };

    const replyOptions = {
        'method': 'POST',
        'headers': replyHeaders,
        'payload': JSON.stringify(replyBody)
    };

    UrlFetchApp.fetch('https://api.line.me/v2/bot/message/reply', replyOptions);
}

```