【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. 语义关系: 词向量能够更好地捕捉词语的语义关系,使得相似词在向量空间中距离较近。

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

相关推荐
江_小_白1 小时前
自动驾驶之激光雷达
人工智能·机器学习·自动驾驶
yusaisai大鱼2 小时前
TensorFlow如何调用GPU?
人工智能·tensorflow
Estar.Lee2 小时前
查手机号归属地免费API接口教程
android·网络·后端·网络协议·tcp/ip·oneapi
y先森3 小时前
CSS3中的伸缩盒模型(弹性盒子、弹性布局)之伸缩容器、伸缩项目、主轴方向、主轴换行方式、复合属性flex-flow
前端·css·css3
前端Hardy3 小时前
纯HTML&CSS实现3D旋转地球
前端·javascript·css·3d·html
susu10830189113 小时前
vue3中父div设置display flex,2个子div重叠
前端·javascript·vue.js
IT女孩儿4 小时前
CSS查缺补漏(补充上一条)
前端·css
2401_857610034 小时前
SpringBoot社团管理:安全与维护
spring boot·后端·安全
凌冰_4 小时前
IDEA2023 SpringBoot整合MyBatis(三)
spring boot·后端·mybatis
珠海新立电子科技有限公司5 小时前
FPC柔性线路板与智能生活的融合
人工智能·生活·制造