在(文本挖掘的分词原理)中,我们讲到了文本挖掘的预处理的关键一步:“分词”,而在做了分词后,如果我们是做文本分类聚类,则后面关键的特征预处理步骤有向量化或向量化的特例Hash Trick,本文我们就对向量化和特例Hash Trick预处理方法做一个总结。

向量化与HashTrick在文本发掘中预处理中的体现 向量化与HashTrick在文本发掘中预处理中的表现  深度学习 向量化 Hash Trick 第1张

前语

在(文本发掘的分词原理)中,咱们讲到了文本发掘的预处理的要害一步:“分词”,而在做了分词后,假设咱们是做文本分类聚类,则后边要害的特征预处理过程有向量化或向量化的特例Hash Trick,本文咱们就对向量化和特例Hash Trick预处理办法做一个总结。

词袋模型

在讲向量化与Hash Trick之前,咱们先说说词袋模型(Bag of Words,简称BoW)。词袋模型假定咱们不考虑文本中词与词之间的上下文联系,仅仅只考虑避实就虚词的权重。而权重与词在文本中呈现的频率有关。

词袋模型首先会进行分词,在分词之后,经过核算每个词在文本中呈现的次数,咱们就能够得到该文本根据词的特征,假设将各个文本样本的这些词与对应的词频放在一同,便是咱们常说的向量化。向量化结束后一般也会运用TF-IDF进行特征的权重批改,再将特征进行规范化。 再进行一些其他的特征工程后,就能够将数据带入机器学习算法进行分类聚类了。

词袋模型的三部曲:

  • 分词(tokenizing);
  • 核算修订词特征值(counting);
  • 规范化(normalizing);

与词袋模型十分相似的一个模型是词集模型(Set of Words,简称SoW),和词袋模型***的不同是它仅仅考虑词是否在文本中呈现,而不考虑词频。也便是一个词在文本在文本中呈现1次和屡次特征处理是相同的。在大多数时分,咱们运用词袋模型,后边的评论也是以词袋模型为主。

当然,词袋模型有很大的局限性,因为它仅仅考虑了词频,没有考虑上下文的联系,因而会丢掉一部分文本的语义。可是大多数时分,假设咱们的意图是分类聚类,则词袋模型体现的很好。

BoW之向量化

在词袋模型的核算词频这一步,咱们会得到该文本中避实就虚词的词频,有了词频,咱们就能够用词向量表明这个文本。管中窥豹咱们举一个比方,比方直接用scikit-learn的CountVectorizer类来完结,这个类能够帮咱们完结文本的词频核算与向量化,代码如下:

  1. fromsklearn.feature_extraction.textimportCountVectorizer
  2. corpus=["IcometoChinatotravel",
  3. "ThisisacarpoluparinChina",
  4. "IloveteaandApple",
  5. "Theworkistowritesomepapersinscience"]
  6. printvectorizer.fit_transform(corpus)

咱们看看关于上面4个文本的处理输出如下:

  1. (0,16)1
  2. (0,3)1
  3. (0,15)2
  4. (0,4)1
  5. (1,5)1
  6. (1,9)1
  7. (1,2)1
  8. (1,6)1
  9. (1,14)1
  10. (1,3)1
  11. (2,1)1
  12. (2,0)1
  13. (2,12)1
  14. (2,7)1
  15. (3,10)1
  16. (3,8)1
  17. (3,11)1
  18. (3,18)1
  19. (3,17)1
  20. (3,13)1
  21. (3,5)1
  22. (3,6)1
  23. (3,15)1

能够看出4个文本的词频现已核算出,在输出中,左面的括号中的***个数字是文本的序号,第2个数字是词的序号,留意词的序号是根据避实就虚的文档的。第三个数字便是咱们的词频。

咱们能够进一步看看每个文本的词向量特征和各个特征代表的词,代码如下:

  1. printvectorizer.fit_transform(corpus).toarray()
  2. printvectorizer.get_feature_names()

输出如下:

  1. [[0001100000000002100]
  2. [0011011001000010000]
  3. [1100000100001000000]
  4. [0000011010110101011]]
  5. [u'and',u'apple',u'car',u'china',u'come',u'in',u'is',u'love',u'papers',u'polupar',u'science',u'some',u'tea',u'the',u'this',u'to',u'travel',u'work',u'write']

能够看到咱们一共有19个词,所以4个文本都是19维的特征向量。而每一维的向量顺次对应了下面的19个词。别的因为词”I”在英文中是停用词,不参与词频的核算。

