【AIGC篇】文本表示方法比较:词袋模型 vs. 词向量

引言

在开始之前,我们先介绍一下我们AIGC系列,今天我们用的colab平台,没有接触过的小伙伴也可以去看一下

【AIGC篇】NLP任务入门:分词、词性标注与命名实体识别 - 掘金 (juejin.cn)

在自然语言处理领域,文本表示是一个关键问题,它涉及如何将文字信息转换成计算机能够理解的形式。在文本表示的方法中,词袋模型和词向量是两种常见的技术。本文将对这两种方法进行比较,探讨它们的优缺点以及在不同应用场景中的适用性。

介绍

词袋模型 (Bag of Words,简称BoW)和词向量(Word Embeddings)是自然语言处理(NLP)中常用的两种文本表示方法。

1. 词袋模型(Bag of Words,BoW):

  • 定义: 词袋模型将文本看作是一个无序的词语集合,忽略了词语之间的顺序和语法结构。在这个模型中,文本被表示为一个由词汇表中所有词组成的向量,每个维度对应一个词,而向量中的值表示该词在文本中出现的次数。
  • 过程: 首先构建文本的词汇表,然后统计每个词在文本中的出现次数,最终形成一个向量表示。
  • 优缺点: 词袋模型简单易实现,适用于大规模文本数据处理,但无法捕捉词语之间的顺序关系,导致丢失了一部分语义信息。

2. 词向量(Word Embeddings):

  • 定义: 词向量是一种更为先进的文本表示方法,通过将每个词映射到一个固定维度的实数向量空间中,从而保留了词语之间的语义关系。词向量模型能够捕捉词语的语义信息,使得相似的词在向量空间中距离较近。
  • 过程: 常见的词向量模型包括Word2Vec、GloVe(Global Vectors for Word Representation)和FastText等,它们通过学习词语的分布式表示来构建词向量。
  • 优缺点: 词向量考虑了语义关系,维度相对较低,但需要大量的数据进行训练,而且无法有效处理未在训练数据中出现的词。

实践

1.使用CountVectorizer库构建词袋模型

词袋模型是一种简单而直观的文本表示方法,我们可以使用Python通过以下步骤实现:

  1. 构建词汇表: 创建一个包含所有文档中出现的唯一词汇的列表。

  2. 生成词袋向量: 对于每个文档,统计词汇表中每个词在文档中出现的次数,并形成一个向量表示文档。

下面我们用一个简单的Python代码示例:

python 复制代码
from sklearn.feature_extraction.text import CountVectorizer

# 示例文本数据
documents = [
    "This is the first document.",
    "This document is the second document.",
    "And this is the third one.",
    "Is this the first document?"
]

# 使用CountVectorizer构建词袋模型
vectorizer = CountVectorizer()

# 对文本进行拟合和转换
X = vectorizer.fit_transform(documents)

# 获取词袋模型的词汇表
vocab = vectorizer.get_feature_names_out()

# 将稀疏矩阵转换为密集矩阵
dense_matrix = X.toarray()

# 显示词袋模型的结果
print("词汇表:", vocab)
print("词袋向量:")
print(dense_matrix)

代码运行后结果如图上,

  • 词汇表中的词汇是由所有文档中出现的唯一词语构成的。
  • 词袋向量的每一行代表一个文档,每一列对应词汇表中的一个词。向量中的值表示该词在文档中出现的次数。
  • 例如,第一个文档中包含单词 "document" 一次、"first" 一次、"is" 一次等,因此对应的词袋向量的第一行为 [0, 1, 1, 1, 0, 0, 1, 0, 1]

这就是词袋模型的基本原理,通过这种方式,文本信息被转化为了可以被机器学习算法处理的数字形式。

这个示例中使用了CountVectorizer类,它是scikit-learn库提供的一个工具,用于将文本转换为词袋模型表示。在实际应用中,我们可以使用更大规模的文本数据,并根据需求对CountVectorizer进行参数配置,以适应特定的任务。

2.使用Python中的gensim库来训练词向量模型

