更改

跳到导航 跳到搜索
添加6,083字节 、 2025年6月10日 (二) 10:16
小
第1行: 第1行: −
'''Word2Vec''' 是一种将词语(Word)映射为连续向量(Vector)的高效建模技术,由 Google 的 Tomas Mikolov 团队于 2013 年提出。通过在大规模文本语料中自动学习,Word2Vec 将每个词表示为一个低维、稠密、连续的向量(Embedding),这种向量能够捕捉词语之间的语义和句法关系。与传统将词视为离散 ID 的方法(如 N-gram)不同,Word2Vec 将词嵌入到连续空间中,相似意义的词在向量空间中距离更近,为后续复杂模型(如 Transformer)奠定了基础。
+
'''Word2Vec''' 是一种将词语(Word)映射为连续向量(Vector)的高效建模技术,由 Google 的 Tomas Mikolov 团队于 2013 年提出<ref>Mikolov T, Chen K, Corrado G, et al. Efficient estimation of word representations in vector space[J]. arXiv preprint arXiv:1301.3781, 2013.</ref><ref>Mikolov T, Sutskever I, Chen K, et al. Distributed representations of words and phrases and their compositionality[J]. Advances in neural information processing systems, 2013, 26.</ref>。通过在大规模文本语料中自动学习,Word2Vec 将每个词表示为一个低维、稠密、连续的向量(Embedding),这种向量能够捕捉词语之间的语义和句法关系。与传统将词视为离散 ID 的方法(如 N-gram)不同,Word2Vec 将词嵌入到连续空间中,相似意义的词在向量空间中距离更近,为后续复杂模型(如 Transformer)奠定了基础。
    
Word2Vec 的底层是一个浅层神经网络,采用 Skip-gram 或 Continuous Bag-of-Words(CBOW)两种架构进行训练。训练后得到的词向量(Word Embedding)被广泛应用于自然语言处理(NLP)任务中,包括机器翻译(Machine Translation)、信息检索(Information Retrieval)、文本分类(Text Classification)和情感分析(Sentiment Analysis)等,成为当前 NLP 领域的重要基础方法之一。
 
Word2Vec 的底层是一个浅层神经网络,采用 Skip-gram 或 Continuous Bag-of-Words(CBOW)两种架构进行训练。训练后得到的词向量(Word Embedding)被广泛应用于自然语言处理(NLP)任务中,包括机器翻译(Machine Translation)、信息检索(Information Retrieval)、文本分类(Text Classification)和情感分析(Sentiment Analysis)等,成为当前 NLP 领域的重要基础方法之一。
第481行: 第481行:     
=== Gensim 库 ===
 
=== Gensim 库 ===
−
Gensim 是一个专为主题建模与文档相似度分析设计的 Python 库,其中对 Word2Vec 的支持尤为成熟。支持CBOW与Skip-gram以及负采样和层次softmax加速方法,支持保存为 <code>.bin</code> 或 <code>.txt</code> 格式的词向量模型,兼容其他工具。
+
特点:
 +
 
 +
* 语言:Python
 +
* 功能:
 +
** 支持 CBOW 和 Skip-gram 两种训练模式。
 +
** 提供 负采样(Negative Sampling) 和 层次 Softmax(Hierarchical Softmax) 加速训练。
 +
** 可调整参数:窗口大小、词向量维度、最小词频、训练轮次(epochs)等。
 +
** 支持模型保存为 <code>.bin</code>(二进制)或 <code>.txt</code>(纯文本)格式,兼容其他 NLP 工具(如 FastText、GloVe)。
 +
** 提供 增量训练(继续训练已有模型)和 词汇表更新 功能。
 +
 
 +
示例代码:<syntaxhighlight lang="python">
 +
from gensim.models import Word2Vec
 +
from gensim.models.word2vec import LineSentence  # 用于流式读取大文件
 +
 
 +
# 示例1:基础训练(列表输入)
 +
sentences = [
 +
    ["自然", "语言", "处理", "很", "有趣"],
 +
    ["深度学习", "改变", "了", "NLP"],
 +
    ["Word2Vec", "是", "经典", "算法"]
 +
]
 +
model = Word2Vec(
 +
    sentences=sentences,
 +
    vector_size=300,      # 词向量维度
 +
    window=5,            # 上下文窗口
 +
    min_count=1,          # 最小词频
 +
    workers=4,            # 并行线程数
 +
    sg=1,                # 1=Skip-gram, 0=CBOW
 +
    hs=0,                # 0=负采样, 1=层次Softmax
 +
    negative=5,          # 负采样数
 +
    epochs=10            # 训练轮次
 +
)
 +
 
 +
# 示例2:大文件训练(流式读取)
 +
corpus_path = "corpus.txt"  # 每行一个句子,词语用空格分隔
 +
model = Word2Vec(
 +
    sentences=LineSentence(corpus_path),  # 自动按行流式读取
 +
    vector_size=300,
 +
    window=5,
 +
    min_count=5,        # 过滤低频词
 +
    workers=8
 +
)
 +
 
 +
# 模型使用
 +
print(model.wv["自然"])          # 获取词向量
 +
print(model.wv.most_similar("NLP", topn=3))  # 相似词查询
 +
 
 +
# 模型保存与加载
 +
model.save("word2vec.model")          # 二进制格式
 +
model.wv.save_word2vec_format("vectors.bin", binary=True)  # 兼容原始格式
 +
