それぞれがテキスト要素と数値要素の両方を含む一連のベクトルがあります。そのようなベクトルの類似性測定と、可能であれば実装されたフレームワークを探しています。どんな助けでも大歓迎です。
2 に答える
私にとって、これは適切な類似性指標を見つけることではなく、データ モデリングの問題です。
たとえば、ユークリッド距離を使用できます。
データの再スケーリング (例: 平均中心 & 単位分散); と
「テキスト」要素を再コード化します(これは、男性と女性の値を持つ性別を格納するフィールドなどの個別の変数を意味すると仮定します)
たとえば、それぞれが 4 つの特徴 (列またはフィールド) を持つデータ ベクトルで構成されるデータセットを想像してください。
minutes_per_session, sessions_per_week, registered_user, sex
最初の 2 つは連続 (別名「数値」) 変数です。つまり、適切な値は 12.5、4.7 などです。
2 番目の 2 つは離散的であり、明らかに変換が必要です。
ステップ 1: 離散変数の記録
一般的な手法は、各個別の特徴を一連の特徴に再コード化することです。これは、その特徴について記録された値ごとに 1 つの特徴です (各特徴には元の特徴の値の名前が付けられます)。
したがって、性別には 2 つの可能な値があるため、各ユーザーの性別を格納する 1 つの列は M と F の値を持つ可能性があり、2 つの特徴 (フィールドまたは列) に変換されます。
したがって、ユーザーの性別の値の列:
['M']
['M']
['F']
['M']
['M']
['F']
['F']
['M']
['M']
['M']
2列になる
[1, 0]
[1, 0]
[0, 1]
[1, 0]
[1, 0]
[0, 1]
[0, 1]
[1, 0]
[1, 0]
[1, 0]
ステップ 2: データの再スケーリング (例: 平均中心および単位分散)
合成データ用にランダムに生成された 2D 配列:
array([[ 3., 5., 2., 4.],
[ 9., 2., 0., 8.],
[ 5., 1., 8., 0.],
[ 9., 9., 7., 4.],
[ 3., 1., 6., 2.]])
for each column: calculate the mean
then subtract the mean from each value in that column:
>>> A -= A.mean(axis=0)
>>> A
array([[-2.8, 1.4, -2.6, 0.4],
[ 3.2, -1.6, -4.6, 4.4],
[-0.8, -2.6, 3.4, -3.6],
[ 3.2, 5.4, 2.4, 0.4],
[-2.8, -2.6, 1.4, -1.6]])
for each column:now calculate the *standard deviation*
then divide each value in that column by this std:
>>> A /= A.std(axis=0)
verify:
>>> A.mean(axis=0)
array([ 0., -0., 0., -0.])
>>> A.std(axis=0)
array([ 1., 1., 1., 1.])
そのため、4 つの列で構成されていた元の配列は 6 つになりました。ペアごとの類似性は、次のようにユークリッド距離で測定できます。
take the first data vectors (rows):
>>> v1, v2 = A1[:2,:]
2 特徴空間のユークリッド距離:
dist = ( (x2 - x1)**2 + (y2 - y1)**2 )**0.5
>>> sm = NP.sum((v2 - v1)**2)**.5
>>> sm
3.79
テキスト データの優れたメトリックは、別の文字列を取得するために文字列を変更する必要がある量をカウントするレーベンシュタイン距離(または編集距離) です。計算量が少ない方法として、同様のメトリックを提供するハミング距離がありますが、文字列は同じサイズである必要があります。文字をASCII表現に変換しても、関連する結果が得られる可能性は低いです(または、アプリケーションと距離の使用に依存します):「Z」は「S」または「A」に近いですか?
数値データのユークリッド距離と組み合わせると (それらがユークリッド平面にあると予想される場合... 地球上の座標や角度などを表す場合はそうではない可能性があります)、すべての二乗を合計して重み付けできます。最終メトリックを取得するための距離。たとえば、d(A,B) = sqrt( weight1*Levenshtein(textA, textB)^2 + weight2*Euclidean(numericA, numericB)^2) を取得します。
ここで、そのような重みを設定する方法について問題が発生します。たとえば、キロメートル単位の小さな数値データを測定していて、非常に長い文字列で編集距離を計算する場合、数値データはほとんど無関係になるため、それらをさらに重み付けする必要があります。これはドメイン固有であり、データとアプリケーションに応じてそのような重みを選択できるのはあなただけです。
最後に、すべては、指定しなかったアプリケーションと、それらが表すものについて言及しなかったデータに依存します。アプリケーションは加速構造を構築することができます-そのような場合、あまりにも愚かではないメトリックが機能する可能性があります(文字をASCII番号に変換することを含む); または、データベースにクエリを実行したり、これらのポイントを表示したりすることが重要になる場合があります。データの場合、数値データは平面または地球上の座標を表すことができ (これにより測定基準が変化します)、テキスト データは、他の文字とどれだけ似ているかを確認したい単一の文字、または完全な文字である可能性があります。別のテキストと数文字ずれている可能性のあるテキスト...もっと正確にしないと、見分けるのは困難です。