ランダムに応答するChatBotがようやくできた。 ソースだけ記録。 ソースが長くなったので、モジュールに分割した。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import MeCab import unidic class Morph(): def analy_noun(self, tt): nouns = [] tagger = MeCab.Tagger() lines = tagger.parse(tt).split('\n') for line in lines: words = line.split('\t') if len(words) == 2: word = words[1].split(',') if word[0] == '名詞': nouns.append(words[0]) return nouns |
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 |
class Dicts(): def __init__(self): self.dic_random = [] try: with open('random.txt', 'r', encoding='UTF-8') as fr: lines = fr.readlines() for line in lines: self.dic_random.append(line.rstrip('\n')) except OSError as e: print(e) def study_random(self, tt): if tt not in self.dic_random: self.dic_random.append(tt) def save(self): try: with open('random.txt', 'w', encoding='UTF-8') as fw: for line in self.dic_random: fw.write(line + '\n') except OSError as e: print(e) def getradomdic(self): return self.dic_random |
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 27 |
import responderC as res import dicsC as dictsc import random class ChatBot(): def __init__(self, name): self.name = name self.dicts = dictsc.Dicts() self.resp_what = res.WhatResponder('ナニ') rnddic = self.dicts.getradomdic() self.resp_rand = res.RandomResponder('ランダム', rnddic) self.responder = res.Responder('') def dialog(self, txt): nn = random.randint(0,1) if nn == 0: self.responder = self.resp_what elif nn == 1: self.responder = self.resp_rand self.dicts.study_random(txt) return self.responder.response(txt) def save(self): self.dicts.save() def resp_name(self): return self.responder.name |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import random class Responder(): def __init__(self, name): self.name = name def response(self, input_text): return '' class WhatResponder(Responder): def __init__(self, name): super().__init__(name) def response(self, input_text): return input_text + 'って何?' class RandomResponder(Responder): def __init__(self, name, dic): super().__init__(name) self.dic = dic def response(self, input_text): return self.dic[random.randint(0, len(self.dic))] |
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 27 28 29 30 31 32 33 34 35 36 |
import tkinter as tk import tkinter.scrolledtext as tkst import chatbotC as chat def prompt(unmo): unname = proto.name respname = proto.resp_name() return f'{unname}:{respname} >' def press_ent(event): in_txt = ent.get() txt.insert(tk.END, '> ' + in_txt + '\n') respose = proto.dialog(in_txt) txt.insert(tk.END, prompt(proto) + respose + '\n') txt.see('end') ent.delete(0, tk.END) def show_txt(tt): txt.insert(tk.END, tt + '\n') def click_close(): proto.save() root.destroy() root = tk.Tk() root.title('和文ボット') root.config(width=500, height=400) txt = tkst.ScrolledText(relief='sunken', bg='lightgreen', font=('', 18), bd=5) txt.place(x=10, y=10, width=480, height=300) ent = tk.Entry(relief='sunken', font=('', 18), bd=5) ent.place(x=10, y=340, width=460) ent.bind('<Return>', press_ent) ent.focus_set() proto = chat.ChatBot('Unmo') show_txt('Unmo System') root.protocol('WM_DELETE_WINDOW', click_close) root.mainloop() |
いままでソースファイルをNASに置いていたけど、デバッグの時に変なファイルができるみたいなので、Cドライブに置いてみた。 理由はよくわからないけど、デバッグでの変な動作はなくなった。 CドライブはSSDのせいか実行速度が圧倒的に速くなってストレスを感じなくなった。 めでたし、めでたし。