N-grams 词袋模型

17 Mar 2025 | 阅读 17 分钟

引言

在自然语言处理(NLP)中,N-grams词袋模型(Bag of N-Grams Model)是一种用于以结构化的方式表示文本输入的方法,以便机器学习算法能够利用。N-gram是由特定语音或文本样本中的“N”个连续元素组成的序列。这些元素可以是单词、音节或字符。为了生成用于文本分析的特征集,该模型构建了一个“词袋”(即N-gram的集合)。

  • Unigram (1-gram):"I love NLP" -> ["I", "love", "NLP"]
  • Bigram (2-gram):"I love NLP" -> ["I love", "love NLP"]
  • Trigram (3-gram):"I love NLP" -> ["I love NLP"]

在自然语言处理(NLP)中的重要性

  • 上下文感知:通过保留词语顺序,N-grams词袋模型比分别处理每个单词的词袋模型捕获了更多的上下文信息。
  • 提高准确性:通过考虑单词组合而不是单个单词,N-grams可以显著提高各种自然语言处理(NLP)任务(包括文本分类和情感分析)的模型性能。
  • 通用性:该模型具有适应性,可以设置为以不同的粒度记录文本数据,从单个单词(unigrams)到更大的短语(trigrams及以上)。

与词袋模型(Bag of Words Model)的比较

NLP的核心策略包括词袋模型(Bag of Words, BoW)和N-grams词袋模型,但它们之间存在显著差异。

  • 词语顺序:BoW模型将每个单词视为独立特征,忽略文本内的词语顺序。然而,N-grams词袋模型通过考虑词语序列,得以保留部分词语顺序信息。
  • 上下文捕获:由于BoW模型仅考虑单个单词,因此无法很好地捕获上下文。N-grams词袋模型在需要词语顺序的任务中更有用,因为它包含捕获局部上下文的词语序列。
  • 维度:与N-grams词袋模型相比,BoW模型通常产生较低维度的特征空间,尤其是在N值较高的情况下。这可能导致N-grams模型特征矩阵中的稀疏性问题。

例如,考虑句子“I am happy”

  • BoW表示:{"I": 1, "am": 1, "happy": 1}
  • Bigram表示:{"I am": 1, "am happy": 1}

通过比较这些模型可以清楚地看到,N-grams词袋模型能够更复杂地理解文本输入,尤其是在需要检查词语模式和上下文的应用中。

理解N-grams

N-grams是指从特定文本或音频样本中连续的n个元素的组。在自然语言处理(NLP)中,它们的应用范围很广,包括文本分析、语言建模和机器学习应用。根据n的值,有几种方式可以概念化n-grams。

Unigrams

当n = 1时,unigram是最基本的n-gram类型。它们代表文档中的特定术语。Unigrams对于简单的文本分析任务很有用,但它们通常缺乏单词组合所提供的上下文。

例如,在句子“The cat sat on the mat”中,unigrams是

  • "The"
  • "cat"
  • "sat"
  • "on"
  • "the"
  • "mat"

Bigrams

Bigrams由连续的两个相邻单词组成(n = 2)。它们考虑了单词对,从而部分捕获了上下文。Bigrams对于破译文本中的单词关系很有用,因为它们比unigrams提供了更多的上下文信息。

使用相同的句子,bigrams是

  • "The cat"
  • "cat sat"
  • "sat on"
  • "on the"
  • "the mat"

Trigrams

三个单词连续排列构成一个trigram(n = 3)。由于它们识别了三个单词的序列,因此提供了更多的上下文。Trigrams对于更深入的文本分析和语言理解很有用,因为它们可以在短语级别捕获趋势。

从我们的示例句子中,trigrams是

  • "The cat sat"
  • "cat sat on"
  • "sat on the"
  • "on the mat"

高阶N-Grams

高阶n-grams(n > 3)通过包含四个或更多单词来扩展此概念。高阶n-grams需要更高的处理和数据需求,但能够捕获复杂的语言模式。它们对于需要捕获复杂上下文的特定NLP任务尤其有用。

例如,我们句子的4-grams(quad grams)将是

  • "The cat sat on"
  • "cat sat on the"
  • "sat on the mat"

N-Grams示例

为了进一步说明这个概念,让我们考虑另一个句子:“Machine learning is fascinating。”

  • Unigrams: "Machine", "learning", "is", "fascinating"
  • Bigrams: "Machine learning", "learning is", "is fascinating"
  • Trigrams: "Machine learning is", "learning is fascinating"
  • 4-grams: "Machine learning is fascinating"

N-grams词袋模型是在自然语言处理(NLP)中一个强大而灵活的工具。

