# 简易 Skip-gram 词嵌入库 **Repository Path**: az13js/simple-skipgram ## Basic Information - **Project Name**: 简易 Skip-gram 词嵌入库 - **Description**: 一个轻量级的、从零实现的 Skip-gram 词嵌入库,使用纯 Python 编写。支持词与向量的双向转换、语义学习和模型持久化,无需 gensim 等外部依赖。 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-02-04 - **Last Updated**: 2026-02-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Skip-gram 词嵌入实现 这是一个从零实现的 Skip-gram 词嵌入模型,完全使用 Python 和 NumPy 编写。 ## 功能特性 ✅ **词 -> 向量转换**: 将单词转换为稠密的低维向量 ✅ **向量 -> 词转换**: 通过余弦相似度查找最相似的词 ✅ **查找相似词**: 找到语义上相似的单词 ✅ **模型保存/加载**: 支持持久化存储 ✅ **完全自包含**: 不需要 gensim 等外部库 ## 快速开始 ### 1. 导入模块 ```python from skipgram_embedding import SkipGramWordEmbedding ``` ### 2. 创建模型 ```python model = SkipGramWordEmbedding( embedding_dim=100, # 嵌入维度(推荐 50-300) window_size=2, # 上下文窗口大小 learning_rate=0.025, # 学习率 min_count=5 # 最小词频阈值 ) ``` ### 3. 训练模型 ```python # 读取你的文本数据 with open('shakespeare.txt', 'r', encoding='utf-8') as f: text = f.read() # 训练模型 model.train( text=text, epochs=10, # 训练轮数 negative_samples=5, # 负采样数量 verbose=True # 显示训练进度 ) ``` ### 4. 使用模型 #### 词 -> 向量 ```python vector = model.word_to_vector("love") print(f"向量维度: {len(vector)}") # 输出: 100 print(f"向量前5维: {vector[:5]}") ``` #### 向量 -> 词 ```python # 查找与给定向量最相似的词 words = model.vector_to_word(vector, top_k=5) for word, similarity in words: print(f"{word}: {similarity:.4f}") ``` #### 查找相似词 ```python # 查找与 "love" 最相似的词 similar_words = model.find_similar_words("love", top_k=5) for word, similarity in similar_words: print(f"{word}: {similarity:.4f}") ``` ### 5. 保存和加载模型 ```python # 保存模型 model.save("my_model.pkl") # 加载模型 new_model = SkipGramWordEmbedding() new_model.load("my_model.pkl") ``` ## 完整示例 ```python from skipgram_embedding import SkipGramWordEmbedding # 读取文本 with open('shakespeare.txt', 'r', encoding='utf-8') as f: text = f.read() # 创建并训练模型 model = SkipGramWordEmbedding( embedding_dim=100, window_size=2, learning_rate=0.025, min_count=5 ) model.train(text, epochs=10, negative_samples=5, verbose=True) # 打印统计信息 model.print_statistics() # 测试词 -> 向量 vector = model.word_to_vector("king") print(f"'king' 的向量: {vector[:5]}") # 测试向量 -> 词 words = model.vector_to_word(vector, top_k=5) print(f"最相似的词: {[w for w, s in words]}") # 查找相似词 similar = model.find_similar_words("king", top_k=5) print(f"与 'king' 相似的词: {[w for w, s in similar]}") # 保存模型 model.save("shakespeare_model.pkl") ``` ## 参数说明 | 参数 | 类型 | 默认值 | 说明 | |------|------|--------|------| | `embedding_dim` | int | 100 | 嵌入向量的维度,推荐 50-300 | | `window_size` | int | 2 | 上下文窗口大小 | | `learning_rate` | float | 0.025 | 学习率 | | `min_count` | int | 5 | 最小词频阈值,低于此值的词会被过滤 | ## 训练参数 | 参数 | 类型 | 默认值 | 说明 | |------|------|--------|------| | `text` | str | - | 训练文本 | | `epochs` | int | 5 | 训练轮数 | | `negative_samples` | int | 5 | 负采样数量 | | `verbose` | bool | True | 是否显示训练进度 | ## 技术细节 ### Skip-gram 原理 Skip-gram 是 Word2Vec 的两种架构之一,其核心思想是: 1. **给定中心词,预测上下文词** - 例如:给定 "cat",预测 ["the", "sat", "on", "mat"] 2. **通过负采样提高效率** - 正样本:中心词和上下文词对 - 负样本:随机采样的词对 3. **学习语义表示** - 相似的词会在向量空间中靠得更近 - 可以捕捉词与词之间的语义关系 ### 数学原理 对于每个中心词-上下文词对 (w, c): - 正样本损失:L_pos = -log(σ(u_c · v_w)) - 负样本损失:L_neg = -Σ log(1 - σ(u_n · v_w)) - 总损失:L = L_pos + L_neg 其中: - v_w 是中心词 w 的嵌入向量 - u_c 是上下文词 c 的嵌入向量 - σ 是 sigmoid 函数 ## 性能优化建议 1. **增加训练数据**: 更多的文本数据会提升模型质量 2. **调整嵌入维度**: - 小数据集:50-100 维 - 中等数据集:100-200 维 - 大数据集:200-300 维 3. **增加训练轮数**: 10-20 轮通常足够 4. **调整窗口大小**: 2-5 是常用的范围 ## 常见问题 **Q: 训练很慢怎么办?** A: 可以减少 epochs、增加 min_count、或者使用更小的 embedding_dim **Q: 相似词结果不理想?** A: 增加训练数据量、增加训练轮数、调整窗口大小 **Q: 如何处理不在词汇表中的词?** A: 模型会返回 None,你可以使用 `` 标记或重新训练 ## 许可证 MIT License ## 作者 张伟 & AI Assistant --- 祝你使用愉快!🎉