Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 你能推荐一个好的minhash实现吗?_Python_Hash_Minhash - Fatal编程技术网

Python 你能推荐一个好的minhash实现吗?

Python 你能推荐一个好的minhash实现吗?,python,hash,minhash,Python,Hash,Minhash,我正试图寻找一个minhash开源实现,我可以利用它来完成我的工作 我需要的功能非常简单,给定一个集合作为输入,实现应该返回其minhash 最好使用python或C实现,以防我需要破解它来为自己工作 任何指点都会大有帮助 注意。您应该依次查看以下开源库。它们都是Python语言,并展示了如何使用LSH/MinHash计算文档相似性: 我建议你,特别是如果你需要坚持的话。在这里,您可以使用redis存储/检索所有数据 您可以选择一个redis数据库,或者简单地使用内置的内存python字典

我正试图寻找一个minhash开源实现,我可以利用它来完成我的工作

我需要的功能非常简单,给定一个集合作为输入,实现应该返回其minhash

最好使用python或C实现,以防我需要破解它来为自己工作

任何指点都会大有帮助


注意。

您应该依次查看以下开源库。它们都是Python语言,并展示了如何使用LSH/MinHash计算文档相似性:




我建议你,特别是如果你需要坚持的话。在这里,您可以使用redis存储/检索所有数据

您可以选择一个redis数据库,或者简单地使用内置的内存python字典

使用redis的性能,至少在本地机器上运行redis服务器的情况下,与通过标准python字典实现的性能几乎相同

您只需要指定一个配置字典,例如

config = {"redis": {"host": 'localhost', "port": '6739', "db": 0}}

并将其作为参数传递给
LSHash
类构造函数。它支持序列化和合并。它是用纯python实现的,没有外部依赖关系。具有完全相同的功能。

如果您对研究minhash算法感兴趣,下面是一个非常简单的实现,并进行了一些讨论

为了生成集合的MinHash签名,我们创建一个长度为
$N$
的向量,其中所有值都设置为正无穷大。我们还创建了
$N$
函数,这些函数接受输入整数并排列该值。
$i^{th}$
函数将单独负责更新向量中的
$i^{th}$
值。给定这些值,我们可以通过将集合中的每个值传递给每个
$N$
置换函数来计算集合的minhash签名。如果
$i^{th}$
置换函数的输出低于向量的
$i^{th}$
值,我们用置换函数的输出替换该值(这就是散列被称为“最小散列”的原因)。让我们用Python实现这一点:

from scipy.spatial.distance import cosine
from random import randint
import numpy as np

# specify the length of each minhash vector
N = 128
max_val = (2**32)-1

# create N tuples that will serve as permutation functions
# these permutation values are used to hash all input sets
perms = [ (randint(0,max_val), randint(0,max_val)) for i in range(N)]

# initialize a sample minhash vector of length N
# each record will be represented by its own vec
vec = [float('inf') for i in range(N)]

def minhash(s, prime=4294967311):
  '''
  Given a set `s`, pass each member of the set through all permutation
  functions, and set the `ith` position of `vec` to the `ith` permutation
  function's output if that output is smaller than `vec[i]`.
  '''
  # initialize a minhash of length N with positive infinity values
  vec = [float('inf') for i in range(N)]

  for val in s:

    # ensure s is composed of integers
    if not isinstance(val, int): val = hash(val)

    # loop over each "permutation function"
    for perm_idx, perm_vals in enumerate(perms):
      a, b = perm_vals

      # pass `val` through the `ith` permutation function
      output = (a * val + b) % prime

      # conditionally update the `ith` value of vec
      if vec[perm_idx] > output:
        vec[perm_idx] = output

  # the returned vector represents the minimum hash of the set s
  return vec
就这些!为了演示如何使用此实现,让我们仅举一个简单的示例:

import numpy as np

# specify some input sets
data1 = set(['minhash', 'is', 'a', 'probabilistic', 'data', 'structure', 'for',
        'estimating', 'the', 'similarity', 'between', 'datasets'])
data2 = set(['minhash', 'is', 'a', 'probability', 'data', 'structure', 'for',
        'estimating', 'the', 'similarity', 'between', 'documents'])

# get the minhash vectors for each input set
vec1 = minhash(data1)
vec2 = minhash(data2)

# divide both vectors by their max values to scale values {0:1}
vec1 = np.array(vec1) / max(vec1)
vec2 = np.array(vec2) / max(vec2)

# measure the similarity between the vectors using cosine similarity
print( ' * similarity:', 1 - cosine(vec1, vec2) )
这将返回0.9作为这些向量之间相似性的度量

虽然我们只比较上面的两个minhash向量,但通过使用“位置敏感散列”,我们可以更简单地比较它们。为此,我们可以构建一个字典,将$W$MinHash向量组件的每个序列映射到构建MinHash向量的集合的唯一标识符。例如,如果
W=4
并且我们有一个集
S1
,我们从中派生出一个MinHash向量
[111512736927817…]
,我们会将
S1
标识符添加到该向量中四个MinHash值的每个序列中:

d[111-512-736-927].append('S1')
d[512-736-927-817].append('S1')
...

一旦我们对所有集合都这样做,我们就可以检查字典中的每个键,如果该键有多个不同的集合id,我们有理由相信这些集合是相似的。事实上,字典中单个值中出现一对集合id的次数越多,两个集合之间的相似性就越大。以这种方式处理数据,我们可以将识别所有相似集合对的复杂性降低到大致线性时间

谢谢@ekzhu。Datasketch看起来是解决我所遇到的哈希问题的最佳选择,当时我正在考虑Ugh,但只有Python2.7支持。ekzhu编写的Datasketch现在也支持Redis后端