在文本分析中的作用

由于它们实现了以下功能,n-grams对于文本分析至关重要。

  • 特征提取:机器学习模型使用从N-grams生成的特征。例如,文本分类算法使用n-grams作为输入,使模型能够识别模式并生成预测。
  • 语言建模:通过根据前面的单词预测序列中的下一个单词,N-grams有助于构建语言模型。语音识别和自动完成等应用程序都依赖于此。
  • 信息检索:搜索引擎使用n-grams将用户查询与相关文档进行匹配。通过考虑单词组合,它们提高了搜索的准确性。
  • 情感分析:通过检查bigrams和trigrams,情感分析模型可以通过捕获unigrams无法捕获的上下文来更好地预测情感。
  • 机器翻译:在将文本从一种语言翻译成另一种语言时,N-grams有助于理解上下文和句子结构。

构建N-grams词袋模型

文本预处理步骤

在创建n-grams之前,有必要对文本进行预处理,以确保生成的n-grams是相关且有用的。

分词

将文本划分为称为标记(tokens)的更小部分的过程称为标记化(tokenization)。单词、句子或其他重要组成部分都可以作为标记。标记化通常将内容划分为单独的单词。

示例

  • 原始文本:“Natural Language Processing is fascinating.”
  • 标记化后的文本:["Natural", "Language", "Processing", "is", "fascinating"]

小写化

小写化是指将文本中的所有字符转换为小写。通过将“Natural”和“natural”等术语视为相同的标记,此步骤有助于文本标准化。

示例

  • 标记化后的文本:["Natural", "Language", "Processing", "is", "fascinating"]
  • 小写化后的文本:["natural", "language", "processing", "is", "fascinating"]

去除标点符号和特殊字符

通常可以从文本中排除标点符号和特殊字符,因为它们不提供任何有用的信息。此阶段会从文本中移除这些字符,使其更干净。

示例

  • 小写化后的文本:["natural", "language", "processing", "is", "fascinating"]
  • 清理后的文本:["natural", "language", "processing", "is", "fascinating"](假设示例中没有标点符号)

去除停用词

“is”、“and”和“the”等常用词是停用词的例子;在文本分析的上下文中,它们通常意义不大。消除这些术语有助于专注于文本中最重要部分。

示例

  • 清理后的文本:["natural", "language", "processing", "is", "fascinating"]
  • 不含停用词:["natural", "language", "processing", "fascinating"]

从文本生成N-Grams

在预处理文本之后,下一步是生成n-grams。N-grams是n个文本元素(单词、字母等)的连续组。

滑动窗口方法

要捕获每个n-gram,滑动窗口方法包括将大小为n的窗口拖过文本。例如,当窗口大小为2(bigrams)时,窗口记录彼此相随的单词对。

示例

  • 文本:["natural", "language", "processing", "fascinating"]
  • Bigrams:[("natural", "language"), ("language", "processing"), ("processing", "fascinating")]

对于trigrams(n=3),窗口捕获连续单词的三元组。

示例

  • 文本:["natural", "language", "processing", "fascinating"]
  • Trigrams:[("natural", "language", "processing"), ("language", "processing", "fascinating")]

处理文本中的边界

在创建n-grams时,必须仔细处理文本边界,特别是对于被分割成句子或页面的文本。

  • 句子限制:确保n-grams不会跨越到其他句子。最好分别处理每个句子。

示例

  • 文本:“Natural Language Processing is fascinating. It has many applications.”
  • 句子 1 Bigrams:[("natural", "language"), ("language", "processing"), ("processing", "is"), ("is", "fascinating")]
  • 句子 2 Bigrams:[("it", "has"), ("has", "many"), ("many", "applications")]
  • 文档边界:如果文本分散在多个文档中,请确保n-grams在每个文档内独立创建。

示例

  • 文档 1:“Natural Language Processing is fascinating.”
  • 文档 2:“It has many applications.”
  • 文档 1 Bigrams:[("natural", "language"), ("language", "processing"), ("processing", "is"), ("is", "fascinating")]
  • 文档 2 Bigrams:[("it", "has"), ("has", "many"), ("many", "applications")]

这些预处理步骤和细致的n-gram生成确保了N-grams词袋模型能够捕获文本中的局部上下文和模式,从而为各种NLP应用提供了坚实的基础。

使用N-grams词袋进行特征提取

在自然语言处理(NLP)中,特征提取是一个关键阶段,它将未处理的文本转换为适合机器学习算法的数值表示。与词袋模型相比,N-grams词袋模型通过考虑连续的词语序列,捕获了更多的上下文信息。

