前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >你知道词袋模型吗?

你知道词袋模型吗?

作者头像
机器学习算法工程师
发布2018-07-26 15:32:55
1.3K0
发布2018-07-26 15:32:55
举报

作者:王抒伟

编辑:赵一帆

前 言

词袋模型是一种在使用机器学习算法建模文本时表示文本数据的方式; 易于理解和实现,并且在语言建模文档分类等问题上取得了巨大成功。

章节目录

  1. 文本问题
  2. 什么是字袋?
  3. 词袋模型的例子
  4. 管理词汇
  5. 得分词
  6. 词袋的局限性

01

文本问题

首先,我们知道,对文本建模是一个比较杂乱复杂的问题,机器学习算法等技术更喜欢定义明确的固定长度输入和输出。

机器学习算法无法直接使用原始文本; 文本必须转换为数字。具体而言,是数字的向量。

在语言处理中,向量x从文本数据导出,以反映文本的各种语言属性。 这称为特征提取或特征编码

使用文本数据进行特征提取的一种流行且简单的方法称为文本的词袋模型。

02

什么是词(字)袋?

词袋模型Bag-of-words(简称BoW)是一种从文本中提取特征的方法,用于建模,例如机器学习算法。 该方法非常简单和灵活,并且可以以多种方式用于从文档中提取特征。

词袋是文本的表示,用于描述文档中单词的出现。它涉及两件事:

已知单词的词汇。 衡量已知单词的存在。

它被称为单词的“ 包 ”,因为关于文档中单词的顺序或结构的任何信息都被丢弃。 该模型仅关注文档中是否出现已知单词,而不是文档中的位置。

句子和文档的一个非常常见的特征提取过程是:词袋方法(BOW)。在这种方法中,我们查看文本中单词的直方图,即将每个单词计数视为一个特征。

如果文档具有相似的内容,则文档是相似的,并且,仅从内容中我们可以了解文档的含义。

这个词袋可以像你想的那样简单或复杂,复杂性在于决定

  • 如何设计已知单词(或标记)的词汇;
  • 如何对已知单词的存在进行评分。

我们将仔细研究这两个问题。

03

词袋模型的例子

第1步:收集数据

下面是查尔斯·狄更斯(Charles Dickens)的“ 双城记”( The Tale of Two Cities)中的前几行文本摘录,摘自Project Gutenberg。

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行视为我们的整个文档集。

第2步:设计词汇表

现在我们可以列出模型词汇表中的所有单词。这里的独特单词(忽略大小写和标点符号)是:

  • “it”
  • “was”
  • “the”
  • “best”
  • “of”
  • “times”
  • “worst”
  • “age”
  • “wisdom”
  • “foolishness”

这是一个包含24个单词的语料库中10个单词的词汇。

第3步:创建文档向量

目标是将每个自由文本文档转换为一个矢量,我们可以将其用作机器学习模型的输入或输出

因为我们知道词汇表有10个单词,所以我们可以使用10的固定长度文档表示,在向量中有一个位置来对每个单词进行评分。

最简单的评分方法是将单词的存在标记为布尔值,0表示缺席,1表示存在。

使用我们词汇表中上面列出的单词的任意排序,我们可以逐步浏览第一个文档(“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]

所有单词的排序名义上都被丢弃了,我们有统一的方法从我们语料库中的任何文档中提取特征,准备用于建模。

与已知单词的词汇重叠但可能包含词汇表之外的单词的新文档仍然可以被编码,其中仅对已知单词的出现进行评分并且忽略未知单词。

聪明的你会发现,这可能会自然地扩展到大型词汇表和更大的文档。

04

管理词汇

随着词汇量的增加,文档的向量表示也会增加。 在前面的示例中,文档向量的长度等于已知单词的数量。

你可以想象,对于一个非常大的语料库,例如数千本书,矢量的长度可能是数千或数百万个位置。 此外,每个文档可以包含词汇表中很少的已知单词。

这导致具有许多零分数的向量,称为稀疏向量或稀疏表示。

稀疏向量在建模时需要更多的存储器和计算资源,并且大量的位置或维度可以使建模过程对于传统算法非常具有挑战性。

因此,当使用词袋模型时,存在减小词汇量的压力的压力。

那么这里有有一些简单的文本清理技术,例如:

  • 忽略案例
  • 忽略标点符号
  • 忽略不包含太多信息的常用词,称为停用词,如“a”,“of”等。
  • 修复拼写错误的单词。
  • 使用词干算法将单词减少到词干(e.g. “play” from “playing”) 。

更复杂的方法是:创建分组词的词汇表; 这既改变了词汇表的范围,又允许词袋从文档中捕获更多的含义。

在这种方法中,每个单词或标记称为“gram”。反过来,创建双字对词汇表称为二元组模型。 同样,只有出现在语料库中的双字母才被建模,而不是所有可能的双字母。

例如,上一节中第一行文字中的双字母组:“It was the best of times” 如下:

  • “it was”
  • “was the”
  • “the best”
  • “best of”
  • “of times”

然后跟踪词汇三元组的词汇表称为三元组模型,一般方法称为n-gram模型,其中n表示分组词的数量。 对于像文档分类这样的任务,通常一个简单的二元组方法比一组1克的词袋模型更好。

a bag-of-bigrams 表示比词袋更强大,并且在许多情况下证明是相当有效的。

05

打分词

一旦选择了词汇表,就需要对示例文档中单词的出现进行评分。

在工作示例中,我们已经看到了一种非常简单的评分方法:对单词存在与否的二进制评分。

一些其他的简单评分方法包括:

  • 计数。计算每个单词在文档中出现的次数。
  • 频率。计算文档中所有单词中每个单词出现在文档中的频率

06

词袋的局限性

词袋模型非常易于理解和实现,并为您的特定文本数据提供了很大的灵活性。

它在语言建模和文档分类等预测问题上取得了相当大成功。

然而,它有一些缺点,例如:

  • 词汇:词汇表需要精心设计,最重要的是为了管理大小,这会影响文档表示的稀疏性。
  • 稀疏性:由于计算原因(空间和时间复杂性)以及信息原因,稀疏表示更难以建模,其中挑战是模型在如此大的代表空间中利用如此少的信息。
  • 含义:丢弃单词顺序忽略了上下文,而忽略了文档中单词的含义(语义)。上下文和意义可以为模型提供很多东西,如果建模可以说出不同排列的相同单词之间的区别(“this is interesting” vs “is this interesting”),同义词(“old bike” vs “used bike”), 以及更多例子。

END

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-07-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习算法工程师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文本问题
  • 什么是词(字)袋?
  • 词袋模型的例子
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档