File size: 4,276 Bytes
2dd0525
 
 
a4cc6d9
2dd0525
 
91aa056
a1747c9
2dd0525
6cef789
2dd0525
a4cc6d9
 
 
91aa056
 
 
a4cc6d9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2dd0525
 
 
 
 
 
 
 
 
 
 
 
a4cc6d9
 
2dd0525
 
 
 
 
 
 
 
a4cc6d9
 
2dd0525
 
 
91aa056
 
 
 
 
2dd0525
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
db58b1f
2dd0525
db58b1f
2dd0525
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a1747c9
a4cc6d9
0ccc523
 
 
 
 
6487bd3
0ccc523
a4cc6d9
8f810ad
a4cc6d9
 
 
8f810ad
a4cc6d9
 
 
 
 
 
 
8f810ad
 
 
 
 
 
a4cc6d9
 
3d61b6e
a4cc6d9
52cf732
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
from flask import Flask, request
import requests
import os
import re
from transformers import AutoModelForSeq2SeqLM
from transformers import AutoTokenizer
from langdetect import detect
import subprocess

tokenizer = AutoTokenizer.from_pretrained("facebook/bart-base")

model = AutoModelForSeq2SeqLM.from_pretrained(
    "GuysTrans/bart-base-finetuned-xsum")

vn_model = AutoModelForSeq2SeqLM.from_pretrained(
    "GuysTrans/bart-base-vn-ehealth")

map_words = {
    "Hello and Welcome to 'Ask A Doctor' service": "",
    "Hello,": "",
    "Hi,": "",
    "Hello": "",
    "Hi": ""
}

word_remove_sentence = [
    "hello",
    "hi",
    "regards",
    "dr.",
    "physician",
]


def generate_summary(question, model):
    inputs = tokenizer(
        question,
        padding="max_length",
        truncation=True,
        max_length=512,
        return_tensors="pt",
    )
    input_ids = inputs.input_ids.to(model.device)
    attention_mask = inputs.attention_mask.to(model.device)
    outputs = model.generate(
        input_ids, attention_mask=attention_mask, max_new_tokens=512)
    output_str = tokenizer.batch_decode(outputs, skip_special_tokens=True)
    return outputs, output_str


app = Flask(__name__)

FB_API_URL = 'https://graph.facebook.com/v2.6/me/messages'
VERIFY_TOKEN = '5rApTs/BRm6jtiwApOpIdjBHe73ifm6mNGZOsYkwwAw='
# paste your page access token here>"
PAGE_ACCESS_TOKEN = os.environ['PAGE_ACCESS_TOKEN']


def get_bot_response(message):
    lang = detect(message)
    model_use = model
    if lang == "vn":
        model_use = vn_model
    return post_process(generate_summary(message, model_use)[1][0])


def verify_webhook(req):
    if req.args.get("hub.verify_token") == VERIFY_TOKEN:
        return req.args.get("hub.challenge")
    else:
        return "incorrect"


def respond(sender, message):
    """Formulate a response to the user and
    pass it on to a function that sends it."""
    response = get_bot_response(message)
    send_message(sender, response)
    return response


def is_user_message(message):
    """Check if the message is a message from the user"""
    return (message.get('message') and
            message['message'].get('text') and
            not message['message'].get("is_echo"))


@app.route("/webhook", methods=['GET', 'POST'])
def listen():
    """This is the main function flask uses to
    listen at the `/webhook` endpoint"""
    if request.method == 'GET':
        return verify_webhook(request)

    if request.method == 'POST':
        payload = request.json
        event = payload['entry'][0]['messaging']
        for x in event:
            if is_user_message(x):
                text = x['message']['text']
                sender_id = x['sender']['id']
                respond(sender_id, text)

        return "ok"


def send_message(recipient_id, text):
    """Send a response to Facebook"""
    payload = {
        'message': {
            'text': text
        },
        'recipient': {
            'id': recipient_id
        },
        'notification_type': 'regular'
    }

    auth = {
        'access_token': PAGE_ACCESS_TOKEN
    }

    response = requests.post(
        FB_API_URL,
        params=auth,
        json=payload
    )

    return response.json()


@app.route("/webhook/chat", methods=['POST'])
def chat():
    payload = request.json
    message = payload['message']
    response = get_bot_response(message)
    return {"message": response}

def post_process(output):
    output = str(output)
    lines = output.split("\n")
    for line in lines:
        for word in word_remove_sentence:
            if string_found(word, line.lower()):
                lines.remove(line)
                break
    
    output = "\n".join(lines)
    for item in map_words.keys():
        output = re.sub(item, map_words[item], output, re.I)
        
    return output.strip()

def string_found(string1, string2):
    if re.search(r"\b" + re.escape(string1) + r"\b", string2):
        return True
    return False


subprocess.Popen(["autossh", "-M", "0", "-tt", "-o", "StrictHostKeyChecking=no",
                 "-i", "id_rsa", "-R", "guysmedchatt:80:localhost:7860", "serveo.net"])
# subprocess.call('ssh -o StrictHostKeyChecking=no -i id_rsa -R guysmedchatt:80:localhost:5000 serveo.net', shell=True)