資源簡介
基于知識圖譜的智能問答系統(tǒng)python實現(xiàn)(復(fù)旦大學(xué)論文基于qa語料和知識庫的問答系統(tǒng))
代碼片段和文件信息
#!?-*-?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):
????????“““
????????計算當(dāng)前問題qi的每一個實體的概率,可以認(rèn)為是當(dāng)前實體對當(dāng)前問題的重要程度,計算了三個概率,并且這三個概率,都可以通過當(dāng)前問題,進行計算,
????????計算了p(e|q)的概率,計算時由于對EV對可能有多個重復(fù)實體記錄,所以需要把分母進行累加計算,具體看代碼56-57行,分子為所有實體額記錄頻數(shù)。
????????第二個概率變化為,根據(jù)兩篇論文,最終采用當(dāng)前實體對應(yīng)的類別的概率采用e:{c1:pre1c2:pre2...}的形式,
????????第三個概率,論文中提到對于e,p的多個value采用均勻概率,并且唯一value概率為一。至此三個概率
????????:param?qi:?當(dāng)前問題,以及對應(yīng)的三元組形成的數(shù)據(jù)
????????:return:?返回當(dāng)前問題中每個實體對應(yīng)p(e/q)已經(jīng)求出
????????“““
????????print(que1.keys()“$$$$$$$$$$$$$$“)
????????evi=list(que1.values())[0]#問題中的所有(實體-屬性-值)
????????currente_pre1?=?{}?#當(dāng)前問題的第一個概率p(e|qi)
????????currente_pre2?=?{}??#?是每一個實體對應(yīng)value不同實體的頻數(shù)
????????current_pteq={}#對于問題模板的類別概率問題??e_c?=?{}??#?保存每一個實體對應(yīng)的類別概率e:{c1:pre1c2:pre2...}
????????current_pvep={}#對于當(dāng)前問題的實體意圖對應(yīng)的value值得概率
????????for?key?in?evi.keys():
????????????e_c_pre?=?{}??#?當(dāng)前問題每一個實體e對應(yīng)的類別c的頻數(shù)。
????????????epv=key.split(“&&&&&“)#接下來對每一個v?遍歷每一個問題中所有的相同v得到對應(yīng)的實體e,并且記錄實體出現(xiàn)的頻數(shù)?實體e可能出現(xiàn)多次對第一個概率沒有影響,但是對第二個有影響,本來有結(jié)果,
????????????#?????????????????????????重復(fù)第二次沒有對應(yīng)baidutag,則會重新賦值為空,
????????????if?v!=‘‘?and?p!=‘‘?and?v!=‘‘:
????????????????current_e?=?0??#?當(dāng)前實體對應(yīng)的頻數(shù)?分子
????????????????current_alle?=?0??#?對當(dāng)前value的不同實體記總數(shù)?分母
????????????????entity_value_temp=self.entity_values[e]#得到對應(yīng)實體的value以及頻數(shù)
????????????????value_entity_temp=self.value_entities[v]#得到對應(yīng)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的個數(shù)
????????#?????current_pe=0?#當(dāng)前實體,對應(yīng)類別(pe)共同滿足的個數(shù)
????????#?????current_allp=0?#當(dāng)前實體的頻數(shù)在整個EV中,作為求類別的分母。
????????#?????for?que_ev?in?self.EV:?#整個for循環(huán)就把所有的實體遍歷所有問題
????????#?????????current_evi=list(que_ev.values())[0]?#當(dāng)前EV當(dāng)前問題的所有實體對
????????#?????????for?key1?in?current_evi.keys():??#對于每一個實體對
????????#?????????????e1p1v1=key1.split(“&&&&&“)
????????#?????????????if?v?==v1:?#如果value相同
????????#?????????????????current_alle+=1?#對應(yīng)實體的value其他共有多少實體的頻數(shù)
????????#?????????????????if?e1==e:curr
評論
共有 條評論