写在前面的话
词袋模型在机器学习算法中通常用于表征文本数据。词袋模型非常容易理解并在语言模型和文本分类上取得了很大的成功。
本文我们将探索词袋模型在自然语言处理特征提取任务中的应用。
通过本文,可以了解到如下内容:
- 什么是词袋模型以及为什么需要文本表示
- 如何实现词袋模型
- 如何使用不同的技术建立词汇表和给词赋予权重
正文
在开始介绍之前,首先介绍本文的行文组织结构:
- 1.文本处理面临的问题
- 2.什么是词袋模型
- 3.词袋模型的示例
- 4.管理词汇表
- 5.词的权重评定
- 6.词袋模型的局限性
1.文本处理面临的问题
自然语言处理面临的文本数据往往是非结构化杂乱无章的文本数据,而机器学习算法处理的数据往往是固定长度的输入和输出。因而机器学习并不能直接处理原始的文本数据。必须把文本数据转换成数字,比如向量。
在Neural Network Methods in Natural Language Processing, 2017一书65页有一句话:
在语言处理中,往往使用向量x来表示文本的大量语言学特性。
这个过程就叫做特征提取或者特征编码。一种流行并且简单的特征提取方法就是词袋模型。
2.什么是词袋模型
词袋模型,简称BoW,常常用于提取文本特性并用于机器学习算法。
词袋模型描述的是文档中词的共现,涉及到两方面:
- 1.已知词汇
- 2.对已知词汇进行表示
‘袋’这个词意味着文档中词组的顺序和结构信息在词袋模型中将会丢失。想象一下,如果把大量的瓶子扔进一个袋子里,那瓶子扔进去的顺序以及瓶子之前堆放的样子是不是就没了呢?词袋模型只关心词组是否出现在文档中,而不是文档的具体位置。
对于文档,有一个显而易见的结论就是:拥有近似内容的文档也是近似的。更进一步的说,从文本的内容就可以学习到文档的含义。
词袋模型可以简单也可以很复杂。复杂的地方在于如何设计词汇以及如何对已存在的已知词语打分。下面,将介绍如何解决这两个问题。
3.词袋模型的示例
步骤1.搜集数据
数据的来源可以是电子书、网页、社交媒体、纸质书等等,比如现在就有如下片段:
It was the best of times,
it was the worst of times,
it was the age of wisdom,
it was the age of foolishness,
为了简单起见,对于上文中每一行都作为一个文档,这里有4行就表示现在搜集到的有4个文档。
步骤2.设计词汇表
有了数据,下一步就是构建词汇表了,观察上面的数据,可以总结下面的一个词汇表(忽略大小写和标点):
- “it”
- “was”
- “the”
- “best”
- “of”
- “times”
- “worst”
- “age”
- “wisdom”
- “foolishness”
在搜集到的文档中一共有24个词,这24个词是由10个词组成的。
步骤3.创建文档向量
为什么要转换为文档向量呢?回想一下前文提到的,机器学习算法倾向于处理固定长度的输入和输出。因而,如果能将文档进行向量化表示,那么就可以应用机器学习算法进行计算了。
因为词汇表的长度是10,所以我们可以将每一个文档表示为一个维度为10的向量,向量的每一个维度都表示一个词。文档如果在出现了对应的词,那么对应的维度就置为1,否则置为0.以“It was the best of times“举例。对照词汇表,可以得到如下的结果:
- “it” = 1
- “was” = 1
- “the” = 1
- “best” = 1
- “of” = 1
- “times” = 1
- “worst” = 0
- “age” = 0
- “wisdom” = 0
- “foolishness” = 0
写成向量形式为:
[1, 1, 1, 1, 1, 1, 0, 0, 0, 0]
类似的,其他几句话也可以表示为:
"it was the worst of times" = [1, 1, 1, 0, 1, 1, 1, 0, 0, 0]
"it was the age of wisdom" = [1, 1, 1, 0, 1, 0, 0, 1, 1, 0]
"it was the age of foolishness" = [1, 1, 1, 0, 1, 0, 0, 1, 0, 1]
可以看到文档中词的顺序和结构确实是丢失了,因为文档已经按照词汇表的顺序重新组织并向量化了。那如果出现词汇表外的词了呢?在词袋模型中将会直接被忽略。
4.管理词汇表
随着文档的不断增长,词汇表的增长将会导致文档向量不断的增长,表现为文档向量的维度不断增加。
设想要为大量的书籍建立词袋模型,那么词汇表将会变得非常的大,文档向量将会变得相当的长。当往往一本书中其实通常使用到的词汇表是非常小的,这就会导致一本书的表示向量中存在大量的0.这样的向量称为稀疏向量或者叫稀疏表示。
稀疏的向量将会在计算的时候耗费大量的计算资源和内存,所以减小词汇表大小就成为了急切需要解决的问题了。
下面介绍了一些简单的减小词汇表的方法:
- 忽略大小写
- 忽略标点符号
- 去除无意义的词,比如a the of
- 修正拼写错误
- 取出时态
一种复杂的方法就是对词进行聚合。这个方法能够得到文档一些语义信息,但也面临这词袋模型面临的同样问题。
这个方法叫做:N-元模型。N表示聚合的词个数,比如2就表示2个2个聚合在一起,叫做2元模型。
比如说“It was the best of times”,经过2元模型处理之后表示如下:
- “it was”
- “was the”
- “the best”
- “best of”
- “of times”
N元模型比词袋模型在某些任务表现得更好,比如文档分类,但也在某些情况下带来麻烦。
5.词的权重评定
当文档向量确定之后,就需要给每一个词的权重进行评估了。
首先介绍2个概念:
- 出现次数:词在一个文档中出现的次数
- 出现频率:词在一个文档中出现的次数除以文档中的词总数
5.1.词的哈希
在计算机科学中,通常使用哈希方程将大的数值空间转换为固定范围的数值。比方说将名字转换为数字以方便查找。
我们可以把词汇表中的词进行哈希表示,这样就解决了大量文档和词汇表太长的问题。因为我们可以把词汇表种的每一个词都表示成固定长度的哈希表示。这个方法存在的问题就是要尽可能的减小碰撞。
5.2.TF-IDF
TF-IDF(term frequency–inverse document frequency)是一种用于资讯检索与文本挖掘的常用加权技术。TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
6.词袋模型的局限性
虽然词袋模型简单易用并且在实际应用中取得了很大的成功,但是词袋模型本身也具有局限性:
- 词汇表的构建:词汇表的建立和维护都值得考量,不合理的词汇表将导致文档表示向量的稀疏问题显著。
- 稀疏问题:词袋模型有一个原生问题就是向量的稀疏,这将对计算资源和推理带来巨大的挑战
- 语义:因为词袋模型没有考虑到语序,但是往往语序又蕴含着不同的语义信息。比如“this is interesting” vs “is this interesting”,不同的语序代表的语义是不同的。
总结
本文介绍了词袋模型介绍了什么是词袋模型以及举了一个词袋模型实现的实例;之后介绍了词袋模型中词权重的评估;最后介绍了词袋模型的局限性。
本文翻译自原文,感兴趣的朋友可以去看看原文。