Matriz de puntuación de similitud de cadena

8

Tengo una carga de documentos, que tienen una carga de pares de valores clave en ellos. Es posible que la clave no sea única, por lo que puede haber varias claves del mismo tipo con valores diferentes.

Quiero comparar la similitud de las claves entre 2 documentos. Más específicamente, la similitud de cadena de estos valores. Estoy pensando en usar algo como el algoritmo Smith-Waterman para comparar la similitud.

Así que dibujé cómo estoy pensando en representar los datos:

ingrese la descripción de la imagen aquí

Los valores en las celdas son el resultado del algoritmo smith-waterman (o alguna otra métrica de similitud de cadenas).

Imagen de que esta matriz representa un tipo clave de "cosas". Luego necesito agregar el puntaje de similitud de "cosas" en un vector de 0 o 1. Eso está bien.

Lo que no puedo entender es cómo determino si la matriz es similar o no, idealmente quiero convertir la matriz a un número entre 0 y 1 y luego estableceré un umbral para calificarla como 0 o 1)

¿Alguna idea de cómo puedo crear una puntuación de la matriz? ¿Alguien sabe algún algoritmo que haga este tipo de cosas (obviamente, cosas como cómo funciona Smith Waterman es más o menos aplicable).

David
fuente
2
Puede ser más fácil responder a su pregunta si da un ejemplo de una matriz que consideraría similar a la primera, y explica qué cualidades está buscando en términos de similitud. O si hay un objetivo general aquí, ¿cuál es la tarea que quieres lograr?
Aire
Sí, me gustaría ver un ejemplo de cómo se vería un 1 y cómo se vería un 0.
Ben

Respuestas:

2

Como entendí, el Documento 1 y el Documento 2 pueden tener diferentes números de claves. Y desea obtener una evaluación final de similitud entre 0 y 1. Si es así, propondría el siguiente algoritmo:

  1. Suma de máx. vals es igual a 0.
  2. Seleccione el valor máximo de la matriz doc-doc y agréguelo a la suma de máx. vals
  3. Elimine la fila y la columna con el valor máximo de la matriz.
  4. Repita los pasos 2-3 hasta que finalicen las filas o columnas.
  5. Denominar Suma de máx. vals por número promedio de palabras clave en dos textos.

La estimación final sería igual a 1, si ambos documentos tienen una longitud idéntica, y cada palabra del Doc 1 tiene equivalente en el Doc 2.

No ha mencionado el software que está utilizando, pero aquí hay un ejemplo de función R , que calcula tal similitud (toma el objeto de la matriz de clase como entrada):

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
}

En 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
Sobach
fuente
Esto parece funcionar bastante bien, excepto la escala de los números entre 0 y 1. ¿No está seguro de si la versión de Python es la prevista?
David
Simplifiqué tu versión de Python. ¿Y qué tiene de malo escalar? Suponiendo que todos los valores en la matriz original están entre 0 y 1, el resultado también debe ser de la misma escala.
sobach
Ahora no hay nada malo con la escala ... Debo haber tenido un error en mi código. Gracias por la ayuda, esto funciona muy bien en mi conjunto de datos
David
2

Si su objetivo es transformar su matriz en un número (su medida de similitud), es posible que desee utilizar una norma de matriz .

Por ejemplo, usar la norma Frobenius en su ejemplo devolvería 1.488086.

merours
fuente
Es cierto, me había olvidado de las normas, investigaré esto gracias.
David
0

Creo que su objetivo es encontrar cuán similares son dos documentos, si ese es el caso, sugiero aplicar el siguiente algoritmo:

Este enfoque proporciona cuánto Doc1 similar es wrt Doc2. (Los valores de similitud serán diferentes para Doc2 wrt Doc1 si no es una matriz cuadrada)

  1. En su matriz entre Doc1 y Doc2, obtenga el valor máximo de similitud fila por fila.
    1. Toma la suma y divide por número de filas
    2. Esto te dará el índice de similitud. Por ej. En su imagen matricial, veo que la máxima similitud fila por fila es: 0.88, 1, 0.6 Entonces (0.88 + 1 + 0.6) / 3 = 82.67%

Esto significa que Doc2 es 82.67% similar a Doc1 . La similitud no puede ir más allá de este valor, ya que seleccionamos un máximo de elementos similares en cada fila.

Shravan Shetty
fuente