著者:安田 大朗
最近、さまざまな場面でチャットbotなどの対話システムを見かけます。その中には、感情表現の機能を持ち、より人間らしい振る舞いをするものもあります。私はそうした対話システムに興味があり、ユーザーが入力したテキストの感情を分析し、それに応じた反応をする対話システムを作成しました。今回は、私が開発したその対話システムについて紹介します。
シェルスクリプトマガジン Vol.83は以下のリンク先でご購入できます。
図4 「telegram-bot.py」ファイルに記述するコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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」ファイルに記述するコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
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」ファイルに記述するルールの例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?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」ファイルに記述するコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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__': |