评分矩阵字符串相似度

数据挖掘 算法 相似
2021-09-24 09:22:32

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

我想比较两个文档之间键的相似性。更具体地说,这些值的字符串相似性。我正在考虑使用Smith-Waterman 算法之类的方法来比较相似性。

所以我画了一张我正在考虑如何表示数据的图片 -

在此处输入图像描述

单元格中的值是 smith-waterman 算法(或其他一些字符串相似性度量)的结果。

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

我不知道如何确定矩阵是否相似 - 理想情况下,我想将矩阵转换为 0 到 1 之间的数字,然后我只需设置一个阈值将其评分为 0 或1.

有什么想法可以创建矩阵的分数吗?有谁知道做这种事情的任何算法(显然,像史密斯沃特曼的工作原理这样的事情有点适用)。

3个回答

据我了解,文档 1 和文档 2 可能有不同数量的键。你想得到 0 和 1 之间的最终相似性评估。如果是这样,我会提出以下算法:

  1. 最大值之和 vals 等于 0。
  2. 从 doc-doc 矩阵中选择最大值并将其添加到最大值总和。瓦尔斯。
  3. 从矩阵中删除具有最大值的行和列。
  4. 重复步骤 2-3,直到行或列结束。
  5. 面额 最大值之和。vals 按两个文本中的平均关键字数计算。

如果两个文档的长度相同,并且 Doc 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
}

在蟒蛇 -

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

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

例如,在您的示例中使用Frobenius 范数将返回 1.488086。

我认为您的目标是找出两个文档的相似程度,如果是这种情况,我建议应用以下算法:

这种方法给出了 Doc1 与 Doc2 的相似程度。(如果不是方阵,Doc2 wrt Doc1 的相似度值会有所不同)

  1. 在 Doc1 和 Doc2 之间的矩阵中,逐行获取最大相似度值。
    1. 取总和除以行数
    2. 这将为您提供相似度指数。例如。在您的矩阵图像中,我看到最大相似性逐行是: 0.88 , 1, 0.6 所以 (0.88 + 1 + 0.6)/3 = 82.67%

这意味着Doc2 与 Doc1 有 82.67% 的相似性相似度不能超过这个值,因为我们在每一行中选择了最大相似项。