1.文字问题
2. 什么是Bag-of-Words(具体例子)
3. 局限性
文本建模的一个问题是它很杂乱,机器学习算法之类的技术更喜欢定义明确的固定长度输入和输出。
机器学习算法无法直接处理原始文本;文本必须转换为数字。具体来说,是数字向量。
在语言处理中,矢量x是从文本数据中导出的,以便反映文本的各种语言特性。
这称为特征提取或特征编码。
一种流行且简单的使用文本数据进行特征提取的方法称为 Bag-of-Words.
词袋模型或简称BoW是一种从文本中提取特征以用于建模的方法,例如用于机器学习算法。
该方法非常简单和灵活,可以用于从文档提取特征的多种方式。
词袋是描述文档中单词出现的文本表示。它涉及两件事:
- 已知单词的词汇表。
- 已知单词存在的一种度量。
它被称为单词的“ 袋 ”,因为有关文档中单词顺序或结构的任何信息都将被丢弃。该模型仅关注已知单词是否出现在文档中,而不关注文档中的何处。
句子和文档的一种非常常见的特征提取过程是词袋法(BOW)。在这种方法中,我们查看文本中单词的直方图,即将每个单词计数视为一个特征。
此外,仅从内容上我们就可以了解有关文档含义的信息。
词袋可以根据需要简单或复杂。复杂性在于决定如何设计已知单词(或标记)的词汇表以及如何对已知单词的存在进行度量。
我们将仔细研究这两个问题。
让我们用一个实际的例子来具体说明单词模型。
下面是查尔斯·狄更斯(Charles Dickens)的《两个城市的故事》一书的前几行摘录,摘自古腾堡计划
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行视为整个文档集。
现在,我们可以列出模型词汇表中所有单词的列表。
这里的独特词(忽略大小写和标点符号)是:
- “it”
- “was”
- “the”
- “best”
- “of”
- “times”
- “worst”
- “age”
- “wisdom”
- “foolishness”
这是一个包含24个单词的语料库中的10个单词的词汇表。
下一步是对每个文档中的单词打分。目的是将自由文本的每个文档转换为向量,我们可以将其用作机器学习模型的输入或输出。
因为我们知道词汇表有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, 1, 0, 0, 0, 0] |
另外几个的表示如下:
1 2 3 |
"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] |
单词的所有排序都名义上被丢弃,我们有一致的方式从语料库中的任何文档中提取特征,以备建模时使用。
与已知单词的词汇重叠的新文档,但可能包含词汇之外的单词,仍可以进行编码,仅对已知单词的出现进行评分,而忽略未知单词。您可以看到它如何自然地扩展到大词汇量和大文档。
随着词汇量的增加,文档的向量表示也随之增加。
在前面的示例中,文档向量的长度等于已知单词的数量。
您可以想象,对于一个非常大的语料库(例如数千本书),向量的长度可能是数千个或数百万个位置。此外,每个文档在词汇表中可能只包含很少的已知单词。
这将导致矢量具有很多零分,称为稀疏矢量或稀疏表示。
建模时,稀疏向量需要更多的内存和计算资源,而大量的位置或维数会使建模过程对传统算法非常具有挑战性。
有一些简单的文本清除技术可以用在第一步,例如
- 忽略大小写
- 忽略标点符号
- 忽略不包含很多信息的频繁单词,称为停用词,例如“ a”,“ of”等。
- 修复拼写错误的单词。
- 使用词干算法将词减少到词干(例如,从“播放”中“播放”)。
一种更复杂的方法是创建分组词的词汇表。这既改变了词汇的范围,又使词袋能够从文档中获取更多含义。
在这种方法中,每个单词或标记都称为“gram”。反过来,创建两个单词对的词汇表又称为bigram模型。同样,仅对出现在语料库中的二元模型进行建模,而不是对所有可能的二元模型进行建模。
N-gram的简单介绍
:一个2 gram(通常更称为双字母组)是一个两个单词的单词序列,例如“ please turn”,“ turn your”或“ your homework”,以及3 gram(通常更称为三字母)是由三个词组成的单词序列,例如““please turn your”, or “turn your homework”
因此对于该文本(“It was the best of times” )的分词为:
- “it was”
- “was the”
- “the best”
- “best of”
- “of times”
然后,词汇表跟踪单词的三元组称为三元组模型,通用方法称为n元组模型,其中n表示分组单词的数量。
通常,对于文档分类之类的任务,简单的bigram方法比单个单词袋模型更好。
一旦选择了词汇表,就需要对示例文档中单词的出现进行评分。在实际的示例中,我们已经看到一种非常简单的评分方法:单词存在与否的二进制评分。
一些其他简单的计分方法包括:
- 计数。计算每个单词在文档中出现的次数。
- 频率。计算文档中所有单词中每个单词出现在文档中的频率。
该模型非常易于理解和实施,并为您在特定文本数据上的自定义提供了很大的灵活性。
它已成功用于预测问题,例如语言建模和文档分类。
但是,它存在一些缺点,例如:
- 词汇表:词汇表需要仔细设计,尤其是为了管理尺寸,这会影响文档表示的稀疏性。
- 稀疏性:由于计算原因(空间和时间复杂度)以及信息原因,稀疏表示难以建模,而挑战在于模型在如此大的表示空间中利用很少的信息。
含义:放弃单词顺序会忽略上下文,从而忽略文档中单词的含义(语义)。上下文和含义可以为模型提供很多帮助,如果建模可以说明不同排列的相同单词(“this is interesting” vs “is this interesting”),同义词(“old bike” vs “used bike”)之间的差异。