dream
120 строк · 4.2 Кб
1#!/usr/bin/env python
2
3import logging4import time5import re6import random7import json8import collections9
10from flask import Flask, request, jsonify11from os import getenv12import sentry_sdk13
14
15sentry_sdk.init(getenv("SENTRY_DSN"))16
17logging.basicConfig(format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", level=logging.INFO)18logger = logging.getLogger(__name__)19
20app = Flask(__name__)21
22fun_facts = json.load(open("./content/fun_facts.json"))23forty_niner_fun_facts = json.load(open("./content/49_fun_facts.json"))24chiefs_fun_facts = json.load(open("./content/chiefs_fun_facts.json"))25
26
27@app.route("/respond", methods=["POST"])28def respond():29st_time = time.time()30last_utter_batch = request.json["sentences"]31responses = []32
33for last_utter in last_utter_batch:34response_text, confidence = dialog_segment_handler(last_utter)35logger.info(f"Last_utter: {last_utter}")36logger.info(f"Response_text: {response_text}")37
38responses.append((response_text, confidence))39
40total_time = time.time() - st_time41logger.info(f"super bowl skill exec time: {total_time:.3f}s")42return jsonify(responses)43
44
45ANY_PATTERN = r"(['a-zA-z ]+)?"46
47
48def add_ANY_PATTERN(ordered_key_regs):49regs = ANY_PATTERN.join(ordered_key_regs)50return regs51
52
53def merge_regs(regs):54return "|".join([f"({reg})" for reg in regs])55
56
57def compile_regs(dictionary):58for key in dictionary.keys():59dictionary[key] = re.compile(dictionary[key])60return dictionary61
62
63dialog_segment_regs = collections.OrderedDict()64# ordered by priority
65# dialog_segment_regs["who_wins"] = add_ANY_PATTERN([r"(who|which)", r"(win|make|won)", "super", r"bowls?(\s|$)"])
66# dialog_segment_regs["who_goes"] = add_ANY_PATTERN(
67# [r"(who)", r"(going|gonna|play|will be in)", r"^(win|make)", "super", r"bowls?(\s|$)"]
68# )
69# dialog_segment_regs["what_time"] = add_ANY_PATTERN([r"(what)", r"(time)", "super", r"bowls?(\s|$)"])
70dialog_segment_regs["fun_facts"] = add_ANY_PATTERN([r"(fact|anything|something)", r"about", "super", r"bowls?(\s|$)"])71dialog_segment_regs["talk_about"] = add_ANY_PATTERN([r"(talk|chat|say|speak|tell)", r"about", "super", r"bowls?(\s|$)"])72dialog_segment_regs["forty_niner"] = merge_regs(73[74add_ANY_PATTERN([r"forty niner", "super", r"bowls?(\s|$)"]),75add_ANY_PATTERN([r"super", r"bowls?\s", "forty niner"]),76]77)
78dialog_segment_regs["chiefs"] = merge_regs(79[add_ANY_PATTERN([r"chief", "super", r"bowls?(\s|$)"]), add_ANY_PATTERN([r"super", r"bowls?\s", "chief"])]80)
81dialog_segment_regs["what_about"] = add_ANY_PATTERN([r"what about (the )?super bowls?(\s|$)"])82dialog_segment_regs["super_bowl"] = add_ANY_PATTERN([r"(the )?super bowls?(\s|$)"])83
84faq_candidetes = {85# "who_wins": ["The wait for the Kansas City Chiefs -- and for their head coach -- is finally over."86# "A half century after winning their first Super Bowl, the Chiefs are champions once more,"87# "winning Super Bowl LIV in epic fashion at Hard Rock Stadium."],88# "who_goes": ["The Kansas City Chiefs and San Francisco 49ers are set to face off in Super Bowl 2020."],89# "what_time": [90# "The Super Bowl in 2020, the game that will crown an NFL champion for the 2019 season, is scheduled"91# " to take place Sunday, February 2 at Hard Rock Stadium in Miami Gardens, Florida."92# " The 49ers will play the Chiefs."93# ],94"fun_facts": fun_facts,95"talk_about": fun_facts,96"forty_niner": forty_niner_fun_facts,97"chiefs": chiefs_fun_facts,98"what_about": fun_facts,99"super_bowl": fun_facts,100}
101dialog_segment_regs = compile_regs(dialog_segment_regs)102
103
104def dialog_segment_handler(last_utter):105response = ""106confidence = 0.0107curr_user_uttr = last_utter.lower()108
109active_segments = [110segment_name for segment_name, segment_reg in dialog_segment_regs.items() if segment_reg.search(curr_user_uttr)111]112logger.info(f"active_segments: {active_segments}")113if active_segments:114response = random.choice(faq_candidetes[active_segments[0]])115confidence = 1.0 if len(active_segments) > 1 else 0.8116return response, confidence117
118
119if __name__ == "__main__":120app.run(debug=False, host="0.0.0.0", port=3000)121