# experiment-03 **Repository Path**: az13js/experiment-03 ## Basic Information - **Project Name**: experiment-03 - **Description**: No description available - **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-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Skip-gram 词嵌入与 LSTM 语言模型 一个从零实现的词嵌入模型和基于 LSTM 的下一个 token 预测器,使用 PyTorch 构建。这个项目主要用于学习和理解 NLP 的基本概念。 > ⚠️ **注意**:这是一个学习原型项目,生成的文本质量有限。如果你需要生产级的语言模型,建议使用 Hugging Face Transformers 等成熟库。 ## 项目概述 本项目包含两个主要组件: 1. **Skip-gram 词嵌入模型** (`skipgram_embedding.py`) - 从零实现的 Skip-gram 算法 - 支持词到向量、向量到词的转换 - 可以查找相似词 2. **LSTM 下一个 token 预测器** (`next_token_predictor.py`) - 基于 LSTM 的语言模型 - 使用预训练的词嵌入 - 支持文本生成 ## 环境要求 - Python 3.11+ - PyTorch - NumPy ## 安装 ```bash # 克隆项目 git clone cd experiment-03 # 安装依赖 pip install torch numpy ``` ## 快速开始 ### 1. 训练 Skip-gram 词嵌入 ```python from skipgram_embedding import SkipGramWordEmbedding # 创建模型 model = SkipGramWordEmbedding( embedding_dim=100, # 嵌入维度 window_size=2, # 上下文窗口大小 learning_rate=0.025, # 学习率 min_count=5 # 最小词频 ) # 训练模型 with open("shakespeare.txt", 'r', encoding='utf-8') as f: text = f.read() model.train(text, epochs=10, negative_samples=5) # 保存模型 model.save("shakespeare_model.pkl") ``` ### 2. 使用词嵌入 ```python # 加载模型 model = SkipGramWordEmbedding() model.load("shakespeare_model.pkl") # 词 -> 向量 vector = model.word_to_vector("king") # 向量 -> 词 words = model.vector_to_word(vector, top_k=5) # 查找相似词 similar = model.find_similar_words("king", top_k=5) print(f"与 'king' 相似的词: {similar}") ``` ### 3. 训练 LSTM 预测器 ```python from next_token_predictor import NextTokenPredictor # 加载词嵌入模型 embedding_model = SkipGramWordEmbedding() embedding_model.load("shakespeare_model.pkl") # 创建预测器 predictor = NextTokenPredictor( embedding_model=embedding_model, hidden_dim=128, num_layers=2, dropout=0.3 ) # 训练 with open("shakespeare.txt", 'r', encoding='utf-8') as f: text = f.read() predictor.fit(text, epochs=10, batch_size=32, learning_rate=0.001) # 保存模型 predictor.save("next_token_predictor.pkl") ``` ### 4. 生成文本 ```python # 预测下一个 token predictions = predictor.predict_next_token("To be or not to", top_k=5) print("预测的下一个词:") for word, prob in predictions: print(f" {word}: {prob:.4f}") # 生成文本 generated = predictor.generate( seed_text="To be or not to be", max_length=50, temperature=0.8 ) print(f"生成的文本: {generated}") ``` ## 技术细节 ### Skip-gram 模型 - **算法**:Skip-gram - **优化**:负采样 - **损失函数**:负对数似然 - **默认参数**: - 嵌入维度:100 - 窗口大小:2 - 学习率:0.025 - 最小词频:5 ### LSTM 预测器 - **架构**:2层 LSTM + Dropout + 全连接层 - **输入**:词嵌入向量序列 - **输出**:下一个 token 的概率分布 - **默认参数**: - 隐藏层维度:128 - LSTM 层数:2 - Dropout:0.3 - 上下文窗口:5 ## 当前限制 作为学习原型,本项目有一些已知的限制: 1. **生成质量有限** - 模型容易陷入重复模式 - 生成的文本语义连贯性较差 - 建议仅用于学习和实验 2. **模型规模较小** - LSTM 的隐藏层维度和层数较小 - 对于复杂语言任务可能不够 3. **训练数据单一** - 仅使用莎士比亚文本 - 词汇表覆盖有限 4. **分词简单** - 使用基本的正则表达式分词 - 不处理复杂的语言现象(如缩写) ## 改进方向 如果你想让这个项目更完善,可以考虑: 1. **增大模型规模** - 增加 LSTM 的隐藏层维度和层数 - 使用更深的网络 2. **使用更好的架构** - 尝试 Transformer 架构 - 使用注意力机制 3. **改进分词** - 使用更智能的分词器 - 处理标点、缩写等 4. **增加训练数据** - 使用更多样化的文本 - 扩大词汇表 5. **调优超参数** - 调整学习率、批次大小等 - 尝试不同的优化器 ## 许可证 本项目采用 MIT 许可证 - 详见 [LICENSE](LICENSE) 文件 **免责声明**:本项目仅用于学习和教育目的。生成的文本不应被视为有意义的或准确的内容。对于生产环境,请使用经过充分测试的成熟 NLP 库。