Spark MLLIb具有HashingTF()函数,该函数根据每个术语的哈希值计算文档术语频率。Spark用于HashingTF的哈希函数是什么?如何复制它?
1)它使用什么函数做散列?
2)如何从Python获得相同的哈希值? 3)如果我想计算给定单个输入的散列输出,而不计算术语频率,我该怎么做?
Spark MLLIb具有HashingTF()函数,该函数根据每个术语的哈希值计算文档术语频率。Spark用于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生成相同的指数。至少对于单个字符,我所要做的就是炭转换为ASCII代码,像这样:(Python 2.7版)
index = ord('a') # 97
相当于什么hashingtf产出的指数。如果我做了与hashingtf似乎做同样的事情,这是:
index = hash('a') % 1<<20 # 897504
我会得到非常清楚的错误索引。
[运算符优先级](https://docs.python.org/3/reference/expressions.html#operator-precedence ):'assert HashingTF(numFeatures = 1 << 20).indexOf(“a”)==(hash(“a”)%(1 << 20))''。 – user7337271
我不知道我是否明白你的意思是“给定单输入的散列输出,而不计算术语频率”。你的意思是像'set(document)'计算散列吗? – zero323
是的,给定一个字符串S,我想快速找到散列(S)值,而无需在Spark中实例化和使用HashingTF()函数。 – gallamine