8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

DiscordPHP + 形態素解析

Last updated at Posted at 2021-02-13

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

目次


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

  2. DiscordPHPってなに?

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

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

  5. まとめ

  6. 参考文献


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


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

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


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

解析にライブラリを使用して形態素解析をする方法があります。有名なもので MeCab や php-ml などが存在しています。


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

今回は 解析サイト にアクセスして出力を貰う実装をします。


[備考]

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

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

2. DiscordPHPってなに?


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

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


DiscordPHP は一つのスレッドを占領します
なのでbotがする処理以外のことを外部からはあまりできません

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

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


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

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"]);

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を実装してみる


基本的な実装の仕方

プラグイン作ってみた


概要

プラグインが読み込まれたときにデータを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]
]);

まとめ

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

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


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

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


PMMPプラグイン開発者グループ



参考文献

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?