自然语言处理基础:词的表示(词频向量)

1、词频向量的定义

词频向量(Term Frequency Vector),简单来说,是一种将文本数据转换为数值向量形式的表示方法,用于量化文本中各个词语的出现频率。在自然语言处理(NLP)领域,计算机无法直接处理文本这种非结构化数据,因此需要将其转化为结构化的、计算机能够理解和处理的数值形式,词频向量就是其中一种基础且常用的转化方式。​

具体构建过程如下:首先确定一个固定的词汇表,词汇表包含了在处理任务中可能出现的所有词语;然后对于每一个待处理的文本,统计词汇表中每个词语在该文本中出现的次数,这些次数按照词汇表中词语的顺序依次排列,就构成了一个词频向量。例如,若词汇表为 [“苹果”, “香蕉”, “橘子”],某文本中 “苹果” 出现 3 次,“香蕉” 出现 1 次,“橘子” 出现 0 次,那么该文本对应的词频向量就是 [3, 1, 0] 。

2、词频向量的特点​

(1) 直观性:词频向量的构建方式简单直接,通过向量中的数值能够直观地反映出文本中各个词语的出现频率。人们可以快速了解到文本中哪些词语出现得较为频繁,哪些词语较少出现,从而对文本的大致内容有一个初步的判断。​

(2) 稀疏性:在实际应用中,尤其是当词汇表规模较大时,词频向量往往具有很高的稀疏性。这是因为一篇文本中只会包含词汇表中一小部分词语,大部分词语在该文本中的出现次数为 0。例如,在处理新闻文章时,词汇表可能包含数万个词语,但某一篇具体的新闻文章中可能只涉及其中几百个词语,导致词频向量中大量元素为 0。​

(3) 局部性:词频向量仅仅已关注词语在文本中出现的频率,没有考虑词语的语义信息以及词语之间的顺序关系。它只是从局部角度对文本进行量化表示,无法体现文本的整体语义和上下文语境。​

(4) 简单性:构建词频向量的算法简单易懂,计算复杂度较低,不需要复杂的数学运算和模型训练。这使得在处理大规模文本数据时,能够快速地生成词频向量,提高处理效率。

3、使用词频向量的原因​

(1) 便于计算机处理:如前所述,计算机难以直接处理文本数据,将文本转化为词频向量后,就可以使用各种数学和机器学习算法对其进行分析和处理。例如,通过计算词频向量之间的距离,可以衡量文本之间的相似度,进而应用于文本分类、聚类等任务。​

(2) 提供文本量化特征:词频向量为文本提供了一种量化的特征表示,使得文本数据能够融入到机器学习的模型训练过程中。机器学习模型需要输入的是数值型数据,词频向量正好满足了这一要求,模型可以基于这些量化特征学习文本的模式和规律,从而实现对文本的预测和分类等功能。​

(3) 基础表示方法:词频向量是其他更复杂文本表示方法的基础。许多高级的文本表示技术,如 TF-IDF(Term Frequency-Inverse Document Frequency)、词嵌入(Word Embeddings)等,都是在词频向量的基础上发展而来的。理解和掌握词频向量的概念和方法,有助于进一步学习和应用更先进的文本处理技术。

4、词频向量的应用场景​

(1) 文本分类:在文本分类任务中,将训练集中的文本转换为词频向量,然后使用分类算法(如朴素贝叶斯、支持向量机等)对这些词频向量进行训练,学习不同类别文本的特征模式。训练好的模型可以对新的文本(同样转换为词频向量)进行分类预测,判断其所属的类别。例如,将新闻文章分为政治、经济、文化等不同类别,将用户评论分为正面、负面和中性评价等。

(2) 文本聚类:通过计算词频向量之间的相似度(如余弦相似度),将相似的文本聚集在一起,形成不同的文本簇。这有助于对大量文本进行组织和归纳,发现文本数据中的潜在结构和模式。例如,在对大量学术论文进行聚类时,可以将研究主题相似的论文归为一类,方便用户快速浏览和查找相关研究内容。​

