メモ帳 or チラシの裏的な何か

ネット関係とかアニメとか。特に制限は無しです

プログラミング初心者がマルコフ連鎖で会話するDiscordBotを作ってみる

皆さんこんにちは。

久しぶりのブログ更新です。

 

今回はタイトル通りですが、自分のメモという面が大きいです。

ですので見にくいかもしれませんが、参考になれば幸いです。

 

今回は人口知能を作ってみます。マルコフ連鎖なので無能と言われればそこまでですが、AIですAI。

 

 

そもそも、マルコフ連鎖とは何か。という話なのですが、多くの他のブログさん同様、あまり理解できていませんが、こういう事だそうです。

マルコフ性Markov property)とは、次の状態が過去の状態に依存せず現在の状態のみによって決まる性質のことである。

マルコフ性が存在する場合、状態が {q0, q1, q2, q3, ……, qn-1} のn通りを取るような状態遷移において、現在の状態が qi であった時に次の状態 qj に遷移する確率は純に次の状態と現在の状態のみで記述され、 P(qj | qi) で決定される。

 

byニコニコ大百科

 

 Wikipediaさんや個人ブログさんでも良かったのですが、前者はもう何言ってるのか分からない、後者はなかなか簡単に説明しているのが無かったため、大百科さんにしました。

 

簡単に言っちゃうとユーザーが送信したメッセージに最適な返答を確率で求めよう!...だと思っています(間違っていたらどなたかコメントにお願いします(;'∀'))

 

さて、実際にやってみよう!なのですが、やろうとしたことは先人が大体やっているこの世の中。調べたら多数のサイトが出てきました。

 

ので、まずは参考になったサイトを紹介しようと思います。

 

TensorFlowで会話AIを作ってみた。

こちらのサイト(というかプレゼン)はまずは概念理解にお勧めです。

「AI?何それ?機械が学習するの?」

って方はまずこれを読んで概念理解から初めて頂けると分かりやすいと思います。

他のサイトとかはこんな感じです。

マルコフ連鎖でTwitter Botをつくりました | takuti.me

 

多分概念理解自体は上記でできますので(分からなかったら「マルコフ連鎖 python」とか「会話bot 作り方」とかでググってネサフすれば出てくると思います)取り敢えずはこれぐらいにしておきます。

 

次にコードで参考になった記事です。

マルコフ連鎖を使って自分らしい文章をツイートする

【エヴァンゲリオン】アスカっぽいセリフをDeepLearningで自動生成してみる

Windows10+Python+C#でDiscord用マルコフ連鎖Botを作った話

 

等々....

 

何十サイトと見ました。それぞれのサイトの執筆者さん、ありがとうございます。

 

上記のサイトでもコーディング能力がある方は十分できるかと思いますが、如何せん私は初心者。

もう少し簡単にしてあるサイトの方がいいと思い、ネサフを続けます。

 

....

 

そして、結局このサイトさんに書いてある内容を使わせて頂くことに。

ai-coordinator.jp

 

こちらのサイトさんが直感的に理解できましたので採用。

ただ、SlackBotですので、適宜Discord用に変換しないといけません。

 

コードを読んでいくと、どうやらマルコフ連鎖のコード部分は最後のSlackbotに返事させる部分以外は丸ごと使えるみたいでしたので、ほぼ全部(一部変えた部分もあった記憶ですが)利用させて頂きます。

 

ちなみにその時SlackBotについては全く知りませんでしたのでちょっと調べました。

閲覧させて頂いたサイト様のリンクを載せときますので参考になれば幸いです。

Pythonを使ったSlackBotの作成方法

PythonのslackbotライブラリでSlackボットを作る

 

又、janomeという形態素解析を使用しているという事なのでjanomeについても調べました。

Welcome to janome’s documentation! (Japanese) — Janome v0.3 documentation (ja)

(タイトルは英語ですが、タイトルにも書いてあるように中身は日本語です)

 

そして、肝心のDiscord部分の実装です。

上記サイト様のコードを利用させてもらいつつ、適宜Discord用に改変していきます。

フォルダ構成は以下の通りです。

 

marcov # 名前は好きな物で大丈夫です
├─ main.py #ここにソースコードを書きます。好きな名前で大丈夫です

└─ chat_bot.json #自動生成されますので、最初は無いです

 

これだけです。

Slackbotは結構多くのフォルダ分けが必要みたいですが、DiscordBotなのでソースコード1個とデータ保存用のjsonファイルだけですみます。

 

そして、Slackbot部分を適宜Discordに適応させていく作業に入ります。

 

....ここで、今更ですが、環境を書きます。

Pycharm - Pythonコードを書くためのソフトです。なくても良いですが、滅茶苦茶使いやすいですのでもしよければ是非。

Python3.6 - インストールしていないのならこれだけはインストールお願いします。じゃないとPythonコード自体動きません(;・∀・)

 

そして、discord.py とjanomeもpipでインストールしておいてください。(pip?何それ?って人は「Python pip とは」で調べたら出てくると思います)

 

そこまで出来たら、次はDiscordbot側の登録に移ります。

Discordbot作ったことのない方は以下の記事が参考になりますので、以下の記事を参考にしてbot登録を行ってください。

Pythonで簡単なDiscord Botの作り方

 

作成が終わったら、コードを書いていきましょう。

先程のサイトにあったマルコフ連鎖のコードをそのまま持ってきてください。

そして以下の部分を

@default_reply()
def default_func(message):
    text = message.body['text']     # メッセージを取り出す
    res = make_reply(text)
    message.reply(res)

以下の様に変えます。(コピペで大丈夫です)

client = discord.Client()


@client.event #Discordbot起動確認
async def on_ready():
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('------')

@client.event #Discordbotへの投稿とコメント取得
async def on_message(message):
    if client.user != message.author:
        text = message.content
        res = make_reply(text)
        await client.send_message(message.channel, res)


client.run('token')

注意点ですが、 

・import discord をコード最上部に記述してください

・'token'の部分はご自身のDiscordトークンに変えてください。

 

 

これでマルコフ連鎖での会話が可能なdiscordbotが出来ました。

 

恐らくとんでもない量の会話練習が必要ですが、複数人で数日に渡って教育を積めばそれっぽい会話をしてくれる気はします。

 

お疲れ様でした。質問などあればコメント欄や私のdiscordのDMへ送っていただければわかる範囲でお答えします~(分からなかったら申し訳ございません(;'∀'))

 

追記:ソースコード全文をGithubに公開しました。

github.com