シェルスクリプトマガジン

香川大学SLPからお届け!(Vol.83掲載)

著者:安田 大朗

最近、さまざまな場面でチャットbotなどの対話システムを見かけます。その中には、感情表現の機能を持ち、より人間らしい振る舞いをするものもあります。私はそうした対話システムに興味があり、ユーザーが入力したテキストの感情を分析し、それに応じた反応をする対話システムを作成しました。今回は、私が開発したその対話システムについて紹介します。

シェルスクリプトマガジン Vol.83は以下のリンク先でご購入できます。

図4 「telegram-bot.py」ファイルに記述するコード

from telegram.ext import (Updater, CommandHandler,
                          MessageHandler, Filters)

TOKEN = "トークン"
class TelegramBot:
  def __init__(self, system):
    self.system = system
  def start(self, update, bot):
    input = {'utt':None, 'sessionId':str(update.message.from_user.id)}
    update.message.reply_text(self.system.initial_message(input)["utt"])
  def message(self, update, bot):
    input = {'utt':update.message.text,
             'sessionId':str(update.message.from_user.id)}
    system_output = self.system.reply(input)
    update.message.reply_text(system_output["utt"])
  def run(self):
    updater = Updater(TOKEN, use_context=True)
    dp = updater.dispatcher
    dp.add_handler(CommandHandler("start", self.start))
    dp.add_handler(MessageHandler(Filters.text, self.message))
    updater.start_polling()
    updater.idle()

図5 「aim_system1.py」ファイルに記述するコード

import aiml
import MeCab
from telegram_bot import TelegramBot

class AimlSystem:
  def __init__(self):
    self.sessiondic = {}
    self.tagger = MeCab.Tagger('-Owakati')
  def initial_message(self, input):
    sessionId = input['sessionId']
    kernel = aiml.Kernel()
    kernel.learn("aiml.xml")
    self.sessiondic[sessionId] = kernel
    return {'utt':'はじめまして,雑談を始めましょう',
            'end':False}
  def reply(self, input):
    sessionId = input['sessionId']
    utt = input['utt']
    utt = self.tagger.parse(utt)
    response = self.sessiondic[sessionId].respond(utt)
    return {'utt':response, 'end':False}

if __name__ == '__main__':
    system = AimlSystem()
    bot = TelegramBot(system)
    bot.run()

図6 「aim.xml」ファイルに記述するルールの例

<?xml version="1.0" encoding="UTF-8"?>
<aiml version="1.0.1" encoding="UTF-8">
 <category>
    <pattern>* へ 旅行 に 行き まし た</pattern>
    <template><star/>に旅行ですか,いいなー.</template>
  </category>
  <category>
    <pattern>私 の 名前 は * です</pattern>
    <template><set name="username"><star/></set>さん、よろしくね!.</template>
   </category>
  <category>
    <pattern>じゃあね</pattern>
    <template><get name="username"/>さん、バイバイー.</template>
  </category>
</aiml>

図8 「aim_system2.py」ファイルに記述するコード

    response = self.sessiondic[sessionId].respond(utt)
    emotion_dic = {'suki':'🥰', 'ikari':'😡', 'kowa':'😱',
                   'yasu':'😊', 'iya':'😫', 'aware':'😭',
                   'takaburi':'🤩', 'odoroki':'🙄', 'haji':'🤭',
                   'yorokobi':'😄'}
    emotion_analyzer = MLAsk()
    json_emot = emotion_analyzer.analyze(utt)
    if json_emot['emotion'] == None:
      return {'utt':response, 'end':False}
    else:
      emotion = json_emot['representative'][0]
      return {'utt':response + emotion_dic[emotion], 'end':False}

if __name__ == '__main__':