【问题标题】:Spark TF-IDF getting the words back from hashSpark TF-IDF 从哈希中获取单词
【发布时间】:2017-02-24 21:26:10
【问题描述】:

我正在关注 Spark 文档中的 this example,用于计算一堆文档的 TF-IDF。 Spark 使用散列技巧进行此计算,所以最后你会得到一个包含散列单词和相应权重的向量,但是......我怎样才能从散列中取回单词?

我真的必须对所有单词进行哈希处理并将它们保存在地图中以便以后遍历它以查找关键字吗?有没有更高效的方式内置 Spark?

提前致谢

【问题讨论】:

    标签: java hash apache-spark tf-idf


    【解决方案1】:

    使用org.apache.spark.util.Utils.nonNegativeMod(int, int)HashingTF 中的字符串转换为哈希值会产生一个介于0 和numFeatures 之间的正整数(默认为2^20)。

    原始字符串丢失;无法将结果整数转换为输入字符串。

    【讨论】:

    • “原始字符串丢失;无法将结果整数转换为输入字符串。” 请注意,对于任何好的哈希函数都是如此:它们'是故意单向的。
    • 加密散列函数是单向散列。标准散列函数对单向属性不感兴趣。例如,对于(非常)短的字符串,标准的 Java 字符串哈希很容易反转。目标通常是最小化输出空间中的碰撞。
    【解决方案2】:

    您需要创建一个字典,将数据集中的所有标记映射到一个哈希值。但是,由于您使用的是散列技巧,因此可能存在散列冲突,并且映射不是完全可逆的。

    【讨论】:

      【解决方案3】:

      如果您使用 CountVectorizer 而不是 HashingTF(TFIDF 基本上是 HashingTF 变换和 IDF 拟合的套装),那么它可能更适合您的需要,因为您可以恢复索引词汇表。

      String[] vocabulary= countVectorizerModel.vocabulary();
      

      以便您知道如何找到它们;

      例如,生成的 SparseVector 类似于 (11,[0,1,3],[1.0,... ,其中 [0,1,3] 表示词汇术语的索引在相应的文本中遇到,则可以参考:

      vocabulary[index]
      

      如果您需要在 LDA 主题术语的上下文中这样做,则解决方案是相同的。

      【讨论】:

        猜你喜欢
        • 2018-03-23
        • 2019-06-12
        • 2017-12-27
        • 2016-08-07
        • 2021-04-21
        • 1970-01-01
        • 2018-05-27
        • 2020-02-16
        • 2015-03-31
        相关资源
        最近更新 更多