DiscordPHP + 形態素解析

<br>

タグがPばかりで面白いですね
100年くらい前にやった人工無能作成の解説記事です

# 目次

<br>

1. 形態素解析ってなに？

2. DiscordPHPってなに？

3. 形態素解析をして出力を確認する

4. プラグインでbotを実装してみる

5. まとめ

6. 参考文献

<br>

# 1. 形態素解析ってなに？

<br>

**文章にはいろんな名詞や動詞といった品詞が隠れています。文章中を一つ一つの小さな意味として品詞に分解したものを形態素と呼びます。**

形態素はそれ以上細分化すると意味を成しません。中学校で国語の勉強を怠けた人は何とか頑張りましょう

<br>

形態素解析は文章を形態素に分解する解析のことを指します、**今回やるのは解析した形態素を組み合わせて一つの文章にするということです。**

解析にライブラリを使用して形態素解析をする方法があります。有名なもので <a href="https://qiita.com/kojirock5260/items/1787d70b9cfca3e43d12#link_1">MeCab</a> や php-ml などが存在しています。

<br>

**ライブラリを使用する場合、辞書が必要になります**
MeCabを使おうと思っていたのですが、辞書のダウンロードで何世紀もかかりそうだったので断念しました

今回は <a href="https://labs.goo.ne.jp/api/jp/morphological-analysis/">解析サイト</a> にアクセスして出力を貰う実装をします。

<br>

```
[備考]

形態素の感情を分析する感情分析というのがあります
簡単に例えると "ポジティブ" か "ネガティブ" な単語なのか分析します

そういうのがphp-mlでできるらしいということで探していたのですが
リポジトリが消えていたので三日間は夜しか眠れませんでした 
```

# 2. DiscordPHPってなに？

<br>

Discordのbotをphpで動かしたい物好きな方のために
有志な勇者が作成してくださったライブラリです

今回はComposerを使って使用するのですが、Composerの説明は他の方に任せます

- <a href="https://getcomposer.org/">Composer(公式ページ)</a>
- <a href="https://qiita.com/niisan-tokyo/items/8cccec88d45f38171c94">PHP開発でComposerを使わないなんてありえない！基礎編</a>

<br>

<a href="https://github.com/discord-php/DiscordPHP">DiscordPHP</a> は一つのスレッドを占領します
なのでbotがする処理以外のことを外部からはあまりできません

説明項目 **#4. プラグインでbotを実装してみる** では、PMMPを使用した環境を前提としてマルチスレッドでbotを動かし **#3. 形態素解析をして出力を確認する** を用いて文章を作成してレスポンスする実装をします

# 3. 形態素解析をして出力を確認する

<br>

以下、解析方法と出力結果。

```Morph.php
<?php

$id = '取得したID';
$sentence = "今日のご飯はモンスターエナジーです。";

$data = ['app_id' => $id, 'sentence' => $sentence];
$curl = curl_init("https://labs.goo.ne.jp/api/morph");

curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_COOKIEFILE, 'tmp');
curl_setopt($curl, CURLOPT_COOKIEJAR, 'cookie');
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));


var_dump(json_decode(curl_exec($curl), true)["word_list"]);
```

<br>

```result.txt
array(1) {
  [0]=>
  array(8) {
    [0]=>
    array(3) {
      [0]=>
      string(6) "今日"
      [1]=>
      string(6) "名詞"
      [2]=>
      string(9) "キョウ"
    }
    [1]=>
    array(3) {
      [0]=>
      string(3) "の"
      [1]=>
      string(9) "格助詞"
      [2]=>
      string(3) "ノ"
    }
    [2]=>
    array(3) {
      [0]=>
      string(6) "ご飯"
      [1]=>
      string(6) "名詞"
      [2]=>
      string(9) "ゴハン"
    }
    [3]=>
    array(3) {
      [0]=>
      string(3) "は"
      [1]=>
      string(12) "連用助詞"
      [2]=>
      string(3) "ハ"
    }
    [4]=>
    array(3) {
      [0]=>
      string(15) "モンスター"
      [1]=>
      string(6) "名詞"
      [2]=>
      string(15) "モンスター"
    }
    [5]=>
    array(3) {
      [0]=>
      string(12) "エナジー"
      [1]=>
      string(6) "名詞"
      [2]=>
      string(12) "エナジー"
    }
    [6]=>
    array(3) {
      [0]=>
      string(6) "です"
      [1]=>
      string(9) "判定詞"
      [2]=>
      string(6) "デス"
    }
    [7]=>
    array(3) {
      [0]=>
      string(3) "。"
      [1]=>
      string(6) "句点"
      [2]=>
      string(0) ""
    }
  }
}
```

# 4. プラグインでbotを実装してみる

<br>

基本的な実装の仕方
- <a href="https://gist.github.com/WhiteGrouse/061c9e50b3096aec911548188bca09df">DiscordPHPは神だった</a>

プラグイン作ってみた
- <a href="https://github.com/ribnil/MorphBot">ribnil/MorphBot</a>

<br>

### 概要

プラグインが読み込まれたときにデータをThreadに渡してそれをもとに形態素解析してる
5分に一回集めたデータを解析してthreadが止まったらデータを保存してる


***

自分のギルドのIDだったり形態素解析させてくれるサイトで取得したIDだったり
もっと処理をいじりたかったら必要に応じて編集してください

```DiscordThread.php
define('APP_ID', '');
define('BOT_TOKEN', '');

define('GUILD_ID', '');
define('MAIN_CHAT_CHANNEL_ID', '');
```

***

**taken**: botのトークン
**logging**: botの動作ログの表示
**intents**: 受け取るイベントの種類(?)

```DiscordThread.php
$discord = new Discord([
	'token' => BOT_TOKEN,
	'logging' => false,
	'intents' => [Intents::GUILD_MESSAGES]
]);
```

<br>

# まとめ

やっぱりphpってサイコーだな！(笑)

botの用意とかappidの用意とか面倒くさいけれど頑張ってください
動かなくても怒らないでください、怒りよりissueを投げてくれると安心します

<br>

いい感じの文章を作りたいと思っていても
~~あんなにひどい出力から~~品詞を分別するのがとても苦労すると思います

そこは開発者としての意地と根性を使って何とかしてほしいです
(出来たら僕にも送ってください)

***

PMMPプラグイン開発者グループ
- <a href="https://discord.gg/4SsCC87">server.mcbe.jp : Discord</a>

***

<br>

# 参考文献

- <a href="https://labs.goo.ne.jp/api/jp/morphological-analysis/">goo ラボ</a> 
- <a href="https://gist.github.com/WhiteGrouse/061c9e50b3096aec911548188bca09df">DiscordPHPは神だった</a>
- <a href="https://qiita.com/niisan-tokyo/items/8cccec88d45f38171c94">PHP開発でComposerを使わないなんてありえない！基礎編</a>