在不评估所有元素对的情况下查找字符串集合中的元素相似性

时间:2015-01-12 21:02:22

标签: algorithm heuristics string-metric

所以问题集合就像:

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集合的相似性?

2 个答案:

答案 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 可以是任何超平面。无论如何,你会发现你的集合的某种平均半径(或直径) 也许一些线性预变换[集合或坐标系统,这是相同的]是好的。或者迭代多次,并在每次迭代时找到到新随机超平面的距离。

希望这可能有所帮助!