【问题标题】:What hashing function does Spark use for HashingTF and how do I duplicate it?Spark 对 HashingTF 使用什么散列函数以及如何复制它?
【发布时间】:2015-10-10 23:20:44
【问题描述】:

Spark MLLIb 有一个 HashingTF() 函数,它根据每个词条的哈希值计算文档词条频率。

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

2) 如何从 Python 中获得相同的哈希值?

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

【问题讨论】:

  • 我不确定我是否理解您所说的“给定单个输入的散列输出,而不计算术语频率”。你的意思是像 set(document) 计算哈希?
  • 是的,给定一个字符串 S,我想要一种快速的方法来找到哈希 (S) 值,而无需在 Spark 中实例化和使用 HashingTF() 函数。

标签: python hash apache-spark pyspark apache-spark-mllib


【解决方案1】:

如果您有疑问,最好查看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 是用 Java 实现的。谢谢!
  • MLlib 中的大部分功能都是原生实现的,并且对原生数据结构进行操作。例如Vectors 只是numpu.ndarray 的包装器。
  • 有趣的答案。我想找出哪个术语对应于给定的哈希(我正在运行 TF-IDF,然后不想找出最重要的术语)。它返回 (hash, tfidf) 元组,知道我怎么能得到 (term, tfidf) 吗?
  • @pltrdy 你不能,或者至少在一般情况下不能。如果您想要可逆转换,请查看计数矢量化器。请参阅我对stackoverflow.com/a/32286619/1560062的回复
【解决方案2】:

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

index = ord('a') # 97

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

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

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

【讨论】:

  • Operator precedence: assert HashingTF(numFeatures=1 &lt;&lt; 20).indexOf("a") == (hash("a") % (1 &lt;&lt; 20)).
猜你喜欢
  • 1970-01-01
  • 2016-11-25
  • 2014-03-30
  • 1970-01-01
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 2019-04-22
  • 1970-01-01
相关资源
最近更新 更多