Spark MLLIb具有HashingTF()函数,该函数根据每个术语的散列值计算文档术语频率。
1)它使用什么函数进行散列?
2)如何从Python获得相同的散列值?
3)如果我想计算给定单个输入的散列输出,而不计算术语频率,我该怎么做?
答案 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
我会非常清楚地得到错误的索引。