(3) 信息检索:在搜索引擎中,用户输入的查询词和文档都可以表示为词频向量。通过计算查询词向量与文档词向量之间的相似度,按照相似度的高低对文档进行排序,将最相关的文档返回给用户。虽然现代搜索引擎通常采用更复杂的技术,但词频向量在早期的信息检索系统中发挥了重要作用,并且仍然是许多检索算法的基础组成部分。​

(4) 文本相似度计算:比较不同文本之间的相似程度,在剽窃检测、重复内容识别等场景中有广泛应用。通过计算词频向量的相似度,可以判断两篇文本是否存在相似之处,例如检测学生作业是否抄袭,判断新闻报道是否存在重复内容等。

5、词频向量的优点​

(1) 原理简单易懂,实现成本低​

词频向量的构建逻辑非常直观,只需统计词汇表中词语在文本里的出现次数,并按序排列即可。这种简单直接的构建方式,使得其实现过程不需要复杂的数学原理或高级算法,计算复杂度较低。对于初学者而言,很容易理解和掌握;对于开发者来说,在处理大规模文本数据时,能够快速生成词频向量,大幅节省开发时间和计算资源。例如,在一些对处理效率要求较高、数据规模庞大的初步文本处理场景中,词频向量的简单性优势就极为明显,能够快速完成文本的初步量化处理,为后续进一步分析奠定基础 。​

(2) 直观反映文本局部特征​

词频向量通过向量中的数值,能够清晰直观地展现文本中各个词语的出现频率。通过观察词频向量,人们可以迅速了解文本中哪些词语出现得较为频繁,从而对文本的大致内容有一个初步判断。比如在分析一篇关于 “人工智能” 的文章时,若词频向量中 “机器学习”“深度学习”“算法” 等相关词语的频率较高,就能初步推断出文章主要围绕人工智能的技术领域展开。这种直观性在快速浏览和理解大量文本的核心主题方面具有重要作用,方便进行文本的初步筛选和分类。​

(3) 良好的基础兼容性​

词频向量是众多高级文本表示方法的基石,具有很强的兼容性。许多复杂且先进的文本表示技术,如 TF-IDF、词嵌入等,都是在词频向量的基础上发展而来。TF-IDF 通过引入逆文档频率对词频向量进行改进,进一步突出了词语在文档集合中的重要性;词嵌入技术则是在词频向量的启发下,为每个词语学习一个低维的语义向量表示。基于词频向量,研究者和开发者可以不断探索和创新,结合其他技术,开发出更强大、更适合不同应用场景的文本表示方法,以满足多样化的自然语言处理需求。​

(4) 适用于基础文本分析任务​

在一些对语义理解要求不高的基础文本分析任务中,词频向量表现出色。例如文本分类和聚类任务,通过计算词频向量之间的相似度(如余弦相似度),可以有效地将相似的文本聚集在一起或划分到相应类别。在对新闻文章进行简单分类时,仅依据词频向量,利用朴素贝叶斯等分类算法,就能实现对政治、经济、文化等不同类别新闻的初步分类;在文本聚类场景中,也能通过词频向量快速将研究主题相似的学术论文归为一类,帮助用户快速浏览和查找相关内容,完成对大量文本的初步组织和归纳。

6、词频向量的缺点​

(1) 忽略语义信息和词语顺序​

词频向量仅仅已关注词语在文本中的出现频率,完全忽略了词语的语义信息以及词语之间的顺序关系。例如,“我喜欢苹果” 和 “苹果喜欢我” 这两句话,其词频向量可能是相同的,但它们的语义却截然不同;再如 “我爱中国” 和 “中国我爱”,虽然词语相同且词频一样,但表达的语义和侧重点存在明显差异。在需要深入理解文本语义的任务中,如机器翻译、问答系统等,词频向量的这种局限性会严重影响处理效果,无法准确传达文本的真实含义。​

(2) 存在严重的稀疏性问题​

在实际应用中,尤其是当词汇表规模较大时,词频向量往往具有很高的稀疏性。由于一篇文本中只会包含词汇表中一小部分词语,大部分词语在该文本中的出现次数为 0,这就导致词频向量中存在大量的零元素。例如,在处理互联网上的海量文本时,词汇表可能包含几十万甚至上百万个词语,但某一篇具体的文章可能只涉及其中几千个词语,使得词频向量的维度极高且极其稀疏。这种稀疏性不仅会占用大量的存储空间,还会增加计算的复杂度,降低计算效率;同时,稀疏的向量在进行相似度计算等操作时,可能无法准确反映文本之间的真实相似关系,影响后续的分析和处理结果。​

