基于Python实现的问答系统设计
资源下载地址:https://download.csdn.net/download/sheziqiong/85637720
问答系统设计与实现
1 实验目的
对问答系统的设计与实现过程有一个全面的了解,实验主要内容包括:
对给定的文本集合进行处理、建立索引。
找出问题的候选答案句并排序。
答案抽取,逐步调优。
2 实验内容
文本集合进行处理、建立索引
对所有文档分词、分句,并建立索引,作为问答系统的检索语料。
问题分类
训练一个问题分类模型,得到问题类别信息,然后将其融入到候选答案句排序和答案抽取的任务中,以取得更好的效果。
候选答案句排序
对所有候选答案句按照其包含正确的可能性进行排序,可能性越大的越靠前。
答案抽取
从候选答案句中抽取正确的答案。
1.3 实验过程及结果
实验代码采用python,机器学习包采用sklearn。
1.文本集合进行处理、建立索引
数据存储格式位于utils/data.py文件中,其用于从文件中读写数据,保存每条数据的属性,并在数据集上应用各类学习器(分词、分类等)。
其各类方法如下所示:
@staticmethoddef load(name: str, path: str):"""从json文件中加载数据Args:name: 数据集名称path: 数据路径"""def dump(self, path: str):"""将数据保存到json文件Args:path: 数据路径"""def get(self, key: str) -> List:"""提取键对应的属性Args:key: 属性Returns:查询属性"""def retrieval(self, key: str, question: List[List[float]], pid: List[int] = None):"""从数据库中查找和问题最匹配的文档Args:key: 查询关键字question: 向量化的问题pid: 真实pidReturns:查找到的最匹配文档的pid若输入提供pid,则额外返回准确率"""def delete(self, key: str):"""刪除key對應的屬性Args:key: 刪除屬性"""def update(self, learner, key: List[str], value: str):"""将key作为参数调用learner,将返回的结果保存到value中Args:learner: 学习器,必须声明predictkey: 调用参数键value: 保存键"""
分词器位于utils/tokenizer.py文件中,其用于对给定的句子进行分词,所用为LTP包。
分类器定义如下:
class Tokenizer(object):"""分词器采用哈工大LTP语言技术平台Attributes:__tokenizer: 分词器__vocabulary: 单词表__stopwords: 停用词"""
其各类方法如下所示:
def predict(self, paragraph: List[str]) -> List[str]:"""对给定的文段进行分词处理,用空格区分Args:paragraph: 待分词文段limit: 删除频率小于limit的低频词Returns:分词结果,用空格分隔"""
向量化器位于utils/vectorizer.py文件中,其用于将分词的句子转换为一个实值向量,采用tf-idf表示法,公式为:
由于向量化的结果规模过于庞大,无法直接保存到本地文件中,所以为此训练了一个向量化器,采用sklearn.feature_extraction.text.TfidfVectorizer,其可以直接将分词句子转化为tf-idf向量。
向量化器定义如下:
class Vectorizer(object):"""向量化器将一个已分词单词序列对应到一个实值向量采用tf-idf表示法Attributes:__vectorizer: 向量化器"""
综上所述,该步使用LTP进行分词、去停用词,然后将其映射为实值向量,便于后续机器学习模型进行训练和预测。
2.问题分类
该任务程序入口为question_classification.py。
分类器位于utils/classifier.py文件中,其将句子进行分类,由于训练样本较少,所以仅预测每个句子的大类。
分类器分别尝试KNN(N=5)和SVM(每个分类训练一个分类器),其预测准确率分别为35.34%和64.66%。
故后续采用SVM的结果。
分类器定义如下:
class Classifier(object):"""分类器输入代表句子的实值向量,输出句子的分类其中分类可见《IR研究室问题分类体系ver2.doc》仅预测大类Attributes:__kind2id: 分类映射为ID__id2kind: ID映射为分类__kind_cnt: 分类的种类数__classifier: 分类器"""
3.候选答案句排序
该任务的程序入口为answer_sentence_selection.py。
首先根据各个句子的向量表示的余弦相似度找到最合适的文档。
由于单个文档中各个句子相似度较高,所以不能直接求各个句子和问题的余弦相似度来获得候选答案句。
考虑到两个句子的编辑距离、最长公共序列可以很好地反映两个句子的相似程度,所以对于每个子句,会生成一个两维的向量,其中第一维为该句和问题的编辑距离,第二维为该句和问题的编辑距离。
然后采用逻辑回归来进行二分类,来求出每个句子为答案句的概率。(不采用其他分类模型是因为不能求出概率)
选择器位于utils/selector.py文件中,其正确率为41.68%。
4.答案抽取
该任务的程序入口为answer_span_selection.py。
由于在任务2中,我们已经对每个句子做了分类,因此该任务中会对数据依照大类做命名实体识别任务,采用BIO标注法。
具体来说,对于训练集中的一条问题-文档对,设该问题的文档为“赵显宰 1980年 出生 于 韩国 , 韩国 影视 男演员 。”,问题的分类为NUM,则会给该问题-文档对进行实体标注“O B-NUM O O O O O O O O”,并利用该数据训练识别器。
在进行答案抽取时,我们在获取了问题的类别后,会对文档进行命名实体识别,并抽取出类别对应的单词。
识别器位于utils/recognizer.py文件中,采用CRF算法,特征为:每个单词的前后三个单词、该单词是否为大/小写、该单词是否为数字。
由于CRF模型并不完善,若标注任务并没有标注出与问题类型相同的单词,则答案为空。
4 实验心得
机器学习相关任务总重要的就是知识的获取,所以如何充分地利用知识(问题的分类),来改善我们最终任务的性能(答案抽取),是需要着重考虑的问题。在本次实验中,尝试了将信息迁移到原来的问题中,取得了不错的效果。
数据规模较大,导致机器学习模型的学习和预测效率较低,所以如何改善模型的性能也是需要考虑的问题。在本次实验中,尝试了降维的方法(参见utils/reducer.py),但是由于维数过高(和单词总数同维),导致降维的性能和效果并不好,故未在最终的结果中使用。
资源下载地址:https://download.csdn.net/download/sheziqiong/85637720
基于Python实现的问答系统设计相关推荐
- python批量检索文献_基于Python的文献检索系统设计与实现
基于 Python 的文献检索系统设计与实现 杜兰 ; 刘智 ; 陈琳琳 [期刊名称] <软件> [年 ( 卷 ), 期] 2020(041)001 [摘要] 毕业设计是大学本科教育的一个 ...
- py225基于python的家政管理系统设计
开发环境 项目编号: py225基于python的家政管理系统设计 开发语言:Python python框架:django 软件版本:python3.7/python3.8 数据库:mysql 5.7 ...
- 基于python的人脸识别系统设计与实现
案例分享之基于python的人脸识别系统设计与实现 人脸识别即程序对输入的图像进行判别是否有人脸,并识别出有人脸的图像所对应的人.即我们常说的人脸识别一般包含了人脸检测和人脸识别两部分.下面对其在op ...
- 基于Python的项目成本管理系统设计
基于Python的项目成本管理系统设计,系统架构:python3.6 +Django1.11+Mysql ,具体功能: 成本估算 2.项目进度管理 3.成本控制 4.用户注册登录 系统截图:![
- 基于python的在线音乐系统设计与实现
摘 要 本音乐系统借助了当前互联网的发展趋势,近几年,随着网络的快速发展,网络已经融入人们的生活中.互联网给人们的生活带来了许多便利,基本上可以达到足不出户就能完成许多事情.互联网的使用基本实现全覆盖 ...
- 基于Python小说电子书阅读系统设计与实现 开题报告
本科生毕业论文 基于Python电子书阅读系统Django框架 开题报告 学 院: 专 业: 计算机科学与技术 年 级: 学生姓名: 指导教师: 黄菊华 XXXX大学本科生毕 ...
- 基于Python运动场地预约系统设计与实现 开题报告
本科生毕业论文 基于Python校园运动场地预约系统(Django框架) 开题报告 学 院: 专 业: 计算机科学与技术 年 级: 学生姓名: 指导教师: 黄菊华 XXXX大 ...
- 基于Python个人博客系统设计与实现 开题报告
本科生毕业论文 基于python个人博客系统Django框架 开题报告 学 院: 专 业: 计算机科学与技术 年 级: 学生姓名: 指导教师: 黄菊华 XXXX大学本科生毕业 ...
- 基于python的验证码自动识别系统设计与实现
针对目前互联网上关于页面自动登录环节出现的难点,由于部分登录界面有验证码的存在,自动登录的时长被增加,并且有的验证码难以识别,这就提出了基于Python和卷积神经网络(CNN)相结合的验证码识别.首先 ...
最新文章
- 二维码Data Matrix简介及在VS2010中的编译
- mysql基本命令行
- mSystems: 南土所褚海燕组揭示了大空间尺度下空间比季节对土壤微生物群落的影响大
- 又拍云再放大招,CDN同时支持HTTP/2和SPDY/3.1协议
- oracle集群rac无法访问,解决Oracle 11g R2 RAC 无法在客户端通过scanIP连接数据库
- (转)你有所不知的HTML發佈Flash的參數(三):base
- 《BI那点儿事》数据流转换——派生列
- Web API——添加Swagger、SQL Server、日志记录、导出到Excel和Docker
- vba传值调用_vba – 动态调用从形状OnAction属性传递参数的宏
- JScript中正则表达函数的说明与应用
- 联想服务器安装win10系统安装教程,联想win10企业版操作系统安装步骤详解
- 前端-h5移动端星空效果登录界面
- linux给变量加单引号,grep中加单引号与不加引号的区别
- 计算机保研,应对面试笔试该如何准备?
- 用H5 canvas实现唯美渐变色块的绘制
- php artisan migrate,Laravel php artisan 自动生成Model+Migrate+Controller 命令大全
- vue前端UI框架整理
- 2021年电工(初级)考试报名及电工(初级)复审模拟考试
- 厦大C语言上机 1488 判断素数
- 【报告分享】2020年数据资产生态白皮书-普华永道(附下载)