【问题标题】:How to create vocabulary graph with word vectors using neo4j?如何使用 neo4j 创建带有词向量的词汇图?
【发布时间】:2020-05-16 09:46:21
【问题描述】:

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

以下是一个例子:

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

Product Quality
Wrong Product
Product Price
Product Replacement

查询词为: Affordable Product

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

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

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

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

【问题讨论】:

  • 您的查询词 'Affordable Product' 不在您的词汇表中。 (从技术上讲,甚至 'Product' 都不是,因为您只提到了包含 2 个单词的标记。)暂时搁置任何速度问题或可能的细节(如图形数据库),您希望代码如何评价未知术语'Affordable Product' 最接近'Product Price'? (您是否有一个现成的解决方案,它太慢了,提示您关于构建图表的查询?
  • 我会将余弦距离存储到图中所有其他节点。这是我能想到的最粗略的实现。
  • 什么图中的节点?暂且不考虑任何速度问题或可能的细节(如图形结构),您如何期望代码将 unknown 术语“负担得起的产品”评为最接近“产品价格”? (您是否有一个现成的解决方案,它太慢了,提示您关于构建图的查询?有一种方法来进行这种未知到已知的比较,即使没有任何图结构优化,也是考虑其他的先决条件方法类似于预先计算的最近邻图。)
  • 我用余弦距离来找到接近度。我可以对图形空间中的所有节点执行此操作以找到最近的
  • 如果您的词汇表中没有术语 'Affordable Product'(确切的两个单词字符串),则可以使用向量来计算余弦距离。

标签: neo4j ontology word2vec vocabulary knowledge-graph


【解决方案1】:

您要做的是将嵌入结果存储到图表中。下一步是使用Neo4j Graph Data Science library,并专门运行cosine similarity algorithm。它看起来应该是这样的:

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

希望对您有所帮助,如果您有任何其他问题,请告诉我。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-02-18
      • 2018-02-14
      • 2021-08-02
      • 2017-06-23
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 2017-06-01
      相关资源
      最近更新 更多