Spark 为 HashingTF 使用什么哈希函数,我如何复制它?

What hashing function does Spark use for HashingTF and how do I duplicate it?

Spark MLLIb 有一个 HashingTF() 函数,可以根据每个术语的散列值计算文档术语频率。

1) 它使用什么函数进行散列?

2) 如何从 Python 获得相同的散列值?

3) 如果我想计算给定单个输入的哈希输出,而不计算词频,我该怎么做?

如果您有疑问,检查 the source 通常是好的。给定术语的存储桶确定如下:

def indexOf(self, term):
    """ Returns the index of the input term. """
    return hash(term) % self.numFeatures

如您所见,它只是一个普通的旧 hash 桶模块数。

最终哈希只是每个桶的计数向量(为简洁起见,我省略了文档字符串和 RDD 大小写):

def transform(self, document):
    freq = {}
    for term in document:
        i = self.indexOf(term)
        freq[i] = freq.get(i, 0) + 1.0
    return Vectors.sparse(self.numFeatures, freq.items())

如果你想忽略频率,那么你可以使用 set(document) 作为输入,但我怀疑这里有很多收获。要创建 set,您无论如何都必须为每个元素计算 hash

在我看来,除了 zero323 链接的源之外,还有其他事情在发生。我发现散列然后像源代码那样做模数不会给我与 hashingTF 生成的索引相同的索引。至少对于单个字符,我要做的是将 char 转换为 ascii 代码,如下所示:(Python 2.7)

index = ord('a') # 97

这对应于索引的 hashingtf 输出。如果我做了和 hashingtf 似乎做的一样的事情,那就是:

index = hash('a') % 1<<20 # 897504

我会很清楚地得到错误的索引。