文本的向量表示

频率计数

将文本转换为数值向量的过程,其中每个元素代表N-Gram在文本中出现的次数,称为频率计数。这种方法提供了一种量化文本数据的简单方法。

  • 标记化:通过将文本划分为离散的单词或字符来标记化文本。
  • 生成N-Grams:构建N个单词的序列。例如,句子“The cat sat”为bigrams(N=2)生成“The cat”和“cat sat”。
  • 计算频率:确定每个N-Gram在文本中出现的次数。

示例

  • 文本:“The cat sat on the mat.”
  • Bigrams:["The cat", "cat sat", "sat on", "on the", "the mat"]
  • 频率计数向量:{ "The cat": 1, "cat sat": 1, "sat on": 1, "on the": 1, "the mat": 1 }

词频-逆文档频率(TF-IDF)

一种更高级的方法,称为TF-IDF,通过对N-Grams在多个文档中的频率进行加权来衡量其相关性。它减少了可能对文本区分不重要的频繁出现的N-Grams的影响。

  • 词频(TF):确定N-Gram在文档中出现的频率。
Bag of N-Grams Model
  • 逆文档频率(IDF):确定N-Gram在一组文档中的重要性。
Bag of N-Grams Model
  • TF-IDF分数:结合TF和IDF以获得平衡的权重。

TF-IDF(t,d) = TF(t,d) * IDF(t)

示例

  • 文档 1:“The cat sat on the mat.”
  • 文档 2:“The cat lay on the mat.”
  • 由于Bigram“the mat”出现在多个文档中,其TF-IDF得分是中间的。它可能在两个文档中都有高TF,但IDF较低。

N-Gram特征的稀疏性

由于并非所有潜在的N-Gram都出现在每个文本中,因此N-Gram特征向量通常是稀疏的,尤其是在N值较高的情况下。这种稀疏性可能导致计算和存储效率低下。

  • 例如,假设词汇量为1000个单词。Bigrams可以生成多达(1000 * 1000 = 1,000,000)种潜在组合,其中大部分不会出现在特定的文档中。
  • 困难:稀疏矩阵需要大量内存和处理能力。它们也可能导致机器学习算法性能下降。

降维技术

我们使用降维方法来处理稀疏性。通过保留重要信息,这些方法有助于将高维N-Gram特征空间转换为低维空间。

主成分分析 (PCA)

主成分分析(PCA)是一种统计方法,它将数据转换为一组线性不相关的变量。通过沿方差最大的方向投影数据,它降低了维度。

  • 标准化数据:通过减去均值来中心化数据。
  • 协方差矩阵:计算标准化数据的协方差矩阵。
  • 特征分解:确定协方差矩阵的特征值和特征向量。
  • 选择主成分:将最高的k个特征向量与最大的特征值相关联。
  • 数据转换:将原始数据投影到选定的主成分上。

奇异值分解(SVD)

SVD是一种矩阵分解技术,它将矩阵分解为三个矩阵:U、Σ和V^T。SVD在处理N-Gram特征时,有助于降低维度并保持数据的结构。

  • U:U是一个正交矩阵,表示文档向量。
  • Σ:奇异值对角矩阵。
  • V^T:一个正交矩阵,表示N-Gram向量。
  • 截断矩阵:为了降低维度,保留前k个奇异值和相应的向量。
  • 重构近似:使用截断的矩阵在较低维空间中近似原始矩阵。

N-grams词袋模型的应用

文本分类

情绪分析

识别文本内容(如社交媒体帖子或产品评论)中传达的情感或情绪称为情感分析。通过考虑词语序列(n-grams)而不是单个词语,N-grams词袋模型有助于捕获上下文和细微差别。Unigrams“not”、“good”、“very”和“happy”不像bigrams“not good”或“very happy”那样传达相同的情感信息。

示例工作流程

  • 数据收集:将标记有情感(例如,正面、负面)的文本样本编译成数据集。
  • 预处理:使用标记化去除文本数据中的停用词和标点符号。
  • N-Gram生成:取清理后的文本并生成bigrams或trigrams。
  • 特征提取:使用频率计数或TF-IDF将n-grams转换为特征向量。
  • 模型训练:使用特征向量训练机器学习模型(如逻辑回归或SVM)。
  • 预测:使用学习到的模型对新的文本样本进行情感预测。

垃圾邮件检测

识别电子邮件或通信是否为垃圾邮件的过程称为垃圾邮件检测。通过识别垃圾邮件通信中常见的词语和模式,N-grams词袋模型提高了检测的准确性。