loaded_model = Word2Vec.load("word2vec.model")
 +
</syntaxhighlight>适用场景:
 +
 
 +
* 快速实验 Word2Vec 模型,适用于中小规模语料(百万级词汇)。
 +
* 需要与其他 Python NLP 工具(如 spaCy、NLTK)集成时。
    
=== TensorFlow / PyTorch 实现 ===
 
=== TensorFlow / PyTorch 实现 ===
 +
特点:
 +
 +
* 语言:Python(基于 TensorFlow/PyTorch 框架)
 +
* 功能:
 +
** 提供更灵活的模型自定义能力(如修改损失函数、调整网络结构)。
 +
** 支持 GPU 加速训练,适合大规模语料(十亿级词汇)。
 +
** 可与其他深度学习模型(如 LSTM、Transformer)结合使用。
 +
 +
TensorFlow 实现示例:<syntaxhighlight lang="python">
 +
import tensorflow as tf
 +
import numpy as np
 +
 +
# 示例:Skip-gram负采样实现
 +
vocab_size = 10000
 +
embedding_dim = 300
 +
num_ns = 5    # 负采样数
 +
 +
# 自定义Word2Vec模型
 +
class Word2Vec(tf.keras.Model):
 +
    def __init__(self):
 +
        super().__init__()
 +
        self.target_embedding = tf.keras.layers.Embedding(
 +
            vocab_size, embedding_dim, input_length=1)
 +
        self.context_embedding = tf.keras.layers.Embedding(
 +
            vocab_size, embedding_dim, input_length=num_ns+1)
 +
       
 +
    def call(self, pair):
 +
        target, context = pair
 +
        # target shape: (batch, 1)
 +
        # context shape: (batch, 1+num_ns)
 +
        word_emb = self.target_embedding(target)      # (batch, 1, dim)
 +
        context_emb = self.context_embedding(context)  # (batch, 1+num_ns, dim)
 +
        return tf.matmul(word_emb, context_emb, transpose_b=True)
 +
 +
# 数据准备(假设已预处理)
 +
target_words = np.random.randint(0, vocab_size, (1000, 1))
 +
context_words = np.random.randint(0, vocab_size, (1000, 6))  # 1正样本+5负样本
 +
 +
# 编译训练
 +
model = Word2Vec()
 +
model.compile(optimizer='adam', loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True))
 +
model.fit(x=(target_words, context_words), epochs=5)
 +
 +
# 获取词向量
 +
embedding_layer = model.get_layer('target_embedding')
 +
word_vectors = embedding_layer.get_weights()[0]
 +
</syntaxhighlight>PyTorch 实现示例:<syntaxhighlight lang="python">
 +
import torch
 +
import torch.nn as nn
 +
# 自定义 Word2Vec 模型(CBOW)
 +
class Word2Vec(nn.Module):
 +
    def __init__(self, vocab_size, embedding_dim):
 +
        super().__init__()
 +
        # 中心词和上下文词共享同一个嵌入矩阵
 +
        self.embeddings = nn.Embedding(vocab_size, embedding_dim)
 +
       
 +
    def forward(self, target, context):
 +
        # target shape: (batch_size,)
 +
        # context shape: (batch_size,)
 +
        target_emb = self.embeddings(target)  # (batch_size, embedding_dim)
 +
        context_emb = self.embeddings(context) # (batch_size, embedding_dim)
 +
       
 +
        # 计算点积得分(Skip-gram目标)
 +
        scores = torch.sum(target_emb * context_emb, dim=1)  # (batch_size,)
 +
        return scores
 +
</syntaxhighlight>
 +
 +
 +
适用场景:
 +
 +
* 需要与深度学习模型联合训练(如文本分类+词向量微调)。
 +
* 研究场景,需自定义 Word2Vec 的变体(如结合注意力机制)。
 +
 +
=== 原始 C 语言实现 ===
 +
 +
特点:
 +
 +
* 语言:C
 +
* 功能:
 +
** Google 官方发布的原始实现,效率极高(适合超大规模语料)。
 +
** 仅支持基本的 Skip-gram 和 CBOW,无负采样或层次 Softmax 优化。
 +
** 输出格式为二进制(<code>.bin</code>)或文本(<code>.txt</code>)词向量。
 +
 +
使用方法:<syntaxhighlight lang="bash">
 +
# 从源码编译(需要gcc)
 +
git clone https://github.com/tmikolov/word2vec
 +
cd word2vec
 +
make
   −
=== 原始 C 语言实现(Google Code) ===
+
# 训练命令详解
 +
./word2vec -train corpus.txt \    # 输入文件(每行一个句子)
 +
          -output vectors.bin \  # 输出词向量
 +
          -size 300 \            # 向量维度
 +
          -window 5 \            # 窗口大小
 +
          -sample 1e-5 \        # 高频词降采样阈值
 +
          -negative 5 \          # 负采样数
 +
          -hs 0 \                # 禁用层次Softmax
 +
          -threads 16 \          # 线程数
 +
          -binary 1 \            # 二进制输出
 +
          -iter 10              # 训练轮次
 +
</syntaxhighlight>适用场景:
    +
* 需要最高训练效率(如 Wikipedia 或 Common Crawl 级别语料)。
 +
* 对模型定制需求低,仅需基础词向量生成。
    
=='''参考文献'''==
 
=='''参考文献'''==
130

个编辑

导航菜单