(3) 缺乏对文本全局特征的表达​

词频向量只是从局部角度对文本进行量化表示,它仅考虑了词语在单个文本中的出现频率,没有考虑词语在整个文档集合中的分布情况以及文本的整体结构和语境信息。例如,在分析多篇关于同一主题的文章时,词频向量无法体现这些文章之间的关联和差异,难以从宏观层面把握主题的演变和发展。在处理需要综合考虑文本全局信息的任务,如文本摘要生成、主题建模等场景中,词频向量的这种局限性使得其难以满足需求,无法生成高质量的结果。​

(4) 难以区分词语的重要程度​

词频向量单纯以词语的出现频率来量化文本,无法有效区分词语在文本中的重要程度。一些常见的停用词(如 “的”“了”“是” 等)在文本中可能出现频率较高,但它们对于表达文本的核心内容并没有实质性的帮助;而一些能够真正体现文本主题和关键信息的词语,可能由于文本长度或其他因素,出现频率并不高。在这种情况下,词频向量会过度强调高频词的作用,而忽视低频但重要的词语,导致无法准确突出文本的关键特征,影响对文本的深入分析和理解。

7、词频向量的例子

示例一:电影评论分析

假设我们有一个小型的电影评论数据集,包含以下两条评论:

评论 1:“这部电影剧情精彩,演员演技很棒。”

评论 2:“电影节奏太慢,剧情平淡,不推荐。”

那么数据预处理的过程如下所示:

步骤-1:分词

首先,对这两条评论进行预处理,去除标点符号,并进行分词,得到:

评论 1:“这部 电影 剧情 精彩 演员 演技 很棒”

评论 2:“电影 节奏 太慢 剧情 平淡 不 推荐”

步骤-2:构建词汇表

然后,构建词汇表,将两条评论中出现的所有不重复词语收集起来,得到词汇表:

[“这部”, “电影”, “剧情”, “精彩”, “演员”, “演技”, “很棒”, “节奏”, “太慢”, “平淡”, “不”, “推荐”],

该词汇表长度为 12。

步骤-3:生成词频向量

接下来,根据词汇表,统计每个词语在各条评论中出现的次数,生成词频向量:

【1】对于评论 1

“这部” 出现 1 次,

“电影” 出现 1 次,

“剧情” 出现 1 次,

“精彩” 出现 1 次,

“演员” 出现 1 次,

“演技” 出现 1 次,

“很棒” 出现 1 次,

其余词语出现 0 次,

所以评论 1 的词频向量为 [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]。

【2】对于评论 2

“电影” 出现 1 次,

“剧情” 出现 1 次,

“节奏” 出现 1 次,

“太慢” 出现 1 次,

“平淡” 出现 1 次,

“不” 出现 1 次,

“推荐” 出现 1 次,

其余词语出现 0 次,

所以评论 2 的词频向量为 [0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1]。

通过这两个词频向量,我们可以直观地看到两条评论中词语的出现情况,后续还能基于此进行评论相似度计算、情感分类等分析。

示例二:商品评价分析

以某电商平台上的手机评价为例,有以下两条用户评价:

评价 1:“手机拍照清晰,电池续航久,非常满意。”

评价 2:“手机屏幕有划痕,性能一般,不太好。”

步骤-1:分词

同样,先对评价进行预处理,分词后得到:

评价 1:“手机 拍照 清晰 电池 续航 久 非常 满意”

评价 2:“手机 屏幕 有 划痕 性能 一般 不太 好”

构建词汇表:

[“手机”, “拍照”, “清晰”, “电池”, “续航”, “久”, “非常”, “满意”, “屏幕”, “有”, “划痕”, “性能”, “一般”, “不太”, “好”],词汇表长度为 15。

步骤-2:生成词频向量

评价 1 的词频向量:[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]

