将sklearn的HashingVectorizer使用HashEmbeddings中的想法

时间:2018-12-13 17:46:59

标签: python text hash scikit-learn nlp

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

他们声称,多个散列函数的组合近似于一个具有更大范围的散列函数(请参见本文的第4节)。

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

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

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

1 个答案:

答案 0 :(得分:2)

scikit-learn中的

HashingVectorizer已包含使用alternate_sign=True选项减轻哈希冲突的机制。这会在令牌求和期间添加一个随机符号,从而改善了哈希空间中距离的保留(有关更多详细信息,请参见scikit-learn#7513)。

通过使用N哈希函数并连接输出,将使所得稀疏矩阵中的n_features和非空项(nnz)的数量增加{{1} }。换句话说,每个令牌现在将表示为N个元素。这是非常浪费的存储方式。此外,由于稀疏数组计算的运行时间直接取决于Nnnz较少),这与仅增加n_features相比,对性能的负面影响要大得多。我不确定这种方法在实践中是否非常有用。

但是,如果您仍想实现这样的矢量化程序,请注意以下几点。

  • 由于n_features是在Cython中实现的,因此如果不编辑/重新编译代码,很难通过Python修改其功能。
  • 编写HashingVectorizer的快速纯Python实现可能是一种方法。
  • 否则,text-vectorize包中的HashingVectorizer进行了一些实验性的重新实现。因为它是用Rust(带有Python绑定)编写的,所以其他哈希函数很容易访问并且can potentially be added