计算成对simhash“距离”

时间:2013-08-30 00:48:47

标签: python scikit-learn simhash

我想构建成对距离矩阵,其中“距离”是实现here的两个字符串之间的相似性得分。我正在考虑使用sci-kit learn的成对距离方法来实现这一点,因为我之前已经将它用于其他计算,并且很容易并行化。

以下是相关的代码:

def hashdistance(str1, str2):
    hash1 = simhash(str1)
    hash2 = simhash(str2)

    distance = 1 - hash1.similarity(hash2)

    return distance   


strings = [d['string'] for d in data]
distance_matrix = pairwise_distances(strings, metric = lambda u,v: hashdistance(u, v))

strings看起来像['foo', 'bar', 'baz']

当我尝试此操作时,它会抛出错误ValueError: could not convert string to float。这可能是一个非常愚蠢的说法,但我不确定为什么转换需要在这里发生,以及为什么它会抛出这个错误:metric中的匿名函数可以接受字符串并返回一个浮点数;为什么输入需要浮点数,如何根据simhash'距离'创建这种成对距离矩阵?

1 个答案:

答案 0 :(得分:4)

根据the documentation,只允许来自scipy.spatial.distance的指标,或者来自:{/ p>

In [26]: sklearn.metrics.pairwise.pairwise_distance_functions
Out[26]:
{'cityblock': <function sklearn.metrics.pairwise.manhattan_distances>,
 'euclidean': <function sklearn.metrics.pairwise.euclidean_distances>,
 'l1': <function sklearn.metrics.pairwise.manhattan_distances>,
 'l2': <function sklearn.metrics.pairwise.euclidean_distances>,
 'manhattan': <function sklearn.metrics.pairwise.manhattan_distances>}

一个问题是如果metriccallable,那么sklearn.metrics.pairwise.check_pairwise_arrays会尝试将输入转换为浮动,(scipy.spatial.distance.pdist会做类似的事情,所以你运气不好因此,你的错误。

即使你可以传递一个可调用的,它也不会很好地扩展,因为pairwise_distances中的循环是纯Python。看起来你必须自己编写循环。我建议您阅读pdist和/或pairwise_distances的源代码,以获取有关如何执行此操作的提示。