引言
在开始之前,我们先介绍一下我们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通过以下步骤实现:
构建词汇表: 创建一个包含所有文档中出现的唯一词汇的列表。
生成词袋向量: 对于每个文档,统计词汇表中每个词在文档中出现的次数,并形成一个向量表示文档。
下面我们用一个简单的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
库来训练词向量模型
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]
实现),以简化输出。
现在我们得到的结果是比较冗杂的数字数据,我们可以凭借这些词向量数据对自然语言做进一步处理。
- 词语相似度计算: 利用词向量,你可以计算两个词语之间的相似度。相似度通常通过计算两个向量之间的余弦相似度来实现。这在搜索引擎中的查询扩展、拼写纠正等方面很有用。
similarity = word_vectors.similarity('document', 'second')
print(f"相似度:{similarity}")
- 找到相似词汇: 可以找到在向量空间中与给定词语相似的其他词汇,这对于推荐系统或者自动补全等任务非常有用。
similar_words = word_vectors.most_similar('document', topn=5)
print(f"与 'document' 相似的词汇:{similar_words}")
- 词语之间的关系: 通过词向量,你可以找到词语之间的语义关系,例如 “king – man + woman = queen” 的经典例子。
relationship = word_vectors.most_similar['document', 'second'], negative=['one'], topn=1)
print(f"关系推断:{relationship}")
这里只是一些例子,词向量在NLP中的广泛应用还包括机器翻译、文档聚类、情感分析等。
总结
二者区别:
- 表示方式: 词袋模型表示文本为一个包含词频信息的向量,而词向量通过学习得到实数向量,更能表达词语之间的语义关系。
- 维度: 词袋模型的维度较高,且是稀疏的,而词向量是连续、低维度的。
- 语义关系: 词向量能够更好地捕捉词语的语义关系,使得相似词在向量空间中距离较近。
总的来说,词袋模型适用于简单的文本表示任务,而词向量模型在处理更为复杂的语义关系时表现更好。选择哪种方法取决于具体的任务需求和数据特点。