-
Notifications
You must be signed in to change notification settings - Fork 0
/
bot.py
108 lines (87 loc) · 3.2 KB
/
bot.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
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
import threading
import json
from config.DatabaseConfig import *
from utils.Database import Database
from utils.BotServer import BotServer
from utils.Preprocess import Preprocess
from result.model.IntentModel import IntentModel
from models.ner.NerModel import NerModel
from utils.FindAnswer import FindAnswer
# 전처리 객체 생성
p = Preprocess(word2index_dic='train_tools/dict/chatbot_dict.bin',
userdic='utils/user_dic.tsv')
# 의도 파악 모델
intent = IntentModel(model_name='models/intent/intent_model_n3.h5', preprocess=p)
# 개체명 인식 모델
ner = NerModel(model_name='models/ner/ner_model_v1.h5', preprocess=p)
def to_client(conn, addr, params):
db = params['db']
try:
db.connect() # DB 연결
# 데이터 수신
read = conn.recv(2048) # 수신 데이터가 있을 때까지 블로킹
print("===========================")
print("Connection from: %s" % str(addr))
if read is None or not read:
# 클라이언트 연결이 끊어지거나 오류가 있는 경우
print("클라이언트 연결 끊어짐")
exit(0) # 스레드 강제 종료
# json 데이터로 변환
recv_json_data = json.loads(read.decode())
print("데이터 수신 : ", recv_json_data)
query = recv_json_data['Query']
# 의도 파악
intent_predict = intent.predict_class(query)
intent_name = intent.labels[intent_predict]
print(intent_name)
# 개체명 파악
ner_predicts = ner.predict(query)
ner_tags = ner.predict_tags(query)
print(ner_predicts)
print(ner_tags)
# 답변 검색
try:
f = FindAnswer(db)
answer_text, answer_image = f.search(intent_name, ner_tags)
answer = f.tag_to_word(ner_predicts, answer_text)
except:
answer = "죄송해요 무슨 말인지 모르겠어요. 조금 더 공부할게요."
answer_image = None
send_json_data_str = {
"Query": query,
"Answer": answer,
"AnswerImageUrl": answer_image,
"Intent": intent_name,
"NER": str(ner_predicts)
}
message = json.dumps(send_json_data_str) # json 객체를 전송 가능한 문자열로 변환
conn.send(message.encode()) # 응답 전송
except Exception as ex:
print(ex)
finally:
if db is not None: # db 연결 끊기
db.close()
conn.close()
if __name__ == '__main__':
# 질문/답변 학습 db 연결 객체 생성
db = Database(
host=DB_HOST, user=DB_USER, password=DB_PASSWORD, db_name=DB_NAME
)
print("DB 접속")
# 봇 서버 동작
port = 5050
listen = 100
bot = BotServer(port, listen)
bot.create_sock()
print("bot start")
while True:
conn, addr = bot.ready_for_client()
params = {
"db": db
}
client = threading.Thread(target=to_client, args=(
conn, # 클라이언트 연결 소켓
addr, # 클라이언트 연결 주소 정보
params # 스레드 함수 파라미터
))
client.start() # 스레드 시작