def yes_or_no_some(results, list_num, count_row_start): rfs('>欲しい情報はありましたか?(yes/no)') u_ans = input('Input: ') rfu(u_ans) if u_ans == 'yes': #ユーザーが欲しかった情報の回答番号を確保 rfs('>良かったです!何番の回答でしたか?') ans_num = input('Input: ') #間違った数字が入力されたときのエラー対処 if list_num < int(ans_num): ans_num = ans_main_t3.what_num(list_num) #任意の番号の回答を確保する result_more = results[int(ans_num)]['data'] ans_main_t3.more_question(result_more) elif u_ans == 'no': rfs('>スタッフへ引き継ぐために履歴を表示します。') record.record_A('----- conversation end -----') #履歴の表示 df = pandas.read_csv('conversation_log.csv', header=None) print_record = df[count_row_start:] print(print_record) sys.exit() else: ans_main_t3.yes_or_no_some(results, list_num, count_row_start) '''
def more_question(result_more): #応答について深追いの質問があるか否か(さらに、場所や時間を訪ねる時) #画像が用意されている場合は表示する if result_more['image'] != None: rfs('詳細を表示します') im = Image.open(result_more['image']) im.show() rfs('>これについて、何か質問はありますか?(yes/no)') u_ans2 = input('Input: ') rfu(u_ans2) if u_ans2 == 'no': rfs('>また、質問してくださいね!Have a nice day!') record.record_A('----- conversation end -----') sys.exit() elif u_ans2 == 'yes': rfs('>質問は何でしょうか?') # 入力 st = input('Input: ') rfu(st) category_ans = get_nlc.nlc_0(st) more_category = 'カテゴリー: ' print(more_category + category_ans) if category_ans == 'what': rfs('>title:' + result_more['title']) elif category_ans == 'who': rfs(">" + result_more['who'] + 'さんです。') elif category_ans == 'where': rfs(">" + result_more['where'] + 'です。') elif category_ans == 'how_time': rfs(">" + result_more['how_time'] + 'です。') elif category_ans == 'when': rfs(">" + result_more['when_day'] + '日の' + result_more['when_time'] + 'です。') rfs('>もう一度初めから開始しますか?(yes/no)') # 入力 u_ans = input('Input: ') rfu(u_ans) if u_ans == 'yes': main_t3.start() else: rfs('>また、質問してくださいね!Have a nice day!') record.record_A('----- conversation end -----') sys.exit() #yesとno以外が入力されたときのエラー処理 else: rfs('>yesかnoを入力してください') ans_main_t3.more_question(result_more)
def yes_or_no_one(result, count_row_start): if result['image'] != None: rfs('>詳細を表示します') im = Image.open(result['image']) im.show() rfs('>欲しい情報でしたか?(yes/no)') u_ans = input('Input: ') rfu(u_ans) if u_ans == 'yes': result_more = result ans_main_t3.more_question(result_more) elif u_ans == 'no': rfs('>スタッフへ引き継ぐために履歴を表示します。') record.record_A('----- conversation end -----') #履歴の表示 df = pandas.read_csv('conversation_log.csv', header=None) print_record = df[count_row_start:] print(print_record) sys.exit()
def make_q(key): #K3から受け取った最重要キーワード if key == 'what': rfs('>Key is "what"') rfs('>イベント名はわかりますか?(わからない場合は"わからない"を入力)') # 入力 st = input('Input: ') rfu(st) null_word = re.search('わからない|わかりません', st) if null_word: add_q_ans = 'null' return [add_q_ans] else: mecab_noun = python_mecab.mecab_general_noun_get(st) return mecab_noun elif key == 'when_day': rfs('>Key is "when_day"') rfs('>イベントは何日に行われるかわかりますか?(わからない場合は"わからない"を入力)') # 入力 st = input('Input: ') rfu(st) null_word = re.search('わからない|わかりません', st) if null_word: add_q_ans = 'null' return [add_q_ans] #時間を表現する数字の取得(import reを使用) else: #日付の指定 today = 25 return [get_day_time.get_day(st, today)] elif key == 'when_time': rfs('>Key is "when_time"') rfs('>イベントは何時から始まるかわかりますか?(わからない場合は"わからない"を入力)') # 入力 st = input('Input: ') rfu(st) null_word = re.search('わからない|わかりません', st) if null_word: add_q_ans = 'null' return [add_q_ans] #時間を表現する数字の取得(import reを使用) else: return [get_day_time.get_time(st)] elif key == 'who': rfs('>Key is "who"') rfs('>どなたがご出演かわかりますか?(わからない場合は"わからない"を入力)') # 入力 st = input('Input: ') rfu(st) null_word = re.search('わからない|わかりません', st) if null_word: add_q_ans = 'null' return [add_q_ans] #人名の取得 else: mecab_name = python_mecab.mecab_name_get(st) return mecab_name elif key == 'where': rfs('>key is "where"') rfs('>どこで行われるかわかりますか?(わからない場合は"わからない"を入力)') # 入力 st = input('Input: ') rfu(st) null_word = re.search('わからない|わかりません', st) if null_word: add_q_ans = 'null' return [add_q_ans] else: mecab_where = python_mecab.mecab_general_noun_get(st) return mecab_where # elif key == 'how_time': # rfs('>key is "how_time"') # rfs('>そのイベントは何時間開催される予定かわかりますか?(わからない場合は"わからない"を入力)') # # 入力 # st = input('Input: ') # rfu(st) # # null_word = re.search('わからない|わかりません',st) # if null_word : # add_q_ans = 'null' # return [add_q_ans] # else: # #how_timeを取り出す正規表現が入る予定でした... # return elif key == None: rfs('>検索結果が絞り込めませんでした。スタッフへ引き継ぎます') rfs('>履歴を表示して、システムを終了します') record.record_A('----- conversation end -----') #履歴の表示 df = pandas.read_csv('conversation_log.csv') print_record = df[count_row_start:] print(print_record) sys.exit()
def anser(data, category_ans, add_q_count, results, count_row_start): #信頼度1以上の回答候補をカウントする ans_count = ans_main_t3.count_list(results) #k3システムから返されたリストの数を数える res_count = len(results) #追加質問を2度行った時 if int(add_q_count) >= 2: #条件の全検索で見つかった場合 if res_count > 0 and results[0]['all_and'] == 1: ans_count_condition = ans_main_t3.count_list_condition(results) #条件全検索リストが1つの時 if ans_count_condition == 1: rfs('>条件の全検索で当てはまるものが一件見つかりました。') ans_main_t3.one_ans(category_ans, results) ans_main_t3.yes_or_no_one(results[0]['data'], count_row_start) #条件全検索リストが2つ~8つの時 elif ans_count_condition <= 8: rfs('>条件の全検索で当てはまるものが複数見つかりました。') ans_main_t3.some_ans_all(category_ans, results, count_row_start) ans_main_t3.yes_or_no_some(results, ans_conut_condition, count_row_start) #条件全検索リストが5つ以上の時 elif ans_count_condition > 8: rfs('>追加質問の内容を加味して再検索しましたが、候補となる結果が絞りきれませんでした。') rfs('>スタッフにひきつぐために履歴表示をします。') #終了 record.record_A('----- conversation end -----') #履歴の表示 df = pandas.read_csv('conversation_log.csv', header=None) print_record = df[count_row_start:] print(print_record) sys.exit() #条件の部分検索で見つかった場合 elif res_count == 0 or results[0]['all_and'] == 0: if int(ans_count) == 0: rfs('>追加質問の内容を加味して再検索しましたが、結果が見つかりませんでした。') rfs('>スタッフに引き継ぐために履歴表示をします。') #終了 record.record_A('----- conversation end -----') df = pandas.read_csv('conversation_log.csv', header=None) print_record = df[count_row_start:] print(print_record) sys.exit() elif int(ans_count) == 1: rfs('>条件の部分検索で当てはまりました。') rfs('>代わりに似たものを表示させます。') ans_main_t3.one_ans(category_ans, results, count_row_start) ans_main_t3.yes_or_no_one(results[0]['data'], count_row_start) #候補の数が8個以内の時 elif int(ans_count) <= 8: rfs('>条件の部分検索では当てはまりました。') rfs('>代わりに似たものを表示させます。') ans_main_t3.some_ans(category_ans, results, ans_count, count_row_start) ans_main_t3.yes_or_no_some(results, ans_count, count_row_start) #候補の数が8個以上の時 elif int(ans_count) > 8: rfs('>追加質問の内容を加味して再検索しましたが、候補となる結果が絞りきれませんでした。') rfs('>スタッフにひきつぐために履歴表示をします。') #終了 record.record_A('----- conversation end -----') #履歴の表示 df = pandas.read_csv('conversation_log.csv', header=None) print_record = df[count_row_start:] print(print_record) sys.exit() #追加質問をまだ行っていない時 else: #条件の全検索(AND)で見つかった時の返答 if res_count > 0 and results[0]['all_and'] == 1: ans_count_condition = ans_main_t3.count_list_condition(results) #条件全検索リストが1つの時 if ans_count_condition == 1: rfs('>条件の全検索で当てはまるものが一件見つかりました。') ans_main_t3.one_ans(category_ans, results, count_row_start) ans_main_t3.yes_or_no_one(results[0]['data'], count_row_start) #条件全検索リストが2つ~8つの時 elif ans_count_condition <= 8: rfs('>条件の全検索で当てはまるものが複数見つかりました。') ans_main_t3.some_ans_all(category_ans, results, count_row_start) ans_main_t3.yes_or_no_some(results, ans_count_condition, count_row_start) #条件全検索リストが8つ以上の時 elif ans_count_condition > 8: #追加質問を行う。 rfs('>大量の回答候補が見つかりました。') #追加質問をした回数をカウントする変数へ+1 add_q_count += 1 #k3システムから"最重要キーワード"を取得してくる key = k3.get_wanting_category() #whereの場合のみ、whatのリストに追加して情報検索部に投げる if key == 'where': data['what'].extend(add_q_main.make_q(key)) else: data[key].extend(add_q_main.make_q(key)) rfs('----- もう一度検索します。 -----') results = ans_main_t3.look_k3(data) ans_main_t3.anser(data, category_ans, add_q_count, results, count_row_start) #条件の部分検索(OR)で見つかった時の返答 elif res_count == 0 or results[0]['all_and'] == 0: #信頼度の閾値を超えたリスト数が0個の場合 if ans_count == 0: #データベースから返答されたリストが一つだった場合、信頼度に関わらず返答する if len(results) == 1: ans_main_t3.one_ans(category_ans, results, count_row_start) ans_main_t3.yes_or_no_one(results[0]['data'], count_row_start) else: rfs('>結果が見つかりませんでした。') rfs('>追加質問を生成します。') #追加質問をした回数をカウントする変数へ+1 add_q_count += 1 #k3システムから"最重要キーワード"を取得してくる key = k3.get_wanting_category() #whereの場合のみ、whatのリストに追加して情報検索部に投げる if key == 'where': data['what'].extend(add_q_main.make_q(key)) if key == None: rfs('>検索結果が絞り込めませんでした。スタッフへ引き継ぎます') rfs('>履歴を表示して、システムを終了します') record.record_A('----- conversation end -----') #履歴の表示 df = pandas.read_csv('conversation_log.csv', header=None) print_record = df[count_row_start:] print(print_record) sys.exit() else: data[key].extend(add_q_main.make_q(key)) rfs('----- もう一度検索します。 -----') results = ans_main_t3.look_k3(data) ans_main_t3.anser(data, category_ans, add_q_count, results, count_row_start) elif ans_count == 1: rfs('>条件の全検索では当てはまりませんでした。') rfs('>代わりに似たものを表示させます。') ans_main_t3.one_ans(category_ans, results, count_row_start) ans_main_t3.yes_or_no_one(results[0]['data'], count_row_start) #回答候補が8個以下の時 elif ans_count <= 8: rfs('>条件の全検索では当てはまりませんでした。') rfs('>代わりに似たものを表示させます。') ans_main_t3.some_ans(category_ans, results, ans_count, count_row_start) ans_main_t3.yes_or_no_some(results, ans_count, count_row_start) #回答候補が8個以上の時 elif ans_count > 8: #追加質問を行う。 rfs('>大量の回答候補が見つかりました。') #追加質問をした回数をカウントする変数へ+1 add_q_count += 1 #k3システムから"最重要キーワード"を取得してくる key = k3.get_wanting_category() #whereの場合のみ、whatのリストに追加して情報検索部に投げる if key == 'where': data['what'].extend(add_q_main.make_q(key)) else: data[key].extend(add_q_main.make_q(key)) rfs('----- もう一度検索します。 -----') results = ans_main_t3.look_k3(data) ans_main_t3.anser(data, category_ans, add_q_count, results, count_row_start)
def one_ans(category_ans, result, count_row_start): reliability = result[0]['reliability'] if reliability < 1: rfs('>条件に合致するデータは見つかりませんでしたが、似たデータが一つ見つかりました。') else: rfs('>回答候補が一つ見つかりました。') #リストの配列から辞書を取り出す result = result[0]['data'] if category_ans == 'what': print('----------') print('category is what') ans_what = result['what'] ans_title = result['title'] ans_when_time = result['when_time'] rfs(">" + ans_what + "'" + ans_title + "'" + 'があります。' + '(' + ans_when_time + ')') print('----------') elif category_ans == 'when': print('----------') print('category is when') ans_title = result['title'] ans_when_day = result['when_day'] ans_when_time = result['when_time'] rfs('>title:' + str(ans_title)) rfs(">" + ans_when_day + '日の' + ans_when_time + '開始です。') print('----------') elif category_ans == 'who': print('----------') print('category is who') ans_title = result['title'] ans_who = result['who'] rfs('>title:' + str(ans_title)) rfs(">" + ans_who + 'です。') print('----------') elif category_ans == 'where': print('----------') print('category is where') ans_title = result['title'] ans_where = result['where'] rfs('>title:' + str(ans_title)) rfs('>場所は' + ans_where + 'です。') print('----------') elif category_ans == 'how_time': print('----------') print('category is how_time') ans_how = result['how_time'] ans_title = result['title'] rfs('>title:' + str(ans_title)) rfs(">" + ans_how + 'です。') print('----------') else: print('>category is why or how') rfs('>スタッフの方に引き継ぎます。') #終了 record.record_A('----- conversation end -----') #履歴の表示 df = pandas.read_csv('conversation_log.csv', header=None) print_record = df[count_row_start:] print(print_record) sys.exit() if reliability < 1: if result['parent_id'] != None: parent = k3.get_parent(result['parent_id']) if parent['image']: rfs('>参考に親データ画像を表示します') #画像の読み込み im = Image.open(parent['image']) im.show()
def some_ans_all(category_ans, results, count_row_start): rfs('>いくつかの回答候補が見つかりました。') #解答をカウント数で管理 count = 0 for result in results: if result['all_and'] == 1: print('----------') if category_ans == 'what': #print('category is what') result = result['data'] ans_what = result['what'] ans_title = result['title'] ans_when_time = result['when_time'] ans_where = result['where'] print('[' + str(count) + ']') rfs(ans_what + "'" + ans_title + "'" + 'があります。' + '(' + ans_when_time + ')') rfs('開催場所:' + ans_where) elif category_ans == 'when': #print('category is when') result = result['data'] ans_title = result['title'] ans_when_day = result['when_day'] ans_when_time = result['when_time'] ans_where = result['where'] print('[' + str(count) + ']') rfs('title:' + str(ans_title)) rfs(str(ans_when_day) + '日の' + str(ans_when_time) + '開始です。') rfs('開催場所:' + ans_where) elif category_ans == 'who': #print('category is who') result = result['data'] ans_title = result['title'] ans_name = result['who'] ans_when_time = result['when_time'] print('[' + str(count) + ']') rfs('title:' + str(ans_title)) rfs(ans_name + 'さん。') elif category_ans == 'where': #print('category is where') result = result['data'] ans_title = result['title'] ans_where = result['where'] ans_when_time = result['when_time'] print('[' + str(count) + ']') rfs('title:' + str(ans_title)) rfs(ans_where + 'で行われます。') elif category_ans == 'how_time': #print('category is how_time') result = result['data'] ans_title = result['title'] ans_how_time = result['how_time'] print('[' + str(count) + ']') rfs(ans_title + ':' + ans_how_time + '時間') else: print('category is why or how') rfs('スタッフへ引き継ぎます。') #終了 record.record_A('----- conversation end -----', header=None) #履歴の表示 df = pandas.read_csv('conversation_log.csv') print_record = df[count_row_start:] print(print_record) sys.exit() #解答番号をカウントアップ count += 1 print('----------')
def start(): #日付の指定 today = 25 record.record_A('----- conversation start -----') #前回までの行数を把握しておく r_read = record.record_read() count_row_start = -1 for row in r_read: count_row_start += 1 print('>質問は何でしょうか?') # 入力 st = input('Input: ') #履歴(ユーザー)の作成 #引数'u'はユーザー入力を示す record.rfu(st) #データを格納する辞書の作成 data = { 'category': 'null', 'what': [], 'where': [], 'who': [], 'when_time': [], 'when_day': [], 'how_time': [] } # get_nlcからカテゴリータグの取得 category_ans = get_nlc.nlc_0(st) category = 'カテゴリー: ' print(category + category_ans) data['category'] = category_ans if data['category'] == 'why' or data['category'] == 'how': print('>category is why or how') record.rfs('>スタッフの方に引き継ぎます。') #終了 record.record_A('----- conversation end -----') #履歴の表示 df = pandas.read_csv('conversation_log.csv') print_record = df[count_row_start:] print(print_record) sys.exit() #一般(固有)名詞の取得 #python_mecab.pyのmecab関数を利用 mecab_noun = python_mecab.mecab_general_noun_get(st) data['what'] = mecab_noun ''' #whatと統合してk3に投げる #場所名詞の取得 if category_ans != 'where': mecab_where = python_mecab.mecab_where_get(st) data['where']=mecab_where ''' #人名の取得 mecab_name = python_mecab.mecab_name_get(st) data['who'] = mecab_name #ユーザー発話から時間の獲得 data['when_time'] = [get_day_time.get_time(st)] #ユーザー発話から日付情報を獲得してくる data['when_day'] = [get_day_time.get_day(st, today)] print(data) #情報検索部でDBの検索 results = ans_main_t3.look_k3(data) #システム応答の生成 ans_main_t3.anser(data, category_ans, 0, results, count_row_start)