评价 2 的词频向量:[1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1]

8、PyTorch实现相似度计算

(1) 数据准备

基于 “示例一:电影评论分析”,我们有以下两条电影评论及其对应的词频向量:

评论 1:“这部电影剧情精彩,演员演技很棒。”,词频向量为 [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]

评论 2:“电影节奏太慢,剧情平淡,不推荐。”,词频向量为 [0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1]

在 PyTorch 中,我们需要将这些词频向量转换为张量(Tensor)格式,方便进行计算。

(2) 计算步骤

【1】导入必要的库

首先,导入 PyTorch 库,它提供了丰富的张量操作和数学计算功能,用于实现相似度计算。

import torch

【2】将词频向量转换为张量

将上述两条评论的词频向量分别转换为 PyTorch 张量。

review1_vector = torch.tensor([1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0], dtype=torch.float32)

review2_vector = torch.tensor([0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1], dtype=torch.float32)

【3】计算余弦相似度

在自然语言处理中,常用于衡量向量之间相似度的方法是余弦相似度。它通过计算两个向量夹角的余弦值来判断向量的相似程度,余弦值越接近 1,说明两个向量越相似。在 PyTorch 中,可以使用 torch.nn.functional.cosine_similarity 函数来计算余弦相似度。

import torch.nn.functional as F

similarity = F.cosine_similarity(review1_vector.unsqueeze(0), review2_vector.unsqueeze(0), dim=1)

这里使用 unsqueeze(0) 函数为张量增加一个维度,因为 cosine_similarity 函数要求输入的张量至少是二维的,dim=1 表示在维度 1 上进行相似度计算。

(3) 结果输出

运行上述代码后,得到的 similarity 张量即为两条评论词频向量的余弦相似度值。我们将其打印出来查看具体结果。

print(f”两条电影评论的余弦相似度为: {similarity.item()}”)

假设运行结果为 0.3333333432674408(实际运行结果以代码为准),这表明这两条电影评论在基于词频向量的表示下,具有一定的相似度,但相似度并不高。从评论内容也可以看出,两条评论虽然都围绕电影展开,但描述的方面和情感倾向有明显差异,与计算得到的相似度结果相符合。

PyTorch 计算电影评论词频向量相似度的完整过程:

import torch

review1_vector = torch.tensor([1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0], dtype=torch.float32)

review2_vector = torch.tensor([0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1], dtype=torch.float32)

import torch.nn.functional as F

similarity = F.cosine_similarity(review1_vector.unsqueeze(0), review2_vector.unsqueeze(0), dim=1)

print(f”两条电影评论的余弦相似度为: {similarity.item()}”)

代码详细注释:

# 导入PyTorch库,它是一个用于深度学习和张量计算的Python库

import torch

# 创建表示第一条电影评论的词频向量

# 向量中的每个元素对应词汇表中一个词的出现次数

# 此向量对应评论:”这部电影剧情精彩,演员演技很棒。”

review1_vector = torch.tensor([1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0], dtype=torch.float32)

# 创建表示第二条电影评论的词频向量

# 此向量对应评论:”电影节奏太慢,剧情平淡,不推荐。”

review2_vector = torch.tensor([0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1], dtype=torch.float32)

# 导入PyTorch的神经网络功能模块,简称为F

# 该模块包含了许多常用的函数,如激活函数、损失函数和相似度计算函数

import torch.nn.functional as F

# 计算两条评论词频向量之间的余弦相似度

# cosine_similarity函数期望输入是二维张量,因此使用unsqueeze(0)增加一个批次维度

# review1_vector.unsqueeze(0)将向量从[12]形状变为[1, 12]

# review2_vector.unsqueeze(0)同理

# dim=1指定在第二个维度(索引为1)上计算余弦相似度

similarity = F.cosine_similarity(review1_vector.unsqueeze(0), review2_vector.unsqueeze(0), dim=1)

# 打印计算结果

# similarity是一个包含单个值的张量,使用.item()方法获取其标量值

print(f”两条电影评论的余弦相似度为: {similarity.item()}”)

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
微光GlimmerStudio的头像 - 宋马
评论 抢沙发

请登录后发表评论

    暂无评论内容