2015-07-21 10 views
3

Spark MLLIb具有HashingTF()函数,该函数根据每个术语的哈希值计算文档术语频率。Spark用于HashingTF的哈希函数是什么?如何复制它?

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

2)如何从Python获得相同的哈希值? 3)如果我想计算给定单个输入的散列输出,而不计算术语频率,我该怎么做?

+0

我不知道我是否明白你的意思是“给定单输入的散列输出,而不计算术语频率”。你的意思是像'set(document)'计算散列吗? – zero323

+0

是的,给定一个字符串S,我想快速找到散列(S)值,而无需在Spark中实例化和使用HashingTF()函数。 – gallamine

回答

6

如果你有疑问通常是检查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

+0

谢谢Zero323。我想我的印象是HashingTF是用Java实现的。谢谢! – gallamine

+0

MLlib中的大部分函数都是本地实现的,并在原生数据结构上运行。例如'Vectors'只是'numpu.ndarray'的包装。 – zero323

+0

有趣的anwser。我想找到哪个术语对应于给定的散列(我正在运行TF-IDF,因此不想查找最重要的术语)。 它返回(哈希,tfidf)元组,任何想法我可以得到(术语,tfidf)? – pltrdy

0

在我看来,除了zero323链接的源之外,还有其他的内幕正在发生。我发现散列,然后做源代码做模数不会给我与hashingTF生成相同的指数。至少对于单个字符,我所要做的就是炭转换为ASCII代码,像这样:(Python 2.7版)

index = ord('a') # 97 

相当于什么hashingtf产出的指数。如果我做了与hashingtf似乎做同样的事情,这是:

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

我会得到非常清楚的错误索引。

+0

[运算符优先级](https://docs.python.org/3/reference/expressions.html#operator-precedence ):'assert HashingTF(numFeatures = 1 << 20).indexOf(“a”)==(hash(“a”)%(1 << 20))''。 – user7337271