bert构建生成句向量,再计算相似度,匹配问答库中的标准问题。为什么使用bert倒数第二层输出构建句向量。
小姜机器人、python、tensorflow、chatbot、dialog、bert中文短文本、fuzzywuzzy、检索式、生成式、聊天、闲聊、对话、问答、多轮、单轮、开放、封闭、任务、垂直等等描述,都属于自动问答领域。而且已经有了比较大的应用,常见的智能手机助手、聊天机器人、智能客服......
github项目地址在:
方案:
方案,这种方法和 闲聊机器人实例三:python实现小姜机器人(检索式chatbot_sentence_vec_by_word_词向量句向量)的没什么不同,只是构建句向量使用了bert罢了。
常见问题:
1. 为什么使用bert倒数第二层输出构建句向量:
这个要根据不同的情况判别,不同的bert层获取不一样的信息,你可以看看bert-as-service项目的FAQ说明,
大致意思是最后一层输出和输入的目标一致,也就是char层级的,我们不取得,获取2到11,或者2到23层的都可以,
这个要看你怎么权衡。
代码:
不说废话了,直接上代码,最好去github上下载完整的码源,因为部分依赖没有放上来。
# -*- coding: UTF-8 -*-
# !/usr/bin/python
# @time :2019/5/12 13:16
# @author :Mo
# @function :chatbot based search, encode sentence_vec by bert
def chatbot_sentence_vec_by_bert_own():
"""bert encode is writted by my own"""
from FeatureProject.bert.extract_keras_bert_feature import KerasBertVector
from conf.path_config import chicken_and_gossip_path
from utils.text_tools import txtRead
import numpy as np
# 读取数据和一些参数,这里只取了100个标准问题
topk = 5
matrix_ques_save_path = "doc_vecs_chicken_and_gossip"
questions = txtRead(chicken_and_gossip_path, encodeType='utf-8')
ques = [ques.split('\t')[0] for ques in questions][0:100]
# 生成标准问题的bert句向量
bert_vector = KerasBertVector()
ques_basic_vecs = bert_vector.bert_encode(ques)
# 线上你可以生成,直接调用,然后直接load就好
np.savetxt(matrix_ques_save_path, ques_basic_vecs)
# matrix_ques = np.loadtxt(matrix_ques_save_path)
query_bert_vec = bert_vector.bert_encode(["小姜机器人是什么"])[0]
query_bert_vec = np.array(query_bert_vec)
print(query_bert_vec)
# 矩阵点乘,很快的,你也可以用annoy等工具,计算就更加快了
qq_score = np.sum(query_bert_vec * ques_basic_vecs, axis=1) / np.linalg.norm(ques_basic_vecs, axis=1)
topk_idx = np.argsort(qq_score)[::-1][:topk]
for idx in topk_idx:
print('小姜机器人回答检索: %s\t%s' % (qq_score[idx], questions[idx]))
while True:
print("你的问题:")
query = input()
query_bert_vec = bert_vector.bert_encode([query])[0]
# 矩阵点乘,很快的,你也可以用annoy等工具,计算就更加快了
qq_score = np.sum(query_bert_vec * ques_basic_vecs, axis=1) / np.linalg.norm(ques_basic_vecs, axis=1)
topk_idx = np.argsort(qq_score)[::-1][:topk]
for idx in topk_idx:
print('小姜机器人回答检索: %s\t%s' % (qq_score[idx], questions[idx]))
if __name__=="__main__":
chatbot_sentence_vec_by_bert_own()
希望对你有所帮助!