自然语言处理中的词袋模型与文本向量化

xiaoxiao2021-02-28  31

       前段时间做了一些自然语言处理方面的工作,自然语言处理不像图像处理,每个像素点都是数值,也可以看做是天然的特征,可以直接代入公式参与各种运算,但是自然语言不行,都是文字,计算机理解不了,计算机只认0/1,不认啊喔额,所以给定一段文本,若对其进行各种处理,比如通过算法自动文本分类,通常需要先把文本表达成机器可以处理的数据类型,也就是将文本中的一个个词或字转变成数字,这样机器才能进行常规的加减乘除各种运算。去年写过词向量相关文章,今天写一下另一种方法,也是目前较为常用的文本表示为向量的方法,就是词袋模型。词袋模型Bag of Words(BoW)最早出现在自然语言处理(NaturalLanguage Processing)和信息检索(Information Retrieval)领域。即把一段文本划分成一个个词,想象成将所有词放入一个袋子里,忽略其词序、语法、句法等要素,将其仅仅看作是若干个词汇的集合,文本中每个词的出现都是独立的,不依赖于其他词是否出现。

       例如:(1)小明喜欢看电影;(2)小明也喜欢踢足球。这两个句子,可以构建出一个词典,key为这个词的索引序号,value为上文出现过的词。

       { 1:“小明”, 2:“喜欢”,3:“电影”,4:“足球”,5:“看”,6:“踢”,7:“也” }

       那么,上面两个句子用词袋模型表示成向量就是:(1)[1, 1, 1, 0, 1, 0, 0],(2)[1, 1, 0, 1, 0, 1, 1]

       这样就可以使用各种算法进行数学运算了。不过可以看到词序信息已经丢失了。如果每段文本不加任何预处理的都这样映射,那么生成的向量势必将会非常庞大,因为向量长度等于字典长度。所以需要一些额外预处理,下面是一些常用文本预处理方法:

       1.分词与去除停用词。词袋模型的主要思想,是构建各类文本的词典,然后针对每一个文本,计算该文本每个词在词典中对应位置出现的次数。因此词袋模型首要的是分词,这方面有很多开源实现,比如jieba分词。在分词后的结果集中,一般会包含很多停用词,例如:“标点符号”,“的”,“得”等等,这些词汇可以看作无效词,会以噪音的形式影响后续运算,需要去除。一般可以构建停用词库,以配置文件的形式保存起来,分词后调用一下,将停用词过滤掉以得到更精炼的分词结果。

       2.文本特征选择及词典构建。对于长文本文档,在构建词典前有必要通过特征选择方法来选择一批特征词,然后使用这些特征词构建词典,否则构建的词典将会非常庞大,即不利于存储,也不利于后续词频统计运算等。常用的特征选择方法有基尼系数、互信息、信息增益、卡方检验等。通过比较,信息增益和卡方检验两种方法效果较好。以卡方检验为例,一般设置卡方阈值或者词个数阈值,即可在卡方检验运算结果中返回一系列特征词。将全部特征词合并到一起,就构建出了文本词典。

       3.特征词权重计算。词典构建完成后,接下来就可以利用词典将文档映射成向量。一般可以选择one-hot表示的向量及tf-idf表示的向量。所谓one-hot,就是向量中的一维对应于词典中的一项。如果以词频表示,则向量中该维的值即为词典中该单词在文档中出现的频率,那么特征词权重也就是词频。而tf-idf中,tf表示词频,即一个词在文本中出现的频率;idf表示逆文档频率,即一个词在所有文本中出现的频率倒数。因此,一个词在某文本中出现的越多,在其他文本中出现的越少,权重就越大,则这个词能很好地反映文本的内容。与one-hot相比,tf-idf更加准确。但是实际使用时还是因算法和使用场景而异,有时one-hot照样可以取得很好的效果。

       4.向量降维。虽然前面比如采用卡方检验抽取了特征词,降低了词典体积,但是实际生成的向量维度可能仍然非常高,并且数据也非常稀疏,比如词典包含5000个词,那么文档映射后生成的向量将有5000维。此外,一些文本的主题或者说中心思想,并不能很好地通过文本中的词来表示,能真正概括这篇文本内容的词可能没有直接出现在文本中。因此,可以使用LSA(Latent Semantic Analysis,隐性语义分析)模型来分析文本潜在的主题。LSA属于概率主题模型的一种,通过奇异值分解的方法计算出文本中各个主题的概率分布,假设指定100个主题,那么通过LSA模型,文本向量就可以降到100维。由于该模型可以指定要分析的主题数目,所以可以将原始高维向量降到指定维数,大大节省存储空间及计算时间。

       实际应用中上面有些步骤是可选的,至此文本向量化就基本完成了,一段文本映射为一个数学向量,就可以让机器认识并参与各种数学运算了。一个很常见的计算就是相似度计算,比如计算两段文本是否相似,那么首先将文本转成向量,然后通过余弦定理就可以算出来。

转载请注明原文地址: https://www.6miu.com/read-2150290.html

最新回复(0)