レーベンシュタインなどの文字列距離メトリックでbk-treeを使用してみることができます。http ://blog.notdot.net/2007/4/Damn-Cool-Algorithms-Part-1-BK-Treesも参照してください。
編集:
距離メトリックを発明するのは難しいですが、情報の違いに基づく構造エントロピー距離と呼ばれる、使用できるものをたまたま知っています。次のように機能します。
x="ElvisPr"とy="ElvisAaronPresley"の2つの文字列を取ります
ユニグラムとバイグラムの多重集合を作成するたびに、次のようになります。
x = {e, l, v, i, s, _, p, r, el, lv, vi, is, s_, _p, pr}
y = {ex3, lx2, v, i, sx2, _x2, ax2, rx2, o, n, p, y, el, lv, vi, is, s_, _a, aa, ar, ro, on, n_, _p, pr, re, es, sl, le, ey}
今両方にあるそれらの用語のために
{e, l, v, i, s, _, p, r, el, lv, vi, is, s_, _p, pr}
製品を計算する(f_x(t) / (f_x(t) + f_y(t)))^{f_x(t)/2} * (f_y(t) / (f_x(t) + f_y(t)))^{f_y(t)/2}
ので
e = ((1/15) / (1/15 + 3/37))^(1/30) * ((3/37) / (1/15 + 3/37))^(3/74)
l = ((1/15) / (1/15 + 2/37))^(1/30) * ((2/37) / (1/15 + 2/37))^(2/74)
v = ((1/15) / (1/15 + 1/37))^(1/30) * ((1/37) / (1/15 + 1/37))^(1/74)
i = ((1/15) / (1/15 + 1/37))^(1/30) * ((1/37) / (1/15 + 1/37))^(1/74)
s = ((1/15) / (1/15 + 2/37))^(1/30) * ((2/37) / (1/15 + 2/37))^(2/74)
_ = ((1/15) / (1/15 + 2/37))^(1/30) * ((2/37) / (1/15 + 2/37))^(2/74)
p = ((1/15) / (1/15 + 1/37))^(1/30) * ((1/37) / (1/15 + 1/37))^(1/74)
r = ((1/15) / (1/15 + 2/37))^(1/30) * ((2/37) / (1/15 + 2/37))^(2/74)
el = ((1/15) / (1/15 + 1/37))^(1/30) * ((1/37) / (1/15 + 1/37))^(1/74)
lv = ((1/15) / (1/15 + 1/37))^(1/30) * ((1/37) / (1/15 + 1/37))^(1/74)
vi = ((1/15) / (1/15 + 1/37))^(1/30) * ((1/37) / (1/15 + 1/37))^(1/74)
is = ((1/15) / (1/15 + 1/37))^(1/30) * ((1/37) / (1/15 + 1/37))^(1/74)
s_ = ((1/15) / (1/15 + 1/37))^(1/30) * ((1/37) / (1/15 + 1/37))^(1/74)
_p = ((1/15) / (1/15 + 1/37))^(1/30) * ((1/37) / (1/15 + 1/37))^(1/74)
pr = ((1/15) / (1/15 + 1/37))^(1/30) * ((1/37) / (1/15 + 1/37))^(1/74)
これらすべてを掛け合わせると、[0.5、1]の範囲の数値が得られるはずです。これにより、2を掛けて1を引くことにより、これを[0,1]の範囲にさらに便利にスケーリングできます。
ただし、これは離散距離メトリックではないため、 vpツリーなどの別のメトリックインデックスを使用する必要があります