Similaridade da string da matriz de pontuação


8

Eu tenho uma carga de documentos, que possuem uma carga de pares de valores-chave. A chave pode não ser exclusiva, portanto, pode haver várias chaves do mesmo tipo com valores diferentes.

Quero comparar a semelhança das chaves entre dois documentos. Mais especificamente, a semelhança de string desses valores. Estou pensando em usar algo como o algoritmo Smith-Waterman para comparar a semelhança.

Então, desenhei uma imagem de como estou pensando em representar os dados -

insira a descrição da imagem aqui

Os valores nas células são o resultado do algoritmo smith-waterman (ou alguma outra métrica de similaridade de string).

Imagem de que essa matriz representa um tipo-chave de "coisas", preciso adicionar a pontuação de similaridade "coisas" em um vetor de 0 ou 1. Está tudo bem.

O que não consigo descobrir é como determino se a matriz é semelhante ou não - idealmente, quero converter a matriz em um número entre 0 e 1 e depois definirei um limite para pontuá-la como 0 ou 1

Alguma idéia de como posso criar uma pontuação da matriz? Alguém conhece algum algoritmo que faça esse tipo de coisa (obviamente, coisas como o smith waterman funciona são aplicáveis).


2
Pode ser mais fácil responder à sua pergunta se você desse um exemplo de matriz que consideraria semelhante ao primeiro e explicasse quais as qualidades que procura em termos de semelhança. Ou, se houver um objetivo geral aqui, qual é a tarefa que você pretende realizar?
Air

Sim, eu gostaria de ver um exemplo de como seria um 1 e como seria um 0.
Ben

Respostas:


2

Pelo que entendi, o Documento 1 e o Documento 2 podem ter um número diferente de chaves. E você deseja obter uma avaliação final da similaridade entre 0 e 1. Se sim, proponho o seguinte algoritmo:

  1. Soma do max. vals é igual a 0.
  2. Selecione o valor máximo da matriz doc-doc e adicione-o à Soma do lance máx. vals.
  3. Remova a linha e a coluna com o valor máximo da matriz.
  4. Repita as etapas 2 a 3 até que as linhas ou colunas sejam finalizadas.
  5. Soma denominada de máx. valores pelo número médio de palavras-chave em dois textos.

A estimativa final seria igual a 1, se os dois documentos tiverem comprimento idêntico e todas as palavras do Doc 1 tiverem equivalente no Doc 2.

Você não mencionou o software, está usando, mas aqui está um exemplo de função R , computando essa semelhança (ela toma como objeto a matriz de classes 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
}

Em 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

Isso parece funcionar muito bem, exceto a escala dos números entre 0 e 1. Não tem certeza se a versão python é como pretendida?
David

Eu simplifiquei sua versão do python. E o que há de errado com a escala? Supondo que todos os valores na matriz original estejam entre 0 e 1, o resultado também deve ter a mesma escala.
sobach

Nada está errado com a escala agora ... Eu devo ter tido um bug no meu código. Obrigado pela ajuda Isso funciona muito bem no meu conjunto de dados
David

2

Se seu objetivo é transformar sua matriz em um número (sua medida de similaridade), convém usar uma norma de matriz .

Por exemplo, o uso da norma Frobenius no seu exemplo retornaria 1.488086.


É verdade que eu tinha esquecido as normas, vou olhar para isso, obrigado.
David

0

Acho que seu objetivo é descobrir como dois documentos são semelhantes, se esse for o caso, sugiro aplicar o seguinte algoritmo:

Essa abordagem fornece o grau de Doc1 semelhante ao Doc2. (Os valores de similaridade serão diferentes para Doc2 e Doc1, se não for uma matriz quadrada)

  1. Na sua matriz entre Doc1 e Doc2, obtenha o valor máximo de similaridade linha por linha.
    1. Pegue a soma e divida pelo número de linhas
    2. Isso fornecerá o índice de similaridade. Por exemplo. Na imagem da matriz, vejo a semelhança máxima linha por linha é: 0,88, 1, 0,6 Então (0,88 + 1 + 0,6) / 3 = 82,67%

Isso significa que o Doc2 é 82,67% semelhante ao Doc1 . A similaridade não pode ir além desse valor, pois selecionamos o máximo de itens semelhantes em cada linha.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.