faq的问答系统是目前用的比较广泛的问答系统,由于它落地简单,并且大部分场景都需要,构建一个faq问答系统可以作为一个baseline快速应用到实际场景中。下面就介绍如何快速构建一个faq问答的baseline。

一、环境的搭建

faq的核心技术是信息检索,信息检索的常用工具则是es,es既可以对faq知识库存储,又可以快速查询文本。同时也有配套的可视化工具kibana,方便数据查询和管理。此外,es的社区也很活跃,文档和讨论的问题也方便使用。

elasticsearch+kibana安装

使用docker容器拉取镜像文件,注意elasticsearch和kibana的版本要一致,本人使用的版本均为7.8.1的版本。

启动容器,根据官网的教程启动docker容器,选用单个节点

docker run -p 9200:9200 -p 9300:9300 --name es7.8\
-e "discovery.type=single-node" \
-e ES_JAVA_OPS="-Xms512m -Xmx512m" \
-d elasticsearch:7.8.1

如果是中文检索,需要安装中文分词器,先到GitHub - medcl/elasticsearch-analysis-ik: The IK Analysis plugin integrates Lucene IK analyzer into elasticsearch, support customized dictionary.上下载对应版本的ik分词器,然后进入容器解压到对应文件夹。

安装完es后再安装kibana

docker run --link es7.8.1:elasticsearch -p 5601:5601 -d kibana:7.8.1

二、python操作es

创建索引

es = Elasticsearch('http://127.0.0.1:9200')
base_info_index_mappings = {"settings":{"index.analysis.analyzer.default.type": "ik_max_word"},"mappings":{"properties": {"id": {"type": "keyword"},"standard_question": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_max_word"},"sim_question": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_max_word"},"answer": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_max_word"},"query_vector": {"type": "dense_vector","dims": 768},"update_date": {"type": "date","format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd"},"create_time": {"type": "date","format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd"},}}
}

批量插入数据

def insert_data(index_name, items, batch_size=100):'''批量插入数据到索引中:param index_name::param items::param batch_size::return:'''batch = []err_count = 0for i, columns in enumerate(items):[sim_question, std_question, answer, vector] = columnsid = uuid.uuid1()update_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')create_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')try:body = {'_index': index_name,'_source': {'id': id,'standard_question': std_question,'sim_question': sim_question,'answer': answer,'query_vector': vector,'update_time': update_time,'create_time': create_time}}except Exception as e:err_count += 1print(e)if len(batch)<batch_size:batch.append(body)cur_id = idelse:helpers.bulk(es, batch)print('总共有{}条数据,存储到第{}条数据'.format(len(batch), i))if len(batch)>0:helpers.bulk(es, batch)print('最终id是{}'.format(cur_id))print('err_count:{}'.format(err_count))return '插入数据完成'

其中的query_vector通过bert模型提前计算出768维向量并存入es的dense_vector格式数据字段中。关于bert向量计算可参考下部分代码

    def extract_vectors(self, model, text):'''抽取句子向量:param text::return:'''batch_token_ids, batch_segment_ids, batch_mask = [], [], []word_ids, segment_ids, word_mask = encode(text)batch_token_ids.append(word_ids)batch_segment_ids.append(segment_ids)batch_mask.append(word_mask)inputs = dict(input_word_ids=batch_token_ids,input_mask=batch_mask,input_type_ids=batch_segment_ids,)infer_input = {"input_word_ids": tf.convert_to_tensor(inputs['input_word_ids']),"input_mask": tf.convert_to_tensor(inputs['input_mask']),"input_type_ids": tf.convert_to_tensor(inputs['input_type_ids']),}outputs = model(infer_input)encoder_outputs = outputs[0]last_encoder = encoder_outputs[-1]mean_vecor = tf.reduce_mean(last_encoder[:, 1:len(text) + 1, :], axis=1)print(mean_vecor.shape)mean_vecor_norm = tf.norm(mean_vecor, ord=2, axis=0)mean_vecor = mean_vecor / mean_vecor_normprint(mean_vecor.numpy()[0].shape)return mean_vecor.numpy()[0].tolist()

三、查询

es可以计算向量的余弦相似度,通过向量检索的形式可以找出最相近的问题,检索代码如下:

script_query = {"script_score": {"query": {"match_all": {},},"script": {"source": "cosineSimilarity(params.query_vector, 'query_vector') + 1.0","params": {"query_vector": query_vector}}}
}
body = {"_source": ["standard_question", "sim_question", "answer"],"size": 5,"query": script_query,
}
res = search_data_by_body('faq_test_index', body)

其中query_vector为实时用bert抽取的查询文本向量。该方法速度很快,满足上线要求。

四、总结

