1

我想用词向量创建一个词汇图。目的是根据单词相似度查询词汇图中最近的单词。我们如何在 neo4j 上实现这一点?

下面是一个例子:

假设词汇表包含以下内容:

Product Quality
Wrong Product
Product Price
Product Replacement

查询词是: Affordable Product

在一个查询中,我应该能够找出“负担得起的产品”与“产品价格”的关系比其他任何东西都更密切。

请注意,我将单词嵌入存储在图表中,因此对词汇表中的每个单词进行余弦相似度检查将帮助我实现这一目标。但是当词汇量变大时,逐个查询会影响速度和性能。

如果有任何方法可以将领域词汇的词嵌入存储为图,可以根据余弦相似度查询最近的节点,这可能是一个可能的解决方案。但是到目前为止还没有找到类似的东西。

期待指针,如果有的话。谢谢

4

2 回答 2

1

您要做的是将嵌入结果存储到图中。下一步是使用Neo4j Graph Data Science 库,并专门运行余弦相似度算法。它看起来应该类似于:

MATCH (p:Word)
 WITH {item:id(p), weights: p.embedding} AS wordData
 WITH collect(wordData) AS data
 CALL gds.alpha.similarity.cosine.write({
   nodeProjection: '*',
   relationshipProjection: '*',
   data: data,
   // here is where you define how many nearest neighbours should be stored
   topK: 1,
   // here you define what is the minimal similarity between a 
   // given pair of node to be still relevant
   similarityCutoff: 0.1
 })
 YIELD nodes, similarityPairs, writeRelationshipType, writeProperty, min, max, mean, stdDev, p25, p50, p75, p90, p95, p99, p999, p100
 RETURN nodes, similarityPairs, writeRelationshipType, writeProperty, min, max, mean, p95

您现在已经对最近的邻居进行了预处理,并且可以轻松地查询它们,例如:

MATCH (w:Word)-[:SIMILAR]-(other)
RETURN other

希望这会有所帮助,如果您还有其他问题,请告诉我。

于 2020-05-20T16:50:04.047 回答
0

在试用并阅读了我们的几个选项后,我发现https://github.com/facebookresearch/faiss是这个用例的最佳选择。

于 2020-06-27T06:40:39.443 回答