【问题标题】:Using ideas from HashEmbeddings with sklearn's HashingVectorizer将来自 HashEmbeddings 的想法与 sklearn 的 HashingVectorizer 结合使用
【发布时间】:2019-05-15 00:01:40
【问题描述】:

Svenstrup et. al. 2017 提出了一种有趣的方法来处理散列矢量化器中的散列冲突:使用 2 个不同的散列函数,并在建模之前连接它们的结果。

他们声称,多个散列函数的组合可以逼近一个范围更大的散列函数(参见论文的第 4 节)。

我想用我在 sklearn 中使用的一些文本数据来试试这个。想法是运行HashingVectorizer 两次,每次使用不同的哈希函数,然后将结果连接为我的模型的输入。

我可以如何使用 sklearn?没有选项可以更改使用的哈希函数,但也许可以以某种方式修改矢量化器?

或者也许我可以通过SparseRandomProjection 实现这一目标?

【问题讨论】:

  • 好问题。感谢您链接到论文。 (我也在处理大型文本数据并且正在尝试类似的东西)。 HashingVectorizer 在内部调用FeatureHasher,而后者又使用Murmurhash3 函数。如果我们可以改变这一点,那么我认为这可以通过FeatureUnion 来完成。您能否详细描述一下您的用例(也许是您想要的示例)?
  • 我在这里找到了参考论文的实现:github.com/dsv77/hashembedding/blob/master/HashEmbedding/…

标签: python text hash scikit-learn nlp


【解决方案1】:

scikit-learn 中的 HashingVectorizer 已经包含一种机制,可以通过 alternate_sign=True 选项减轻哈希冲突。这会在令牌求和期间添加一个随机符号,从而改进散列空间中距离的保存(有关更多详细信息,请参阅scikit-learn#7513)。

通过使用N 散列函数并连接输出,可以将生成的稀疏矩阵中的n_features 和非空项(nnz) 的数量增加N。换句话说,每个标记现在将表示为 N 个元素。这是相当浪费记忆的明智之举。此外,由于稀疏数组计算的运行时间直接取决于nnzn_features 的影响较小),这将比仅增加n_features 产生更大的负面性能影响。我不确定这种方法在实践中是否非常有用。

如果你仍然想实现这样的矢量化器,下面是一些 cmets。

  • 因为FeatureHasher 是在 Cython 中实现的,所以很难在不编辑/重新编译代码的情况下从 Python 修改其功能。
  • 编写一个 HashingVectorizer 的快速纯 Python 实现可能是一种方法。
  • 否则,text-vectorize 包中的 HashingVectorizer 有一些实验性的重新实现。因为它是用 Rust 编写的(带有 Python 绑定),所以其他哈希函数很容易访问,can potentially be added

【讨论】:

    猜你喜欢
    • 2019-10-10
    • 2020-11-01
    • 1970-01-01
    • 2021-02-26
    • 2018-09-24
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    相关资源
    最近更新 更多