示例工作流程

  • 数据收集:获取标记的通信数据集(包括垃圾邮件和非垃圾邮件)。
  • 预处理:标记化并清理内容。
  • N-Gram生成:创建bigrams或trigrams以捕获流行的垃圾邮件词语。
  • 特征提取:为n-grams提供数值表示。
  • 模型训练:使用这些特征训练分类器(如朴素贝叶斯或随机森林)。
  • 预测:使用训练好的模型将传入的通信分类为垃圾邮件或非垃圾邮件。

文本聚类

文本聚类是将相关的文本分组到一个集合中,而无需提前分配标签。通过考虑词语序列,N-grams词袋模型有助于查找文本中的模式和相似性。

示例工作流程

  • 数据收集:汇编多篇书面文档。
  • 预处理:使文本数据干净且已标记化。
  • N-Gram生成:创建n-grams以捕获上下文。
  • 特征提取:从n-grams生成特征矩阵。
  • 聚类算法:使用聚类算法(例如,K-means、层次聚类)根据特征矩阵对文本进行分组。
  • 分析:检查聚类以识别重复的主题或模式。

语言建模

语言建模是预测序列中的下一个单词,用于文本生成和语音识别等任务。使用n-gram出现的概率,N-grams词袋模型提供了一种简单而强大的语言建模方法。

示例工作流程

  • 数据收集:收集大量的文本数据。
  • 预处理:使文本干净且已标记化。
  • N-Gram生成:使用文本创建n-grams(例如,bigrams和trigrams)。
  • 概率计算:根据每个n-gram在语料库中出现的频率来确定其概率。
  • 预测:使用这些概率确定序列中下一个出现的单词。

信息检索

信息检索是指根据查询查找相关文档或信息的过程。N-grams词袋模型考虑了n-grams提供的上下文,从而提高了检索的准确性。

示例工作流程

  • 数据收集:收集文档以创建数据集。
  • 准备:标记化并清理文档。
  • N-Gram生成:利用文档创建n-grams。
  • 特征提取:使用n-grams创建特征矩阵。
  • 索引:使用n-gram特征对文档进行索引。
  • 查询处理:通过查询处理将用户查询转换为n-gram特征。
  • 检索:为了找到最相关的文本,请使用余弦相似度等相似性度量。

机器翻译

将文本从一种语言翻译成另一种语言称为机器翻译。统计机器翻译系统使用N-grams词袋模型来捕获局部上下文,从而提高翻译质量。

示例工作流程

  • 数据收集:将源语言和目标语言中的对齐文本对编译成平行语料库。
  • 预处理:在两种语言中,清理并标记化文本。
  • 使用N-Gram生成技术为源文本和目标文本生成n-grams。
  • 对齐:确保源语言和目标语言中的n-grams对齐。
  • 翻译模型:使用对齐的n-grams创建翻译模型。
  • 预测:为了翻译新文本,确定目标语言中最有可能出现的n-gram序列。

N-grams词袋模型的优点

捕获局部上下文

N-grams词袋模型能够识别文本中的局部上下文是其主要优点之一。与单独处理单词的词袋模型不同,N-grams词袋模型考虑了词语序列。这种方法可以更清晰地理解单词之间的关系。例如,在句子“The quick brown fox”中,bigram模型通过识别“quick brown”和“brown fox”作为重要单元,可以保留unigram模型会丢失的上下文。此功能对于情感分析等任务尤其有用,因为单词组合和顺序会极大地改变语句的含义。

与Unigrams相比,在特定任务中性能更好

在多种自然语言处理(NLP)任务中,N-grams词袋模型的性能优于更简单的词袋模型。这种改进在上下文和词语顺序起重要作用的任务中尤为明显。例如,在垃圾邮件检测或情感分析等文本分类应用程序中,bigrams和trigrams可能比单个单词提供更具辨别力的特征。该模型考虑相邻单词对或三元组的能力,通过识别代表特定类别或情感的短语和表达式,提高了分析的准确性和鲁棒性。

选择N的灵活性

N-grams词袋模型能够选择N值也提供了另一个重要好处。根据文本的性质和使用的特定任务,可以通过使用不同数量的N来优化效率。例如,trigrams(N=3)可能更适合需要更多上下文的任务,如命名实体识别或复杂的语言建模,而bigrams(N=2)通常足以在情感分析中捕获局部上下文。这种适应性在模型复杂性和计算效率之间取得了平衡,使从业人员和研究人员能够测试不同的N值,以寻求其特定应用的最佳表示。 ## 7. N-grams词袋模型的局限性

N-grams词袋模型的局限性

维度灾难

