在这里插入图片描述

 在scikit-learn的HashingVectorizer类中,实现了基于signed hash trick的算法,这里我们就用HashingVectorizer来实践一下Hash Trick,为了简单,我们使用上面的19维词汇表,并哈希降维到6维。当然在实际应用中,19维的数据根本不需要Hash Trick,这里只是做一个演示,代码如下:

from sklearn.feature_extraction.text import HashingVectorizer
vectorizer2=HashingVectorizer(n_features = 6,norm = None)
print vectorizer2.fit_transform(corpus)

    输出如下:

  (0, 1) 2.0
  (0, 2) -1.0
  (0, 4) 1.0
  (0, 5) -1.0
  (1, 0) 1.0
  (1, 1) 1.0
  (1, 2) -1.0
  (1, 5) -1.0
  (2, 0) 2.0
  (2, 5) -2.0
  (3, 0) 0.0
  (3, 1) 4.0
  (3, 2) -1.0
  (3, 3) 1.0
  (3, 5) -1.0

  大家可以看到结果里面有负数,这是因为我们的哈希函数ξξ可以哈希到1或者-1导致的。

  和PCA类似,Hash Trick降维后的特征我们已经不知道它代表的特征名字和意义。此时我们不能像上一节向量化时候可以知道每一列的意义,所以Hash Trick的解释性不强。

向量化与Hash Trick小结

 这里我们对向量化与它的特例Hash Trick做一个总结。在特征预处理的时候,我们什么时候用一般意义的向量化,什么时候用Hash Trick呢?标准也很简单。

 1.一般来说,只要词汇表的特征不至于太大,大到内存不够用,肯定是使用一般意义的向量化比较好。因为向量化的方法解释性很强,我们知道每一维特征对应哪一个词,进而我们还可以使用TF-IDF对各个词特征的权重修改,进一步完善特征的表示。

  2  .虽然词袋模型有很大的局限性,它仅仅考虑了词频,没有考虑上下文的关系,因此会丢失一部分文本的语义。但是大多数时候,如果我们的目的是分类聚类,则词袋模型表现的很好。

 3.Hash Trick用大规模机器学习上,此时我们的词汇量极大,使用向量化方法内存不够用,而使用Hash Trick降维速度很快,降维后的特征仍然可以帮我们完成后续的分类和聚类工作。当然由于分布式计算框架的存在,其实一般我们不会出现内存不够的情况。因此,实际工作中我使用的都是特征向量化。

相关参考:

1.文本挖掘预处理之向量化与Hash Trick

https://www.cnblogs.com/pinard/p/6688348.html

2.关于HashVectorizer

https://blog.csdn.net/ssswill/article/details/90756623

3.NLP三种词袋模型CountVectorizer、TfidfTransformer、HashVectorizer

https://blog.csdn.net/rosefun96/article/details/85088272

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