我想构建一个成对的距离矩阵,其中"距离"是这里实现的两个字符串之间的相似性分数。我想用sci-kit-stear的成对距离方法来做这件事,就像我以前在其他计算中使用过的那样,简单的并行化非常好。
以下是相关代码:
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"距离"创建这个成对的距离矩阵?
根据文档,只允许来自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>}
一个问题是,如果metric
是callable
,那么sklearn.metrics.pairwise.check_pairwise_arrays
会尝试将输入转换为float,(scipy.spatial.distance.pdist
也会做类似的事情,所以你运气不好)从而导致错误。
即使可以传递一个可调用的,它也不会很好地扩展,因为pairwise_distances
中的循环是纯Python的。看起来你只能自己写循环了。我建议阅读pdist
和/或pairwise_distances
的源代码,以了解如何做到这一点。