N-Gram词袋模型经常受到维度灾难的影响,即随着N的增大,特征(N-Grams)的数量呈指数级增长。例如,包含10,000个不同单词的词汇量的文本语料库可以生成多达10,000^2个bigrams(1亿)和10,000^3个trigrams(1万亿)。从潜在N-Gram总数的急剧增加中可能出现大量问题。

  • 计算复杂度:处理如此庞大的特征集需要大量的内存和处理资源,这使得有效处理和分析大型数据集具有挑战性。
  • 过拟合:当模型具有太多特征时,它可能会过拟合训练集并捕获噪声而不是总体趋势。结果,模型无法泛化到以前未测试过的数据。

数据稀疏性问题

N-grams词袋模型的另一个重大障碍是数据稀疏性。随着N-Grams数量的增加,许多N-Grams可能很少出现或根本不出现在文本语料库中。

  • 稀疏特征矩阵:生成的特征矩阵中的大量零表明大多数文档不包含许多N-Grams。存储和处理稀疏矩阵会消耗大量计算能力。
  • 特征利用效率低下:生成的许多N-Grams可能无法为模型提供有用的信息,这可能导致资源利用效率低下和模型性能下降。

缺乏语义理解

  • 忽略上下文:该模型将N-Grams解释为独立单元,忽略了它们存在的更大上下文。例如,将“not good”和“good”视为独立的bigrams将错过“not good”这个词的否定含义。
  • 词义澄清:具有多个含义的单词(多义词)会给模型带来困难。例如,尽管“river bank”和“bank account”具有不同的含义,但两者中的“bank”一词将被类似地处理。
  • 无法捕获长距离依赖关系:模型难以捕获文本中单词之间的长距离依赖关系,而这些依赖关系对于破译复杂句子的整体含义可能很重要。

可伸缩性问题

在大型文本语料库上使用N-grams词袋模型时,可伸缩性是一个主要挑战。随着数据集的增大,上述限制变得更加明显。

  • 资源密集:处理具有大量N-Gram特征的大型数据集需要大量时间和计算能力。因此,使模型适应大型数据应用程序具有挑战性。
  • 模型维护:定期更新和维护在大型、动态数据集上训练的模型可能很困难。当底层数据分布发生变化时,通常需要重新训练,这需要大量资源。
  • 实时处理:N-grams词袋模型的高处理成本使得实时文本分析不可行,这限制了其在时间敏感应用程序(如实时情感分析或垃圾邮件检测)中的使用。

在 Python 中实现

使用NLTK生成N-Grams

对于Python中的人类语言数据处理,自然语言工具包(NLTK)提供了广泛的工具集。它提供了文本处理工具集以及对50多个语料库和词汇资源的友好接口。

使用NLTK生成N-Grams的分步指南

1. 安装NLTK

首先,确保您已安装NLTK。如果没有,您可以使用pip进行安装。

2. 导入所需的库

导入必要的库以开始处理文本数据和N-grams。

3. 下载必要的NLTK数据

NLTK需要一些数据集和预训练的模型,可以使用以下命令下载

4. 生成N-Grams

定义一个函数来从给定文本生成N-grams。

N-grams词袋模型的示例代码

要构建N-grams词袋模型,首先必须从文本输入创建N-grams,然后将其转换为适合机器学习应用程序的特征矩阵。

分步示例

1. 导入库

2. 示例文本数据

准备一些示例文本数据。

3. 生成N-Grams

为CountVectorizer创建一个自定义分词器函数。

与机器学习管道集成

Scikit-Learn

对于Python机器学习,Scikit-Learn是一个强大的库。将N-grams包含在Scikit-Learn管道中可以轻松创建和评估模型。

1. 导入库

2. 示例数据

准备文本和标签。

3. 创建管道

TensorFlow/Keras

TensorFlow和Keras等强大的框架可用于更复杂的深度学习任务。

1. 导入库

2. 准备数据

3. 构建和训练模型

结论

通过扩展词袋模型来捕获词语序列并保留单个单词无法提供的上下文,N-grams词袋模型是在自然语言处理(NLP)中一个强大而灵活的工具。这种技术在需要理解词语组合以提高性能的情况下特别有用,例如文本分类、情感分析和语言建模。通过生成N-grams(来自给定文本的n个元素的连续序列),该模型能够更好地区分不同的文本模式并捕获局部词语依赖关系。N-grams词袋模型具有优势,但也存在缺点,包括更高的维度和数据稀疏性,这需要使用高级嵌入和降维技术。然而,正确使用时,该模型仍然是自然语言处理(NLP)的基石,在易用性和捕获重要词语关联的能力之间取得了合理的折衷。


下一个主题TF-IDF模型