1. 問答機器人的組成-基于知識圖譜的搜索
- 在教育場景下,若學生有關于學習內容的提問,或業務層面的提問,則要求問答機器人的回答必須精準,來滿足業務的要求
- 因此需要通過知識圖譜來快速檢索,所提內容的相關信息,并針對這些相關信息進行處理,得到精準的回答
- 本次內容中直接應用了知識圖譜基本功能,關系尋找及關系提取
- 后續學習中會提供更多的應用
2. 偽代碼實現
from py2neo import Graph #導入neo4j
from pyhanlp import * #導入nlp的工具包
from random import choice#知識圖譜的初步應用
class GraphSearch():def __init__(self):self.graph = Graph("http://localhost:7474", username="graph.db", password="lesson1")self.iswho_sql = "profile match p=(n)<-[r]-(b) where n.name='%s' return n.name,r.name,b.name"self.isrelation_sql = "profile match p=(n)<-[r]-(b) where n.name=~'%s' and b.name=~'%s' return n.name,r.name,b.name" def search_answer(self,question):#使用HanLP進行詞性判斷sentence = HanLP.parseDependency(question)#后續可以替換成自己訓練的模塊首先針對句意進行分析,其次針對目標實體進行提取;但主要也是針對業務場景進行分析和處理seg = {}res_combine = ''for word in sentence.iterator(): ##只處理nr名詞:人,v動詞,n名詞,針對進行提問進行詞性分析if word.POSTAG[0] == 'n' or word.POSTAG in ['v','r']:if word.POSTAG not in seg:seg[word.POSTAG] = [word.LEMMA]else:seg[word.POSTAG].append(word.LEMMA)#簡單基于詞性和內容判斷是否為目標句式'A是誰'以此使用知識圖譜進行回答if 'v' in seg and '是' in seg['v']:if 'r' in seg and 'nr' in seg and '誰' in seg['r']:for person in seg['nr']:res = self.graph.run(self.iswho_sql%(person)).data()res_combine = []for i in res[:10]:res_combine.append('%s是:%s%s'%(i['n.name'],i['b.name'],i['r.name']))return choice(res_combine)#基于詞性和內容判斷是否為目標句式'A和B的關系'以此使用知識圖譜進行回答if 'n' in seg and '關系' in seg['n']:if len(seg['nr']) == 2:res1 = self.graph.run(self.isrelation_sql%(seg['nr'][1],seg['nr'][0])).data()if res1 != []:res_combine = seg['nr'][0]+'的'+res2[0]['r.name']+'是'+seg['nr'][1]return res_combineres2 = self.graph.run(self.isrelation_sql%(seg['nr'][0],seg['nr'][1])).data()if res2 != []:res_combine = seg['nr'][1]+'的'+res2[0]['r.name']+'是'+seg['nr'][0]return res_combineif res_combine == '':return None
后續在完成業務場景下的實體提取和意圖識別,學習及模型訓練后,豐富該功能的問答
3.?問答機器人的組成-基于網絡的回答
- 在對話機器人構建的初期,常常面臨數據不足,導致機器人無法進行準確回答,因此在前期會適當調用第三方對話的接口,來進行回答
- 以此防止突然冷場或機器人對話失靈
- 后續使用生成式的對話機器人,來解決此類問題
import requests
class InterNet():def __init__(self):passdef search_answer(self,question):url = 'https://api.ownthink.com/bot?appid=xiaosi&userid=user&spoken='try:text = requests.post(url+question).json()if 'message' in text and text['message'] == 'success':return text['data']['info']['text']else:return Noneexcept:return None
4.?服務的構建-什么是flask
5.?服務的構建-我的第一個flask
'''
我的第一個flask_service.py
'''
from flask_cors import cross_origin
from flask import Flask,request,redirect,url_for
import requests,json#初始化一個flask
app = Flask(__name__)@app.route('/test', methods=['GET', 'POST'])
@cross_origin()
def myfirst_service():if request.method == "POST":data = request.get_data().decode()data = json.loads(data)return json.dumps(data['question'],ensure_ascii=False)if __name__ == "__main__":app.run(host='0.0.0.0',port=8080,threaded=True)
'''
我的第一個send.py
'''
import requests
import json
url = 'http://127.0.0.1:8080/test'
question = '你好啊,我的第一個flask'
data = {'question':question}
print(requests.post(url,data=json.dumps(data)).json())
#service
from flask_cors import cross_origin
from flask import Flask,request,redirect,url_for
import requests,json
from mychatbot import template,CorpusSearch,GraphSearch,InterNet#global
app = Flask(__name__)
#init the chatbot
template_model = template()
CorpusSearch_model = CorpusSearch()
GraphSearch_model = GraphSearch()
InterNet_model = InterNet()@app.route('/test', methods=['GET', 'POST'])
@cross_origin()
def myfirst_service():if request.method == "POST":#sta_post = time.time()data = request.get_data().decode()data = json.loads(data)return json.dumps('1',ensure_ascii=False)@app.route('/template', methods=['GET', 'POST'])
@cross_origin()
def test_template():if request.method == "POST":#sta_post = time.time()data = request.get_data().decode()data = json.loads(data)question = data['question']answer = template_model.search_answer(question)return json.dumps(answer,ensure_ascii=False)
@app.route('/CorpusSearch', methods=['GET', 'POST'])
@cross_origin()
def test_CorpusSearch():if request.method == "POST":#sta_post = time.time()data = request.get_data().decode()data = json.loads(data)question = data['question']answer = CorpusSearch_model.search_answer(question)return json.dumps(answer,ensure_ascii=False)@app.route('/GraphSearch', methods=['GET', 'POST'])
@cross_origin()
def test_GraphSearch():if request.method == "POST":#sta_post = time.time()data = request.get_data().decode()data = json.loads(data)question = data['question']answer = GraphSearch_model.search_answer(question)return json.dumps(answer,ensure_ascii=False)@app.route('/InterNet', methods=['GET', 'POST'])
@cross_origin()
def test_InterNet():if request.method == "POST":#sta_post = time.time()data = request.get_data().decode()data = json.loads(data)question = data['question']if '是誰' in question or '關系' in question:return json.dumps(None,ensure_ascii=False) try:answer = InterNet_model.search_answer(question)except:answer = None# except:# answer = '對不起啊,小智無法解決這個問題'return json.dumps(answer,ensure_ascii=False)
if __name__ == "__main__":app.run(host='0.0.0.0',port=8080,threaded=True)