闲聊机器人实例四:python实现小姜机器人(检索式chatbot_sentence_vec_by_bert_bert句向量)

 bert构建生成句向量,再计算相似度,匹配问答库中的标准问题。为什么使用bert倒数第二层输出构建句向量。

       小姜机器人、python、tensorflow、chatbot、dialog、bert中文短文本、fuzzywuzzy、检索式、生成式、聊天、闲聊、对话、问答、多轮、单轮、开放、封闭、任务、垂直等等描述,都属于自动问答领域。而且已经有了比较大的应用,常见的智能手机助手、聊天机器人、智能客服......

         github项目地址在:

https://github.com/yongzhuo/nlp_xiaojiang/blob/master/ChatBot/chatbot_search/chatbot_sentence_vec_by_bert.py

方案:

        方案,这种方法和 闲聊机器人实例三: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()

       希望对你有所帮助!

发布了96 篇原创文章 · 获赞 72 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/rensihui/article/details/90139802