著者:安田 大朗
最近、さまざまな場面でチャット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__':