以上就是一个faq问答系统的baseline,有一个比较重要的步骤是在之前就做好了,就是知识库的构建,需要某一业务场景的常用的faq问题及答案的总结。在baseline的基础上,后续可以不断丰富知识库,也可以通过精排、意图分类等方法提高查询的准确率。

基于bert特征提取的FAQ问答系统构建相关推荐

  1. 基于深度学习的FAQ问答系统

    | 导语 问答系统是信息检索的一种高级形式,能够更加准确地理解用户用自然语言提出的问题,并通过检索语料库.知识图谱或问答知识库返回简洁.准确的匹配答案.相较于搜索引擎,问答系统能更好地理解用户提问的真 ...

  2. 基于Bert的知识库智能问答系统

    项目完整地址:https://github.com/1105425455/Bert/tree/master 有训练好的模型 可以先看一下Bert的介绍. Bert简单介绍 一.系统流程介绍. 知识库是 ...

  3. 基于BERT的数据库的问答系统

    目录 一. 知识图谱的介绍 1. 知识库与三元组 2. 知识库问答 3. 知识库问答的主流方法 4. 基于深度学习的KQ问答 二. 本项目介绍 1. 项目数据集 2. 处理数据集 2.1 构造命名实体 ...

  4. 基于bert的语义匹配_构建基于BERT的语义搜索系统…针对“星际迷航”

    基于bert的语义匹配 If you read my previous article on Towards Data Science you'll know I'm a bit of a Star ...

  5. 百度开源 FAQ 问答系统—AnyQ【使用语义匹配技术 SimNet】

    近年来,随着人工智能技术的发展,人机对话技术得到越来越多的关注,人机对话产品也不断涌现.其中,智能客服作为人机对话的一个典型场景表现出极大的商业潜力和很强的研究价值,各企业也争先恐后的推出自己的智能客 ...

  6. 基于深度学习的FAQ检索式问答系统

    问答系统是信息检索的一种高级形式,能够更加准确地理解用户用自然语言提出的问题,并通过检索语料库.知识图谱或问答知识库返回简洁.准确的匹配答案.相较于搜索引擎,问答系统能更好地理解用户提问的真实意图, ...

  7. 基于Bert论文构建Question-Answering模型

    摘要 本文拜读了提出 Bert 模型的论文,考虑了在 Bert 中算法模型的实现.比较了 Bert 与其他如 Transformer.GPT 等热门 NLP 模型.BERT 在概念上很简单,在经验上也 ...

  8. 基于文本语义的智能问答系统以及数据格式应用

    基于文本语义的智能问答系统以及数据格式应用 NLP: 基于文本语义的智能问答系统 应用场景: 智能语音交互,在线客服,知识获取,情感类聊天等 常见的分类:生成型,检索型问答系统: 单论问答,多轮问答系 ...

  9. NLP: 基于文本语义的智能问答系统

    向AI转型的程序员都关注了这个号???????????? 人工智能大数据与深度学习  公众号:datayx 问答系统是自然语言处理领域一个很经典的问题,它用于回答人们以自然语言形式提出的问题,有着广泛 ...

最新文章

  1. 重磅MIT开源人工智能算法评估和理解对抗Logit配对的稳健性
  2. 计算机教学辅助在教学中的应用研究,云计算辅助教学在高职计算机教学中的应用研究.doc...
  3. Go语言字符串和数组的相互转换
  4. Python之精心整理的50道入门练手习题 | Python技能树征题
  5. 《PaaS程序设计》一1.2 云能为创新做什么
  6. Docker CPU 资源限制——CPU分片功能测试
  7. swift4 label显示html,Swift:在标签或textView中显示HTML数据
  8. 人口红利提前消失?今年经济会如何?权威回应来了
  9. 剑指offer之斐波那契数列求解
  10. 做自媒体,不用露脸拍视频,方法都在这篇文章
  11. 数组和ArrayList的区别
  12. c# winform 解决PictureBox 无法打印全部图片的问题
  13. L2TP协议及AVP
  14. iMatrix平台核心功能—Portal 介绍
  15. Java多线程学习Day01
  16. IDEA新建项目时,没有Spring Initializr选项
  17. 福利!数据人实战干货资料汇总
  18. 主键、唯一键、外键、
  19. 安卓强制关闭软键盘输入法
  20. TOP100summit 2017:【案例分享】魅族持续交付平台建设实践

热门文章

  1. 15 THINGS ALL GIRLS SHOULD KNOW ABOUT THEIR VAGINA
  2. python全栈(中国历史天气可视化系统)
  3. 吞吐量QPS、TPS、HPS
  4. 遥感知识-像元二分模型
  5. SQL条件查询,分组查询,排序查询,分页查询
  6. AutoSAR的入门知识
  7. C++空间中一点到平面投影
  8. POJ 1845 【数论】
  9. AI的故事:半人马的诞生之路
  10. Error resolving template [], template might not exist or might not be accessible by any of the conf