python对数据相似度分析算法库_相似度算法在知识图谱中的
实现
随着知识图谱的⽕爆从美国⼀路烧到了国内,近⼏年知识图谱技术在国内已经得到了飞速的发展,我们对知识图谱的概念及应⽤都不再陌⽣。你可以看到知识图谱技术的应⽤出现在越来越多的垂直领域中。从最早⼤家最为熟悉的在搜索引擎中的应⽤,逐渐地扩充到⾦融领域、医药领域等等。今天我们已经在各⾏各业中,都能够看到知识图谱的⾝影,更多的技术⼈员也加⼊了我们知识图谱⼯程的⼤家庭。
那么今天我们来就知识图谱的技术问题进⾏更深层的探讨。今天我将和⼤家分享⼀个,我在知识图谱搭建中遇到的棘⼿问题,相信有不少⼩伙伴也会遇到这样的问题。希望今天我分享的解决⽅案可以给⼤家⼀些帮助!
我遇到的问题:
在构建知识图谱的图关系时,基础数据来⾃很多不同的数据源。⽐如⾦融风控领域中,我们要构建的知识图谱中,包含地址、公司等出现频率⽐较⾼,并且名称⼀模⼀样的可能性很低的词汇。
⽐如:北京市国贸中⼼写字楼和北京朝阳区建外⼤街1号国贸中⼼是同⼀个地址么?
那在图关系的构建中,如果把上地址作为两个地址进⾏处理的话,那么就会创建两个实体,并且这两个实体之间并没有什么关联关系,这种处理⽅法,肯定是错误的。这个时候,需要进⾏的⼯作就是地址消歧,把两个地址经过处理后,变成同⼀个地址。
这个时候我们需要做的是进⾏相似度计算。
我的解决⽅案:
在Neo4j中的余弦相似度计算如何满⾜这种应⽤场景。
那么什么是余弦相似度呢?余弦相似度是n维空间中两个n维向量之间⾓度的余弦。它是两个向量的点积除以两个向量的长度(或幅度)的乘积。
余弦相似度公式:
那么计算的值介于-1和1之间,其中-1完全不同,1完全相似。
那么在neo4j中怎么使⽤余弦相似度计算呢?
⾮常幸运,neo4j的⼀个插件可以提供这样⼀个功能,让我们能够直接在其上实现相似度计算。
汇编指令retn程序设计语言就是计算机语言
环境安装:
这⾥你只需要⼀个jar包,就可以将其搞定。
将下载的graph-algorithms-algo-3.5.0.1.jar包拷贝到$NEO4J_HOME/plugins⽬录中
注意:要修改neo4j的配置将
dbms.security.procedures.unrestricted=algo.*
添加到f⽂件当中,⼀定要做,要不然后边的试验会失败
重启neo4j数据库就可以了。
第⼀个例⼦:
打开你的neo4j数据库,输⼊ :RETURN sine([3,8,7,5,2,9], [10,8,6,6,4,5]) AS similarity
这个语句的意思就是调⽤neo4j提供的算法计算库中的函数,并且计算[3,8,7,5,2,9]和 [10,8,6,6,4,5]两组数据的余弦相似度,那么返回的结果是:
那么这个值已经⾮常的接近1了。这就是这两个数字列表的余弦相似度值。
此时你应该感觉到,使⽤Neo4j库中的插件来实现,⾮常的简单。
那么下⾯,我们可以⾃⼰来根据公式进⾏推理⼀下。
⾸先,我们创建⼀个图关系:
具体Cypher如下:
MERGE (french:Cuisine {name:'French'})MERGE (italian:Cuisine {name:'Italian'})MERGE (indian:Cuisine {name:'Indian'})MERGE (lebanese:Cuisine {name:'Lebanese'})MERGE (portuguese:Cuisine {name:'Portuguese'})MERGE (zhen:Person {name: "Zhen"})MERGE (praveena:Person {name: "Praveena"})MERGE (michael:Person {name: "Michael"})MERGE (arya:Person {name: "Arya"})MERGE (karin:Person {name: "Karin"})MERGE (praveena)-[:LIKES {score: 9}]->(indian)MERGE (praveena)-
[:LIKES {score: 7}]->(portuguese)MERGE (zhen)-[:LIKES {score: 10}]->(french)MERGE (zhen)-[:LIKES {score: 6}]->
(indian)MERGE (michael)-[:LIKES {score: 8}]->(french)MERGE (michael)-[:LIKES {score: 7}]->(italian)MERGE (michael)-[:LIKES {score: 9}]->(indian)MERGE (arya)-[:LIKES {score: 10}]->(lebanese)MERGE (arya)-[:LIKES {score: 10}]->(italian)MERGE (arya)-[:LIKES {score: 7}]->(portuguese)MERGE (karin)-[:LIKES {score: 9}]->(lebanese)MERGE (karin)-[:LIKES {score: 7}]->(italian)
neo4j插⼊结果:
那么我们⽤这个数据再进⾏⼀次计算
Cypher如下:
MATCH (p:Person), (c:Cuisine) OPTIONAL MATCH (p)-[likes:LIKES]->(c) WITH {item:id(p), weights:
collect(coalesce(likes.score, 0))} as userData WITH collect(userData) as data CALL sine.stream(data) YIELD item1, item2, count1, count2, similarity NodeById(item1).name AS from, NodeById(item2).name AS to, similarity ORDER BY similarity DESC
相似度计算结果:
以上,我们可以看到Arya和Karin的⾷物⼝味最相似,得分为0.889。最⾼分为1,因此它们⾮常接近最⼤相似度
下边还有很多相似度为0的,原因是我数据库中原本有⼀些数据导致,那么现在我们要把这些数据过滤掉
Cypher如下:
MATCH (p:Person), (c:Cuisine)
OPTIONAL MATCH (p)-[likes:LIKES]->(c)
WITH {item:id(p), weights: collect(coalesce(likes.score, 0))} as userData
WITH collect(userData) as data
llvm gccCALL sine.stream(data, {similarityCutoff: 0.0})
python基础代码写字YIELD item1, item2, count1, count2, similarity
NodeById(item1).name AS from, NodeById(item2).name AS to, similarity
windows xp源代码下载ORDER BY similarity DESC
运⾏结果:
我们可以看到那些没有相似性的⽤户已被过滤掉了。如果我们正在实现k-Nearest Neighbors类型查询,我们可能希望k为给定⽤户到最相似的⽤户。我们可以通过传⼊topK参数来做到这⼀点。
以下将返回⽤户流以及最相似的⽤户(即k=1):
Cypher如下:
MATCH (p:Person), (c:Cuisine)
OPTIONAL MATCH (p)-[likes:LIKES]->(c)
WITH {item:id(p), weights: collect(coalesce(likes.score, 0))} as userData
WITH collect(userData) as data
CALL sine.stream(data, {topK:1, similarityCutoff: 0.0})
YIELD item1, item2, count1, count2, similarity
NodeById(item1).name AS from, NodeById(item2).name AS to, similarity
ORDER BY from
执⾏结果:
细⼼的同学会发现,以上的结果有⼀点问题,第⼀⾏的结果和第⼆⾏的结果其实是相同的。
那么我们现在要做的是为每个⽤户到最相似的⽤户,并存储这些⽤户之间的关系:
Cypher如下
一二三四免费观看视频MATCH (p:Person), (c:Cuisine)
OPTIONAL MATCH (p)-[likes:LIKES]->(c)
WITH {item:id(p), weights: collect(coalesce(likes.score, 0))} as userData
WITH collect(userData) as data
CALL sine(data, {topK: 1, similarityCutoff: 0.1, write:true})
YIELD nodes, similarityPairs, write, writeRelationshipType, writeProperty, min, max, mean, stdDev, p25, p50, p75, p90, p95, p99, p999, p100
RETURN nodes, similarityPairs, write, writeRelationshipType, writeProperty, min, max, mean, p95
执⾏结果如下:
然后,我们可以写⼀个查询,以出与我们相似的其他⼈可能喜欢的美⾷类型。
以下将到与Praveena最相似的⽤户
Cypher:
MATCH (p:Person {name: "Praveena"})-[:SIMILAR]->(other),
(other)-[:LIKES]->(cuisine)
WHERE not((p)-[:LIKES]->(cuisine))
RETURN cuisine.name AS cuisine
执⾏结果:
以上就是整个的计算过程。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论