【问题标题】:calculate pairwise simhash "distances"计算成对的simhash“距离”
【发布时间】:2013-09-02 14:39:24
【问题描述】:

我想构造一个成对的距离矩阵,其中“距离”是两个字符串之间的相似度分数,如实现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 'distances' 创建这个成对距离矩阵?

【问题讨论】:

    标签: python scikit-learn simhash


    【解决方案1】:

    根据the documentation,仅允许来自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>}
    

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

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

    【讨论】:

      猜你喜欢
      • 2016-04-06
      • 2014-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-14
      • 2018-02-25
      • 2017-06-03
      • 1970-01-01
      相关资源
      最近更新 更多