词嵌入模型(Word Embeddings)——Word2Vec
- 简介:Word2Vec 是由 Google 团队提出的一种词嵌入方法,通过神经网络模型将词语映射到一个低维的连续向量空间中。你可以直接通过它训练生成词向量,也就是一个新的Word2Vec,也可以使用预训练好的词向量,也就是那里直接用。它有两种模型结构:CBOW(Continuous Bag of Words)和 Skip-Gram。
- CBOW(连续词袋模型):
- 预测上下文词语的中心词语。输入是上下文词语,输出是中心词语。
- 适合处理小数据集,训练速度较快。
- Skip-Gram:
- 预测中心词语的上下文词语。输入是中心词语,输出是上下文词语。
- 适合处理大数据集,能够生成更高质量的词向量。
- CBOW(连续词袋模型):
- 优点
- 能捕捉词语的语义关系和语法特性。
- 计算效率高,能够处理大规模语料库。
- 可以使用预训练的词向量进行迁移学习。
- 缺点
- 需要大量的语料库进行训练。
- 无法直接处理未见过的词语(OOV,Out of Vocabulary)。
一、自训练Word2Vec
from gensim.models import Word2Vec
# 假设有一个大规模的语料库corpus,是一个列表,每个元素是一个分好词的文本列表
# 举个例子corpus,
corpus = [
"这个产品非常好,我很喜欢。",
"客服服务态度非常差。",
"物流速度太慢了,等了好久。",
"产品质量不错,但价格有点贵。",
"售后服务很好,很满意。"
]
corpus = [list(jieba.cut(s)) for s in corpus]
# 设置 Word2Vec 模型的参数
vector_size = 100 # 设置词向量的维度
window = 5 # 窗口大小,控制上下文窗口的大小
min_count = 1 # 最小词频,过滤掉低频词
sg = 0 # 0表示使用 CBOW 模型,1示使用 Skip-Gram 模型
# 训练 Word2Vec 模型
model = Word2Vec(corpus, vector_size=vector_size, window=window, min_count=min_count, sg=sg)
# 举个例子
# 我们要对电影评论进行情感分析,假设我们已经有了一个基于大量电影评论数据训练好的Word2Vec模型。在这个模型中,每个词被映射为一个高维向量。这里假设的我们已有的模型,就是通过上面的方式训练出来的。训练好之后,再保存该模型。使用时加载该模型,实现文本向量化
但是这里你是否有个疑问,如果是大规模语料库,那全部需要一次放到这个列表里吗?能放得下或者合适吗?
首先讲能不能放的下,在 Python 中,列表(List)的大小理论上是受限于系统的可用内存。因此,如果系统内存足够大,并且你有足够的空间来存储数据,那么理论上可以将非常大的数据存储在一个列表中。
然而,实际上在处理大规模数据时,需要考虑的问题不仅仅是内存大小,还包括数据读取、处理效率以及系统资源的管理等方面。特别是在处理大规模语料库时,如果一次性加载整个语料库到内存中可能会遇到内存压力的问题和处理效率的问题。
因此,对于大规模数据的处理,常见的方法包括:
-
分批次处理: 将数据分成多个小批次进行处理,每次处理一部分数据,可以减少单次内存消耗,并且可以逐步积累模型的信息。
-
增量学习: 如果数据不断增加,可以采用增量学习的方法,先训练部分数据,然后逐步添加新数据并更新模型。
-
分布式计算: 对于非常大的数据集,可以考虑使用分布式计算框架(如Spark、TensorFlow分布式等),在多台计算机上并行处理和训练数据,以提高效率和处理能力。
下面代码实现分批次处理和增量学习的方法:
分批次处理的方法
from gensim.models import Word2Vec
import logging
import os
import tempfile
import shutil
# 设置日志级别以便查看进度
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
# 定义一个函数来分批次读取语料库文件
def read_corpus(file_path, chunk_size=10000):
with open(file_path, 'r', encoding='utf-8') as f:
lines =</