Spark对HashingTF使用什么散列函数以及如何复制它?

时间:2015-07-21 13:17:38

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

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

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

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

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

2 个答案:

答案 0 :(得分:6)

如果您有疑问,通常可以查看the source。给定术语的桶确定如下:

function refreshTable(){

console.log("Starting Pivot Table Population");

//ajax start
$.get(
    "table.php",
    function(data){

        //loop through the data and feed to the pivotUI
        var info = [];
        for (var ii=0; ii < array.length; ii++) {
            info.push({
                Skill: array[ii][0],
                Users: array[ii][3],
                IOT: array[ii][1],
                IMT: array[ii][2],
                Level: array[ii][4]});
        }
        console.log(info);

        //pivot UI
        $('#output').show();
        $("#output").pivotUI(
            info,
            {
                rows: ["Row","Users"],
                cols: ["Col1","Col2","Col3"]
            }
        );
     }

        //end of ajax function "TYPE"
        , "json")
};

正如您所看到的,它只是一个普通的def indexOf(self, term): """ Returns the index of the input term. """ return hash(term) % self.numFeatures 模块桶数。

最终哈希只是每个桶的计数向量(为简洁起见,我省略了docstring和RDD的情况):

hash

如果你想忽略频率,你可以使用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

答案 1 :(得分:0)

在我看来,除了零连接的来源之外,还有其他一些东西在引擎盖下。我发现散列然后执行模数,因为源代码确实不会给我与hashingTF生成的索引相同的索引。至少对于单个字符,我必须做的是将char转换为ascii代码,如下所示:(Python 2.7)

index = ord('a') # 97

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

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

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