【问题标题】:How can I calculate Cosine similarity between two strings vectors如何计算两个字符串向量之间的余弦相似度
【发布时间】:2016-03-06 20:54:32
【问题描述】:

我有 2 个维度为 6 的向量,我想要一个介于 0 和 1 之间的数字。

a=c("HDa","2Pb","2","BxU","BuQ","Bve")

b=c("HCK","2Pb","2","09","F","G")

谁能解释我应该怎么做?

【问题讨论】:

  • 在这种情况下,0.667 0.00 0.00 1.00 1.00 1.00 是你想要的还是 0.333 1.00 1.00 0.00 0.00 0.00
  • 我只想查看 0 和 1 之间的单个概率。如果 a 和 b 向量之间的关系很强,它应该接近 1,反之亦然

标签: r machine-learning cosine-similarity


【解决方案1】:

高级嵌入形式可能会帮助您获得更好的输出。请检查以下代码。 它是一个通用句子编码模型,使用基于转换器的架构生成句子嵌入。

from absl import logging
import tensorflow as tf
import tensorflow_hub as hub
import matplotlib.pyplot as plt
import numpy as np
import os
import pandas as pd
import re
import seaborn as sns

module_url = "https://tfhub.dev/google/universal-sentence-encoder/4"
model = hub.load(module_url)
print ("module %s loaded" % module_url)
def embed(input):
  return model([input])

paragraph = [
    "Universal Sentence Encoder embeddings also support short paragraphs. ",
    "Universal Sentence Encoder support paragraphs"]
messages = [paragraph]

print(np.inner( embed(paragraph[0]) , embed(paragraph[1])))

【讨论】:

    【解决方案2】:
    CSString_vector <- c("Hi Hello","Hello");
    corp <- tm::VCorpus(VectorSource(CSString_vector));
    controlForMatrix <- list(removePunctuation = TRUE,wordLengths = c(1, Inf), weighting = weightTf)
    dtm <- DocumentTermMatrix(corp,control = controlForMatrix);
    matrix_of_vector = as.matrix(dtm);
    res <- lsa::cosine(matrix_of_vector[1,], matrix_of_vector[2,]);
    

    对于更大的数据集可能是更好的选择。

    【讨论】:

      【解决方案3】:

      使用lsa 包和此包的手册

      # create some files
      library('lsa')
      td = tempfile()
      dir.create(td)
      write( c("HDa","2Pb","2","BxU","BuQ","Bve"), file=paste(td, "D1", sep="/"))
      write( c("HCK","2Pb","2","09","F","G"), file=paste(td, "D2", sep="/"))
      
      # read files into a document-term matrix
      myMatrix = textmatrix(td, minWordLength=1)
      

      编辑:显示mymatrix 对象的情况

      myMatrix
      #myMatrix
      #       docs
      #  terms D1 D2
      #    2    1  1
      #    2pb  1  1
      #    buq  1  0
      #    bve  1  0
      #    bxu  1  0
      #    hda  1  0
      #    09   0  1
      #    f    0  1
      #    g    0  1
      #    hck  0  1
      
      # Calculate cosine similarity
      res <- lsa::cosine(myMatrix[,1], myMatrix[,2])
      res
      #0.3333
      

      【讨论】:

      • 你能解释一下你的代码吗?当你比较“HDa”和“HCK”时,这并不重要,它们都有共同的字母“H”。它们完全不同。你的代码是这样工作的吗
      • 代码将使用您的输入向量创建一个textmatrix-document,当您创建textmatrix 时,您为工作分配一个索引,即HDa 将不同于@ 987654329@,请参阅我的编辑。然后cosine 函数将计算两个文档之间的余弦相似度(在您的示例中为ab
      • 我还有一个 266 行 7 列的矩阵。如果我想拥有自己的功能并提供 2 个输入,一个是向量,另一个是产品 ID。因此,我想在与产品 ID 向量最相似的前 8 个产品中查看真假(1 或 0)。如果你能回答我的问题,我会很高兴的。非常感谢提前
      • 这里是链接stackoverflow.com/questions/34062909/…@user2380782
      【解决方案4】:

      您首先需要一个可能术语的字典,然后将您的向量转换为二进制向量,其中相应术语的位置为 1,其他位置为 0。如果您将新向量命名为 a2b2,您可以使用 cor(a2, b2) 类似地计算余弦,但请注意余弦同样介于 -1 和 1 之间。您可以将其映射到 [0,1] 类似这个:0.5*cor(a2, b2) + 0.5

      【讨论】:

      • 创建字典后,您可以使用包lsa并运行cos函数,例如cos(a2, b2)
      • 这是正确的方法,但这看起来更像是评论而不是答案,因为它显示的是一般方法而不是特定的解决方案。此外,cor(a2, b2, method='pearson)(几乎)与余弦相似度相同。
      • @user2380782 我觉得函数是lsa::cosine
      • 是的。我只是希望向 OP 澄清他真正想要什么。
      猜你喜欢
      • 2017-09-07
      • 2010-10-05
      • 2019-12-27
      • 2021-07-19
      • 2022-06-14
      • 1970-01-01
      • 2015-07-21
      • 2019-12-02
      • 2018-07-28
      相关资源
      最近更新 更多