python 复制代码
from gensim.models import Word2Vec
from nltk.tokenize import word_tokenize
import nltk
import numpy as np

nltk.download('punkt')  # 下载所需的nltk数据

# 示例文本数据
corpus = [
    "This is the first document.",
    "This document is the second document.",
    "And this is the third one.",
    "Is this the first document?"
]

# 对文本进行分词
tokenized_corpus = [word_tokenize(sentence.lower()) for sentence in corpus]

# 训练Word2Vec模型
model = Word2Vec(sentences=tokenized_corpus, vector_size=100, window=5, min_count=1, workers=4)

# 获取词向量
word_vectors = model.wv

# 查看单词的词向量(部分向量)
for word in word_vectors.key_to_index:
    # 只显示前五个维度
    partial_vector = np.round(word_vectors[word][:5], 3)
    print(f"{word}: {partial_vector} ...")

词向量: 是由一系列数字组成的向量。这些数字表示了每个单词在高维空间中的位置。在这个例子中,我们只显示了每个词向量的前五个维度(通过 [:5] 实现),以简化输出。

现在我们得到的结果是比较冗杂的数字数据,我们可以凭借这些词向量数据对自然语言做进一步处理。

  1. 词语相似度计算: 利用词向量,你可以计算两个词语之间的相似度。相似度通常通过计算两个向量之间的余弦相似度来实现。这在搜索引擎中的查询扩展、拼写纠正等方面很有用。
python 复制代码
similarity = word_vectors.similarity('document', 'second')
print(f"相似度:{similarity}")
  1. 找到相似词汇: 可以找到在向量空间中与给定词语相似的其他词汇,这对于推荐系统或者自动补全等任务非常有用。
python 复制代码
similar_words = word_vectors.most_similar('document', topn=5)
print(f"与 'document' 相似的词汇:{similar_words}")
  1. 词语之间的关系: 通过词向量,你可以找到词语之间的语义关系,例如 "king - man + woman = queen" 的经典例子。
python 复制代码
relationship = word_vectors.most_similar['document', 'second'], negative=['one'], topn=1)
print(f"关系推断:{relationship}")

这里只是一些例子,词向量在NLP中的广泛应用还包括机器翻译、文档聚类、情感分析等。

总结

二者区别:

  1. 表示方式: 词袋模型表示文本为一个包含词频信息的向量,而词向量通过学习得到实数向量,更能表达词语之间的语义关系。
  2. 维度: 词袋模型的维度较高,且是稀疏的,而词向量是连续、低维度的。
  3. 语义关系: 词向量能够更好地捕捉词语的语义关系,使得相似词在向量空间中距离较近。

总的来说,词袋模型适用于简单的文本表示任务,而词向量模型在处理更为复杂的语义关系时表现更好。选择哪种方法取决于具体的任务需求和数据特点。

相关推荐
csdnLN5 分钟前
$.ajax() 对应事件done() 、fail()、always() 的用法
前端·javascript·ajax
甜味橘阳5 分钟前
echarts地图可视化展示
前端·javascript·echarts
静静AI学堂20 分钟前
Yolo11改策略:卷积改进|SAC,提升模型对小目标和遮挡目标的检测性能|即插即用
人工智能·深度学习·目标跟踪
三天不学习21 分钟前
C# 中的记录类型简介 【代码之美系列】
后端·c#·微软技术·record·记录类型
martian66543 分钟前
【人工智能离散数学基础】——深入详解数理逻辑:理解基础逻辑概念,支持推理和决策系统
人工智能·数理逻辑·推理·决策系统
Schwertlilien44 分钟前
图像处理-Ch7-图像金字塔和其他变换
图像处理·人工智能
任小永的博客1 小时前
VUE3+django接口自动化部署平台部署说明文档(使用说明,需要私信)
后端·python·django
bloxed1 小时前
前端文件下载多方式集合
前端·filedownload
凡人的AI工具箱1 小时前
每天40分玩转Django:Django类视图
数据库·人工智能·后端·python·django·sqlite
余生H1 小时前
前端Python应用指南(三)Django vs Flask:哪种框架适合构建你的下一个Web应用?
前端·python·django