我有大量文档,其中包含大量键值对。该密钥可能不是唯一的,因此可能有具有不同值的相同类型的多个键。

我想比较2个文档之间键的相似性。更具体地说,这些值的字符串相似性。我正在考虑使用像 史密斯 - 水手算法 比较相似性。

因此,我已经绘制了我如何考虑表示数据的图片 -

enter image description here

细胞中的值是史密斯 - 水手算法(或其他一些字符串相似性度量)的结果。

图像此矩阵代表“事物”的关键类型,然后我需要将“事物”相似性得分添加到0或1的向量中。

我无法确定的是如何确定矩阵是否相似 - 理想情况下,我想将矩阵转换为0到1之间的数字,然后我将设置一个阈值将其得分为0或1。

有什么想法我如何创建矩阵的分数?有谁知道任何做这种事情的算法(显然,诸如史密斯·沃特曼(Smith Waterman)的工作方式之类的事情是适用的)。

有帮助吗?

解决方案

正如我所知,文件1和文件2可能具有不同数量的密钥。然后,您会在0和1之间获得最终的相似性评估。如果是,我将建议以下算法:

  1. 最大总和。阀等于0。
  2. 从DOC-DOC矩阵中选择最大值,然后将其添加到最大值。阀。
  3. 从矩阵中删除具有最大值的行和列。
  4. 重复步骤2-3,直到排或列结束。
  5. 最大值的总和。阀平均按两个文本中的关键词数。

如果两个文档的长度相同,并且文档1中的每个单词在DOC 2中都等效,则最终估计将等于1。

您尚未提及软件,但您正在使用,但这是 r 函数的示例,计算这种相似性(以类矩阵为输入的对象):

eval.sim <- function(sim.matrix){
  similarity <- 0
  denominator <- sum(dim(sim.matrix)) / 2
  for(i in 1:(min(c(nrow(sim.matrix), ncol(sim.matrix))) - 1)){
    extract <- which(sim.matrix == max(sim.matrix), arr.ind=T)[1, ]
    similarity <- similarity + sim.matrix[extract[1], extract[2]]
    sim.matrix <- sim.matrix[-extract[1], -extract[2]]
  }
  similarity <- similarity + max(sm.copy)
  similarity <- similarity / denominator
}

在python-

import numpy as np

def score_matrix(sim_matrix):
    similarity = 0
    denominator = sum(sim_matrix.shape) / 2
    for i in range(min(sim_matrix.shape)):
        x, y = np.where(sim_matrix == np.max(sim_matrix))[0][0], np.where(sim_matrix == np.max(sim_matrix))[1][0]
        similarity += sim_matrix[x, y]
        sim_matrix = np.delete(sim_matrix,(x),axis=0)
        sim_matrix = np.delete(sim_matrix,(y),axis=1)
    return similarity / denominator

其他提示

如果您的目标是将矩阵转换为一个数字(您的相似性度量),则可能需要使用 矩阵标准.

例如,使用 Frobenius Norm 在您的示例上,将返回1.488086。

我认为您的目标是找到两个文档的相似之处,如果是这种情况,我建议按照算法进行应用:

这种方法给出了WRT doc2有多少相似的DOC1。 (如果不是正方形矩阵,则doc2 wrt doc1的相似性值将有所不同)

  1. 在DOC1和DOC2之间的矩阵中,按行获得最大相似性值。
    1. 以总和除以行数
    2. 这将为您提供相似性索引。例如。在您的矩阵图像中,我看到最大相似性逐行是:0.88,1,0.6 so(0.88 + 1 + 1 + 0.6)/3 = 82.67%

这表示 DOC2与DOC1相似82.67%. 。当我们在每行中选择最大相似项目时,相似性不能超出此值。

许可以下: CC-BY-SA归因
scroll top