所以问题集合就像:
A = {'abc', 'abc', 'abd', 'bcde', 'acbdg', ...}
使用类似Levenshtein距离的string metric类型,它很简单,可以找到2种字符串之间字符串相似性的某种启发式方法。
但是,我想确定,在不评估集合中的所有字符串对(O(N ^ 2)问题),基于整个集合的某种类型的启发式,这让我对整体相似性有了一个很好的了解在所有字符串之间。
蛮力方法是:
Sum(Metric(All Pairs in A))
CollectionSimilarity(A) = ---------------------------
N*(N+1)/2
有没有办法在不评估每一对的情况下评估整个A集合的相似性?
答案 0 :(得分:0)
您总是可以使用一些近似值(例如,采样对)。根据N的大小,该值应与NlogN样本收敛。
答案 1 :(得分:0)
由于每个字符串都是某个度量空间中的向量(其中每个字符都是特定的坐标),我的解决方案是找到集合A
和某个点 P 之间的距离。
让我们看看一个指标的属性 - 三角不等式:
Distance(x, y) <= Distance(x, *P*) + Distance(y, *P*)
所以我们可以找到Sum(Distance(All pairs in A))
的上限|A| * Sum(Distance(All elements in A to point P)
:
Sum(Distance(x, y)) N * Sum(x, *P*) Sum(x, *P*)
---------------------- <= ----------------- = ------------
N*(N+1)/2 N*(N+1)/2 (N+1)/2
此点 P 可以是随机点或集合A
或空字符串(零点)或任何东西的质心(在这种情况下,您可以找到集合的平均半径)其他。一般来说, P 可以是任何超平面。无论如何,你会发现你的集合的某种平均半径(或直径)
也许一些线性预变换[集合或坐标系统,这是相同的]是好的。或者迭代多次,并在每次迭代时找到到新随机超平面的距离。
希望这可能有所帮助!