| 第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 级别语料)。 |
| | + | * 对模型定制需求低,仅需基础词向量生成。 |
| | | | |
| | =='''参考文献'''== | | =='''参考文献'''== |