资源简介

基于知识图谱的智能问答系统python实现(复旦大学论文基于qa语料和知识库的问答系统)

资源截图

代码片段和文件信息

#! -*- coding:utf-8 -*-
import pickle
from connectSQLServer import connectSQL
host = ‘172.16.54.33‘
user = ‘sa‘
password = ‘chentian184616_‘
database= ‘chentian‘
querySQL = connectSQL(host user password database)
class Pro_onlines(object):
    def __init__(selfEV):
        self.EV=EV
        self.sql_current_evp=“SELECT COUNT(*) FROM [chentian].[dbo].[baike_triples1] WHERE entity =‘%s‘ AND property=‘%s‘“
        self.sql_baidutag=“SELECT value FROM [chentian].[dbo].[baike_triples1] WHERE entity =‘%s‘ AND property=‘BaiduTAG‘“
        # self.entity_values=entity_values
        # self.value_entities=value_entities
        self.concept_fre=pickle.load(open(“./../data/concept_count.pkl“‘rb‘))
    def calculate_piq(selfque1):
        “““
        计算当前问题qi的每一个实体的概率,可以认为是当前实体对当前问题的重要程度,计算了三个概率,并且这三个概率,都可以通过当前问题,进行计算,
        计算了p(e|q)的概率,计算时由于对EV对可能有多个重复实体记录,所以需要把分母进行累加计算,具体看代码56-57行,分子为所有实体额记录频数。
        第二个概率变化为,根据两篇论文,最终采用当前实体对应的类别的概率采用e:{c1:pre1c2:pre2...}的形式,
        第三个概率,论文中提到对于e,p的多个value采用均匀概率,并且唯一value概率为一。至此三个概率
        :param qi: 当前问题,以及对应的三元组形成的数据
        :return: 返回当前问题中每个实体对应p(e/q)已经求出
        “““
        print(que1.keys()“$$$$$$$$$$$$$$“)
        evi=list(que1.values())[0]#问题中的所有(实体-属性-值)
        currente_pre1 = {} #当前问题的第一个概率p(e|qi)
        currente_pre2 = {}  # 是每一个实体对应value不同实体的频数
        current_pteq={}#对于问题模板的类别概率问题  e_c = {}  # 保存每一个实体对应的类别概率e:{c1:pre1c2:pre2...}
        current_pvep={}#对于当前问题的实体意图对应的value值得概率
        for key in evi.keys():
            e_c_pre = {}  # 当前问题每一个实体e对应的类别c的频数。
            epv=key.split(“&&&&&“)#接下来对每一个v 遍历每一个问题中所有的相同v得到对应的实体e,并且记录实体出现的频数 实体e可能出现多次对第一个概率没有影响,但是对第二个有影响,本来有结果,
            #                         重复第二次没有对应baidutag,则会重新赋值为空,
            if v!=‘‘ and p!=‘‘ and v!=‘‘:
                current_e = 0  # 当前实体对应的频数 分子
                current_alle = 0  # 对当前value的不同实体记总数 分母
                entity_value_temp=self.entity_values[e]#得到对应实体的value以及频数
                value_entity_temp=self.value_entities[v]#得到对应value的
                for entity_keyentity_pre in entity_value_temp.items():
                    if entity_key==v:
                        current_e=entity_pre
                        current_alle=sum(list(value_entity_temp.values()))
                        currente_pre1[e]=float(current_e)/float(current_alle)
        print(currente_pre1)
            # current_pvep_pre=querySQL.Query(self.sql_current_evp%(ep))[‘‘][0] #计算同一实体e同一意图p的不同值v的个数

        #     current_pe=0 #当前实体,对应类别(pe)共同满足的个数
        #     current_allp=0 #当前实体的频数在整个EV中,作为求类别的分母。
        #     for que_ev in self.EV: #整个for循环就把所有的实体遍历所有问题
        #         current_evi=list(que_ev.values())[0] #当前EV当前问题的所有实体对
        #         for key1 in current_evi.keys():  #对于每一个实体对
        #             e1p1v1=key1.split(“&&&&&“)
        #             if v ==v1: #如果value相同
        #                 current_alle+=1 #对应实体的value其他共有多少实体的频数
        #                 if e1==e:curr

评论

共有 条评论