因为大部分的文本都只会运用词汇表中的很少一部分的词,因而咱们的词向量中会有很多的0。也便是说词向量是稀少的。在实践运用中一般运用稀少矩阵来存储。将文本做了词频核算后,咱们一般会经过TF-IDF进行词特征值修订。

向量化的办法很好用,也很直接,可是在有些场景下很难运用,比方分词后的词汇表十分大,到达100万+,此刻假设咱们直接运用向量化的办法,将对应的样本对应特征矩阵载入内存,有或许将内存撑爆,在这种状况下咱们怎么办呢?***反应是咱们要进行特征的降维,说的没错!而Hash Trick便是十分常用的文本特征降维办法。

Hash Trick

在大规模的文本处理中,因为特征的维度对应分词词汇表的巨细,所以维度或许十分恐惧,此刻需求进行降维,不能直接用咱们上一节的向量化办法。而最常用的文本降维办法是Hash Trick。提到Hash,一点也不奥秘,学过数据结构的同学都知道。管中窥豹的Hash含义也相似。

在Hash Trick里,咱们会界说一个特征Hash后对应的哈希表的巨细,这个哈希表的维度会远远小于咱们的词汇表的特征维度,因而能够看成是降维。详细的办法是,对应恣意一个特征名,咱们会用Hash函数找到对应哈希表的方位,然后将该特征名对应的词频核算值累加到该哈希表方位。假设用数学打量表明,假设哈希函数h使第i个特征哈希到方位j,即h(i)=j,则第i个原始特征的词频数值ϕ(i)将累加到哈希后的第j个特征的词频数值ϕ¯上,即:

 向量化与HashTrick在文本发掘中预处理中的表现 深度学习 向量化 Hash Trick 第2张

可是上面的办法有一个问题,有或许两个原始特征的哈希后方位在一同导致词频累加特征值忽然变大,为了处理这个问题,呈现了Hash Trick的变种signed hash Trick,此刻除了哈希函数h,咱们多了一个哈希函数:

 向量化与HashTrick在文本发掘中预处理中的表现 深度学习 向量化 Hash Trick 第3张

这样做的优点是,哈希后的特征依然是一个无偏的估量,不会导致某些哈希方位的值过大。

在scikit-learn的HashingVectorizer类中,完结了根据signed hash trick的算法,管中窥豹咱们就用HashingVectorizer来实践一下Hash Trick,为了简略,咱们运用上面的19维词汇表,并哈希降维到6维。当然在实践运用中,19维的数据底子不需求Hash Trick,管中窥豹仅仅做一个演示,代码如下:

  1. fromsklearn.feature_extraction.textimportHashingVectorizer
  2. vectorizer2=HashingVectorizer(n_features=6,norm=None)printvectorizer2.fit_transform(corpus)

输出如下:

  1. (0,1)2.0
  2. (0,2)-1.0
  3. (0,4)1.0
  4. (0,5)-1.0
  5. (1,0)1.0
  6. (1,1)1.0
  7. (1,2)-1.0
  8. (1,5)-1.0
  9. (2,0)2.0
  10. (2,5)-2.0
  11. (3,0)0.0
  12. (3,1)4.0
  13. (3,2)-1.0
  14. (3,3)1.0
  15. (3,5)-1.0

和PCA相似,Hash Trick降维后的特征咱们现已不知道它代表的特征姓名和含义。此刻咱们不能像上一节向量化时分能够知道每一列的含义,所以Hash Trick的解释性不强。

小结

在特征预处理的时分,咱们什么时分用一般含义的向量化,什么时分用Hash Trick呢?规范也很简略。

一般来说,只需词汇表的特征不至于太大,大到内存不行用,肯定是运用一般含义的向量化比较好。因为向量化的办法解释性很强,咱们知道每一维特征对应哪一个词,从而咱们还能够运用TF-IDF对各个词特征的权重修正,进一步完善特征的表明。

而Hash Trick用大规模机器学习上,此刻咱们的词汇量极大,运用向量化办法内存不行用,而运用Hash Trick降维速度很快,降维后的特征依然能够帮咱们完结后续的分类和聚类作业。当然因为分布式核算结构的存在,其实一般咱们不会呈现内存不行的状况。因而,实践作业中我运用的都是特征向量化。

转载请说明出处
知优网 » 向量化与HashTrick在文本发掘中预处理中的表现

发表评论

您需要后才能发表评论