我正在关注Spark文档中的this example,以计算一堆文档的TF-IDF。 Spark使用散列技巧进行此计算,所以最后你会得到一个包含散列词和相应权重的Vector,但是......如何从散列中取回单词?
我是否真的需要对所有单词进行哈希并将它们保存在地图中以便以后迭代查找关键字?没有更有效的方法内置Spark?
提前致谢
答案 0 :(得分:5)
使用HashingTF将字符串转换为org.apache.spark.util.Utils.nonNegativeMod(int, int)中的哈希值会产生介于0和numFeatures
之间的正整数(默认为2 ^ 20)。
原始字符串丢失;无法将结果整数转换为输入字符串。
答案 1 :(得分:4)
您需要创建一个字典,将数据集中的所有标记映射为哈希值。但是,由于您正在使用散列技巧,因此可能存在哈希冲突,并且映射不是完全可逆的。
答案 2 :(得分:2)
如果使用CountVectorizer而不是HashingTF(TFIDF基本上是HashingTF变换和IDF拟合的套装),那么它可能更适合您的需要,因为您可以恢复索引词汇。
String[] vocabulary= countVectorizerModel.vocabulary();
让你知道如何找到它们;
例如,得到的SparseVector就像(11, [0,1,3] ,[1.0,...,其中[0,1,3]代表词汇术语的索引在相应的文本中遇到,然后您可以参考以下内容获取条款:
vocabulary[index]
如果您需要在LDA主题术语的上下文中,解决方案是相同的。