スコア文字列の類似性


8

大量のドキュメントがあり、大量のキーと値のペアが含まれています。キーは一意ではない可能性があるため、値が異なる同じタイプのキーが複数存在する可能性があります。

2つのドキュメント間のキーの類似性を比較したい。より具体的には、これらの値の文字列の類似性。類似性を比較するために、スミス-ウォーターマンアルゴリズムのようなものを使用することを考えています。

それで、データを表現することについて私がどのように考えているかを描いた-

ここに画像の説明を入力してください

セルの値は、smith-watermanアルゴリズム(またはその他の文字列類似性メトリック)の結果です。

このマトリックスが「もの」の主要なタイプを表しているというイメージ次に、「もの」の類似度スコアを0または1のベクトルに追加する必要があります。

私が理解できないのは、マトリックスが似ているか似ていないかを判断する方法です-理想的には、マトリックスを0と1の間の数値に変換し、しきい値を設定して0または1。

マトリックスのスコアを作成する方法はありますか?この種のことを行うアルゴリズムを知っている人はいますか?


2
最初に似ていると考えるマトリックスの例を示し、類似性の観点から探している品質を説明すると、質問に答えるのが簡単になる場合があります。または、ここに一般的な目標がある場合、あなたが達成することを意味するタスクは何ですか?
Air

ええ、私は1がどのように見え、0がどのように見えるかの例を見たいのですが。
ベン・

回答:


2

私が理解したように、ドキュメント1とドキュメント2のキーの数は異なる場合があります。そして、あなたは0と1の間の最終的な類似性評価を得たいと思っています。もしそうなら、私は以下のアルゴリズムを提案します:

  1. 最大の合計 valsは0です。
  2. doc-docマトリックスから最大値を選択し、それをSum of maxに追加します。値。
  3. 最大値を持つ行と列を行列から削除します。
  4. 行または列が終了するまで、手順2〜3を繰り返します。
  5. 最大の合計を指定します。2つのテキストのキーワードの平均数による値。

両方のドキュメントが同じ長さで、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
}

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

これは、0と1の間の数値のスケーリングを除いて、かなりうまく機能しているようです。Pythonのバージョンが意図したとおりかどうかわかりませんか?
David

私はあなたのpythonバージョンを簡略化しました。そして、スケーリングの何が問題になっていますか?元の行列のすべての値が0と1の間であると仮定すると、結果も同じスケールでなければなりません。
sobach 2014年

スケーリングに問題はありません...コードにバグがあったに違いありません。これが私のデータセットでうまく機能してくれてありがとう
David


0

あなたの目標は、2つのドキュメントがどのように類似しているかを見つけることだと思います。

このアプローチでは、Doc1とDoc2の類似性がどれだけあるかがわかります。(正方行列でない場合、Doc2 wrt Doc1の類似度の値は異なります)

  1. Doc1とDoc2の間のマトリックスで、行ごとに最大類似値を取得します。
    1. 合計を取り、行数で割ります
    2. これにより、類似性インデックスが得られます。たとえば あなたのマトリックス画像では、行ごとの最大の類似性が0.88、1、0.6なので、(0.88 + 1 + 0.6)/ 3 = 82.67%であることがわかります。

つまり、Doc2は82.67%がDoc1と似ています。各行で最大の類似アイテムを選択したため、類似性はこの値を超えることはできません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.