SDU创新实训4 基于科研知识图谱的知识问答系统

功能实现

jieba_userdict.py

读取本地数据集,获取作者和关键词,存储到本地userdict.txt文件中,用于后面jieba.load_userdict("…/data/userdict.txt"),可以从问句中提取出语料库里含有的关键词和作者名字,并赋予相应的词性,用于后面的模板匹配并且防止分词出错

process_question.py.py

处理问题的文件
主要功能:

  1. 初始化相关设置:读取词汇表,训练分类器,连接数据库
  2. 接收原始问题,对原始问题进行分词、词性标注等处理,对问题进行抽象
  3. 根据抽象后的问题选择对应模板,根据问题模板的具体类容,构造cql语句,并查询

question_template.py

  1. process_question.py.py使用,判断问题所属的模板,选择对应的处理
  2. 连接数据库,生成查询语句,返回结果

question_classification.py

利用朴素贝叶斯进行问题分类

主要代码

question_template.py.py

  1. get_question_answer

[‘word/flag’]和“问题模板编号 \t 问题模板”
定义了词列表和词性列表,根据这俩去调函数执行cql

 
    def get_question_answer(self, question, template):
        # 如果问题模板的格式不正确则结束
        assert len(str(template).strip().split("\t")) == 2
        # 得到模板id和模板的内容     ditc[1]=nm 文章关键词
        template_id, template_str = int(str(template).strip().split("\t")[0]), str(template).strip().split("\t")[1]
        self.template_id = template_id
        self.template_str2list = str(template_str).split()

        # 预处理问题
        question_word, question_flag = [], []
        # 构建词列表和词性列表
        for one in question:
            word, flag = one.split("/")
            question_word.append(str(word).strip())
            question_flag.append(str(flag).strip())
        assert len(question_flag) == len(question_word)
        self.question_word = question_word
        self.question_flag = question_flag
        self.raw_question = question
        # 根据问题模板来做对应的处理,获取答案
        answer = self.q_template_dict[template_id]()
        return answer
  1. cql
# 通过nr找到作者名字,通过作者名字搜论文
    def get_author_paper(self):
        author_name = self.get_name("nr")
        answers = self.getDatas.authorToPaper(author_name[0])

        return answers

    # 通过nm找关键词,通过关键词找论文
    def get_keyword_paper(self):
        keyword_list = self.get_name('ng')
        answers = self.getDatas.keywordToPaper(keyword_list)
        return answers

question_template.py

class Question():
    def __init__(self):
        # 初始化相关设置:读取词汇表,训练分类器,连接数据库
        # 训练分类器
        self.classify_model = Question_classify()
        # 读取问题模板
        with(open("../data/question_classification.txt", "r", encoding="utf-8")) as f:
            question_mode_list = f.readlines()  # 标签类别
        self.question_mode_dict = {}
        for one_mode in question_mode_list:
            # 读取一行
            mode_id, mode_str = str(one_mode).strip().split(":")
            # 处理一行,并存入
            self.question_mode_dict[int(mode_id)] = str(mode_str).strip()  # 例如 ditc[1]=nm 文章关键词
        # 创建问题模板对象,
        self.questiontemplate = QuestionTemplate()

    def question_process(self, question):
        # 接收问题
        self.raw_question = str(question).strip()
        # 对问题进行词性标注,返回列表['word/flag']
        self.pos_quesiton = self.question_posseg()
        # 得到问题的模板“问题模板编号 \t 问题模板”
        self.question_template_id_str = self.get_question_template()
        # 查询图数据库,得到答案

        self.answer = self.query_template()#隐藏了参数self.pos_quesiton和self.question_template_id_str
        return (self.answer)

    # 返回的result为列表,列表元素为’word/flag‘
    def question_posseg(self):
        jieba.load_userdict("../data/userdict.txt")
        clean_question = re.sub("[\s+\.\!\/_,$%^*(+\"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+", "", self.raw_question)
        # 正则化后清理后的问题
        self.clean_question = clean_question
        # 对问题进行词性标注,每个分的词后还有一个标注的词性
        question_seged = jieba.posseg.cut(str(clean_question))
        result = []
        question_word, question_flag = [], []
        # 对分词词性后的对象分析
        for w in question_seged:
            temp_word = f"{w.word}/{w.flag}"
            result.append(temp_word)
            # 预处理问题
            word, flag = w.word, w.flag
            question_word.append(str(word).strip())
            question_flag.append(str(flag).strip())
        assert len(question_flag) == len(question_word)
        self.question_word = question_word  # 返回一个所有分的词的一个列表
        self.question_flag = question_flag  # 返回所有分词的词性列表
        print(result)
        return result

    # 返回为“问题模板编号 \t 问题模板”问题模板编号有用,问题模板本身没用
    def get_question_template(self):
        # 抽象问题
        for item in ['nr', 'nm', 'ng']:
            while (item in self.question_flag):
                ix = self.question_flag.index(item)
                self.question_word[ix] = item  # 将问题中对应作者,关键词的地方改为他的词性
                self.question_flag[ix] = item + "ed"
        # 将问题转化字符串
        str_question = "".join(self.question_word)
        print("抽象问题为:", str_question)
        # 通过分类器获取问题模板编号
        question_template_num = self.classify_model.predict(str_question)
        print("使用模板编号:", question_template_num)
        # 得到问题所属模板
        question_template = self.question_mode_dict[question_template_num]
        print("问题模板:", question_template)
        question_template_id_str = str(question_template_num) + "\t" + question_template
        return question_template_id_str

    # 根据问题模板的具体类容,构造cql语句,并查询
    def query_template(self):
        # 调用问题模板类中的获取答案的方法
        try:
            answer = self.questiontemplate.get_question_answer(self.pos_quesiton, self.question_template_id_str)
        except:
            answer = "我也不知道啊!"
        return answer
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
系统根据B/S,即所谓的电脑浏览器/网络服务器方式,运用Java技术性,挑选MySQL作为后台系统。系统主要包含对客服聊天管理、字典表管理、公告信息管理、金融工具管理、金融工具收藏管理、金融工具银行卡管理、借款管理、理财产品管理、理财产品收藏管理、理财产品银行卡管理、理财银行卡信息管理、银行卡管理、存款管理、银行卡记录管理、取款管理、转账管理、用户管理、员工管理等功能模块。 文中重点介绍了银行管理的专业技术发展背景和发展状况,随后遵照软件传统式研发流程,最先挑选适用思维和语言软件开发平台,依据需求分析报告模块和设计数据库结构,再根据系统功能模块的设计制作系统功能模块图、流程表和E-R图。随后设计架构以及编写代码,并实现系统能模块。最终基本完成系统检测和功能测试。结果显示,该系统能够实现所需要的作用,工作状态没有明显缺陷。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。进入银行卡列表,管理员可以进行查看列表、模糊搜索以及相关维护等操作。用户进入系统可以查看公告和模糊搜索公告信息、也可以进行公告维护操作。理财产品管理页面,管理员可以进行查看列表、模糊搜索以及相关维护等操作。产品类型管理页面,此页面提供给管理员的功能有:新增产品类型,修改产品类型,删除产品类型。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值