基于Neo4j 图数据库的知识图谱的关联对齐(实体对齐)——上篇

基于Neo4j 图数据库的知识图谱的关联对齐(实体对齐)——下篇
计算相关性的基本步骤分为三步:
1,链接neo4j数据库,并且读取出里面的数据
2,对齐算法运算
3,拿到运算结果设定一个阀值,来判断大于阀值的就是相关。
本篇暂时先讲到前面二步,第三步我们会在下一篇文章中会介绍。
直接上代码:

导入工具包
import numpy as np
from neo4j.v1 import GraphDatabase, basic_auth, kerberos_auth, custom_auth, TRUST_ALL_CERTIFICATES

链接数据库,建立driver。
driver = GraphDatabase.driver("***********", auth=basic_auth(“neo4j”,“neo4j”), trust=TRUST_ALL_CERTIFICATES)
session = driver.session()
读出数数据并且append到一个列表里面
dat = session.run(“MATCH (m)-[r]->(n) RETURN m.name, r.relation, n.name LIMIT 5”)
blists = []
for d in dat:
bs = str(d[0])
blists.append(bs)

把列表里面的数据,拿出来俩俩运算
for i in range(len(blists)):
for j in range(0,i):
a = blists[i]
b = blists[j]
print(blists[i],blists[j])
td = Jaccrad(a, b)
std =edit_distance(a, b)/max(len(a),len(b))
fy = 1-std
取2个算法的平均值
huizon = (td+fy)/2
print('avg_sim: ', huizon)

编辑距离算法
def edit_distance(word1, word2):
len1 = len(word1)
len2 = len(word2)
dp = np.zeros((len1 + 1, len2 + 1))
for i in range(len1 + 1):
dp[i][0] = i
for j in range(len2 + 1):
dp[0][j] = j
for i in range(1, len1 + 1):
for j in range(1, len2 + 1):
delta = 0 if word1[i - 1] == word2[j - 1] else 1
dp[i][j] = min(dp[i - 1][j - 1] + delta, min(dp[i - 1][j] + 1, dp[i][j - 1] + 1))
return dp[len1][len2]

Jaccrad 算法
def Jaccrad(terms_model,reference):
grams_reference = set(reference)
grams_model = set(terms_model)
temp = 0
for i in grams_reference:
if i in grams_model:
temp = temp + 1
fenmu = len(grams_model) + len(grams_reference) - temp
jaccard_coefficient = float(temp / fenmu)
return jaccard_coefficient

测试结果:
福州市委,福建省福州市委
avg_sim: 0.6190476190476191
福州市委,福建省委
avg_sim: 0.41666666666666663

发布了25 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/for_yayun/article/details/100292617