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
我会很清楚地得到错误的索引。
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
我会很清楚地得到错误的索引。