基于知识图谱的智能问答系统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
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。
评论列表(条)