Python 计算成对simhash“;“距离”;

Python 计算成对simhash“;“距离”;,python,scikit-learn,simhash,Python,Scikit Learn,Simhash,我想构造一个成对距离矩阵,其中“距离”是实现的两个字符串之间的相似性分数。我在考虑使用sci kit learn的成对距离方法来实现这一点,因为我以前在其他计算中使用过它,而且简单的并行化非常好 以下是相关的代码: def hashdistance(str1, str2): hash1 = simhash(str1) hash2 = simhash(str2) distance = 1 - hash1.similarity(hash2) return dist

我想构造一个成对距离矩阵,其中“距离”是实现的两个字符串之间的相似性分数。我在考虑使用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))
字符串
看起来像
['foo','bar','baz']

当我尝试此操作时,它抛出错误
ValueError:无法将字符串转换为float
。这可能是一个非常愚蠢的说法,但我不确定为什么需要在这里进行转换,以及为什么它会抛出这个错误:
metric
中的匿名函数可以获取字符串并返回浮点;为什么输入需要浮动,我如何根据simhash“距离”创建此成对距离矩阵?

根据,仅允许使用来自
scipy.spatial.distance
的度量,或从以下位置调用:

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>}
[26]中的
:sklearn.metrics.pairwise.pairwise\u distance\u函数
出[26]:
{'cityblock':,
“欧几里得”:,
“l1”:,
“l2”:,
“曼哈顿”:
一个问题是,如果
metric
callable
,那么
sklearn.metrics.pairwise.check\u pairwise\u arrays
会尝试将输入转换为float,(
scipy.spatial.distance.pdist
会执行类似的操作,因此您在那里运气不佳)从而导致错误

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

根据,仅允许使用
scipy.spatial.distance
中的度量值,或从以下位置调用:

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>}
In[26]:sklearn.metrics.pairwise.pairwise\u distance\u函数
出[26]:
{'cityblock':,
“欧几里得”:,
“l1”:,
“l2”:,
“曼哈顿”:
一个问题是,如果
metric
callable
,那么
sklearn.metrics.pairwise.check\u pairwise\u arrays
会尝试将输入转换为float,(
scipy.spatial.distance.pdist
会执行类似的操作,因此您在那里运气不佳)从而导致错误

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