PyTorch复现CBOW词向量:从数据管道到训练避坑全记录
简介面向自然语言处理入门者与PyTorch实践者的词向量模型资源包聚焦词嵌入基础原理与实际应用。通过练习小型英文语料1803词训练CBOW或Skip-gram模型帮助理解将词汇映射为高维向量、捕捉语义关系的完整流程。资源共6个文件其中3个py文件分别负责数据集读取、模型定义与主训练流程2个pyc为预编译缓存1个txt为原始文本数据整体压缩包仅10KB轻量易上手。包内代码覆盖文本预处理、词汇表构建、One-Hot编码输入、MLP结构及交叉熵损失优化等关键环节并附有PyTorch自动梯度训练示例便于读者直接运行和修改参数。已有3110人学习适合用于课程实验、自学实践或作为NLP项目的基础工具脚本读者可从中掌握数据预处理、模型搭建和词向量评估的完整思路。1. 词向量模型从稀疏编码到语义嵌入PyTorch 复现的价值做自然语言处理时最烦的第一件事就是文本表示。拿中文分词后的一万个词去 one-hot每条样本就有一万维而且大部分是零计算量扛不住词之间也没有任何语义关系。真正让模型能理解国王和王后接近的是分布式词向量。基于 PyTorch 实现词向量模型不只是调一个接口而是要亲手把训练数据、网络结构、损失函数和采样策略串起来这样后面做文本分类、序列标注或对话系统时你才清楚 embedding 层到底在学什么。这篇笔记从原理到代码再到训练完怎么验证效果把我在一个模拟项目里复现 CBOW 模型的完整过程写出来新手能照着跑熟手能避开几个常见的坑。2. 模型选型和数据准备为什么用 CBOW 而不是 Skip-gram2.1 从 one-hot 到分布式表示词向量要解决的核心问题传统的 one-hot 编码把每个词表示成词典长度的向量某个位置是 1其余是 0。这在人工智能和机器学习入门时很直观但实际用起来有三个要命的问题一是维度灾难十万词就要十万维的稀疏向量内存和算力都浪费二是词汇鸿沟任何两个词的 one-hot 内积都是 0模型完全学不到猫和狗都是宠物这种关系三是参数爆炸如果把这个表示直接接到神经网络里第一层权重矩阵就是词典大小乘隐藏层大小直接会让训练失控。词向量word embedding的思路完全不同它把每个词映射成一个低维稠密向量比如 100 或 300 维让模型在训练过程中自动把语义相近的词放到向量空间相近的位置。这种分布式表示的核心假设是语义相近的词其上下文也相似也就是著名的分布假说。你用 PyTorch 的nn.Embedding就能实现最简单的可训练词向量但真正有价值的词向量模型必须让这个词表参与上下文预测任务让损失函数把语义逼出来。2.2 CBOW 和 Skip-gram 的本质区别与选型依据词向量模型里最常见的是 Word2vec 的两种结构。CBOW 是根据上下文词预测中心词Skip-gram 是根据中心词预测上下文词。两者看起来对称但实际行为不一样。CBOW 训练速度快对高频词效果好适合语料比较大但你只想快速得到词向量表示的项目Skip-gram 对低频词更友好能捕捉更丰富的语义但训练时间明显更长。我这次在模拟项目 X 里用的是 CBOW因为语料是几万条电商评论高频词多而且我需要快速迭代看效果。如果你要处理的是专业领域的小语料比如法律文书或医疗病历低频术语占比高那 Skip-gram 更合适。选型时还要考虑负采样这两种结构都能配合负采样来加速训练本质上是把多分类 softmax 变成二分类避免每次都要计算整个词典的概率分布。2.3 数据预处理分词、构建词表和上下文窗口确定了模型结构下一步是准备数据。我用的是 Python 加 jieba 做中文分词但这里有个容易翻车的点分词粒度直接影响词表质量。之前我在一个项目里直接用默认词典切结果不和好被切开导致不好的语义被拆散。我一般会先加载一个领域自定义词典把常见品牌名、专业术语先固定。import jieba from collections import Counter corpus [ 这款手机屏幕清晰电池耐用, 电池续航一般屏幕偏暗, 物流很快包装严实 ] def tokenize(text): # 加载自定义词典后用精确模式分词 return [w for w in jieba.cut(text) if w.strip()] sentences [tokenize(sent) for sent in corpus] word_counts Counter(w for sent in sentences for w in sent) vocab {word: i for i, (word, _) in enumerate(word_counts.items())} print(vocab) # 输出类似 {这款: 0, 手机: 1, 屏幕: 2, 清晰: 3, ...}这段代码做了三件事分词、统计词频、构建词到索引的映射。注意vocab的构建顺序是按词频降序这样高频词获得小索引后面做负采样时方便按词频做权重。这里有个参数细节要不要过滤超低频词我一般把出现次数少于 5 的词直接丢弃否则词表太大会让负采样和输出层计算都变慢。如果你语料很小可以把阈值降到 3这需要根据实际数据量调节。2.4 生成训练样本滑窗采样与正负样本CBOW 的训练样本是上下文词序列 - 中心词。用一个窗口大小为window_size的滑动窗口遍历每个句子窗内的词作为上下文中间位置词作为标签。这里有个隐藏的参数如果窗口大小为 5是上下文各取 5 个词还是总共 5 个词我踩过坑这里用代码说明。def generate_cbow_samples(sentences, vocab, window_size2): samples [] for sent in sentences: token_ids [vocab[w] for w in sent if w in vocab] for i, center in enumerate(token_ids): context [] # 从左边取 window_size 个右边取 window_size 个 for j in range(max(0, i-window_size), i): context.append(token_ids[j]) for j in range(i1, min(len(token_ids), iwindow_size1)): context.append(token_ids[j]) if len(context) 0: samples.append((context, center)) return samples samples generate_cbow_samples(sentences, vocab, window_size2) print(samples[:2]) # [([1, 2, 0], 3), ...] 上下文索引列表和中心词索引注意这里窗口是左右各window_size个词但实际代码里左边界用了max(0, i-window_size)右边界用了min(len(token_ids), iwindow_size1)这是为了防止句子开头和结尾越界。很多人喜欢用固定步长采样但标准做法是每个中心词都生成一个样本这样训练更充分。另外如果上下文长度不足窗口大小直接跳过不要补零因为补零会让模型学到填充词的虚假特征。3. 构建 PyTorch 数据管道从 Python 列表到可训练的 Tensor3.1 数据集的必要封装Dataset 与 DataLoader 的配合直接用 Python 列表打循环训练当然可以但 PyTorch 的DataLoader能自动做 batch、乱序和内存管理。我习惯把样本封装成Dataset子类这样代码结构清晰而且后期要换成负采样或动态生成样本也能无缝衔接。import torch from torch.utils.data import Dataset, DataLoader class CbowDataset(Dataset): def __init__(self, samples): # samples 是 (context_ids, center_id) 的列表 self.contexts torch.LongTensor([s[0] for s in samples]) self.centers torch.LongTensor([s[1] for s in samples]) def __len__(self): return len(self.contexts) def __getitem__(self, idx): return self.contexts[idx], self.centers[idx]这里我把contexts直接构造成LongTensor因为nn.Embedding要求索引是整数类型。新手常犯的错误是把索引转成FloatTensor然后模型直接报类型不匹配。另一个细节是上下文长度可能不一致所以如果不用 PyTorch 的自动 padding就必须保存可变长度列表在collate_fn里手动处理。我这里生产样本时已经固定了左右窗口但窗口边缘的样本长度会小于2*window_size所以需要一个collate_fn。3.2 用 collate_fn 处理变长上下文标准的DataLoader要求每个 batch 内张量形状一致但 CBOW 的上下文长度天然是变长的。有两种解法一是把所有上下文都截取到固定长度比如只取前后各window_size个词如果不够就随机重复或忽略二是用collate_fn动态堆叠。我倾向第二种因为不引入无效填充。def collate_batch(batch): context_list, center_list [], [] max_len max(len(c) for c, _ in batch) for context, center in batch: # 简单方式把短序列左边补 0右边也补 0这里用 -1 标记 padded context [-1] * (max_len - len(context)) context_list.append(padded) center_list.append(center) ctx torch.LongTensor(context_list) ctr torch.LongTensor(center_list) return ctx, ctr dataloader DataLoader(CbowDataset(samples), batch_size32, shuffleTrue, collate_fncollate_batch)如果你用 -1 做 padding模型里的nn.Embedding就会去查索引 -1直接报错。所以要么用 0 且词典从 1 开始索引把 0 留给填充符要么在 embedding 之前把 -1 替换成 0。我一般让 vocabulary 里保留一个pad_token0所有正常词的索引从 1 开始。这个细节后面避坑章会再提。3.3 负采样样本生成不能只在数据预处理时做CBOW 最大的加速点在于负采样也就是正样本是上下文中心词组合负样本是上下文随机词组合。模型要做的不是预测整个词典概率而是判断一个词是不是真实中心词。负采样一般在训练时动态生成而不是预先生成所有负样本因为负样本数量巨大预生成会撑爆内存。import random def generate_negative_samples(vocab_size, num_neg, unigram_dist): # 从 unigram 分布中采样 num_neg 个负样本词索引 return random.choices(range(vocab_size), weightsunigram_dist, knum_neg)之所以用 unigram 分布而不是均匀分布是因为高频词作为负样本出现概率更高可以让模型更快学会这些高频词不是当前上下文的目标。实际代码里我通常用unigram_dist word_counts的 0.75 次方作为权重这是 Word2vec 论文里的技巧能平衡高采样频词但不过度抑制低频词。这里的random.choices会在每次迭代时生成速度也够快。4. 模型定义与训练循环从 Embedding 到二元交叉熵损失4.1 CBOW 网络结构两个 Embedding 矩阵与向量平均PyTorch 里实现 CBOW 最直接的方式是让上下文中的每个词查一个共享的nn.Embedding然后把得到的向量求和或取平均再和中心词向量做匹配。注意这里有两个 embedding一个是中心词 embedding一个是上下文词 embedding权重不共享。原因是预测任务需要区分作为上下文和作为目标两种角色。import torch.nn as nn import torch.nn.functional as F class CBOW(nn.Module): def __init__(self, vocab_size, embed_dim): super().__init__() self.embed_v nn.Embedding(vocab_size, embed_dim) # 中心词 self.embed_u nn.Embedding(vocab_size, embed_dim) # 上下文词 self.out_proj nn.Linear(embed_dim, 1, biasFalse) # 用于打分 def forward(self, context, center): # context: (batch, seq_len), center: (batch, 1) 或 (batch,) context_emb self.embed_u(context) # (batch, seq_len, embed_dim) # 把所有上下文向量相加再除以实际长度平均 context_vec context_emb.mean(dim1) # (batch, embed_dim) center_emb self.embed_v(center) # (batch, embed_dim) # 内积全连接输出分数 score self.out_proj(context_vec).squeeze(1) torch.sum(context_vec * center_emb, dim1) return score这里我用了两种打分方式一个线性层加内积其实一般情况下直接用内积就行。上面的写法是为了演示但实际项目中你只需要score torch.sum(context_vec * center_emb, dim1)更干净。注意mean代替sum因为上下文长度不同平均可以避免长上下文对输出贡献过大。4.2 用二元交叉熵实现负采样训练有了正样本和负样本我们不再是多分类 softmax而是训练一个二分类器。正样本的标签是 1负样本的标签是 0。PyTorch 里可以用F.binary_cross_entropy_with_logits它内部封装了 sigmoid 和交叉熵数值上更稳定。def train_step(model, optimizer, batch, num_neg, vocab_size, unigram_dist): context, center batch batch_size context.size(0) # 构造正负样本标签前半是正样本后半是负样本 pos_score model(context, center).view(-1) # (batch,) neg_context context.repeat_interleave(num_neg, dim0) # 每个上下文复制 num_neg 次 neg_center torch.LongTensor(generate_negative_samples(vocab_size, batch_size * num_neg, unigram_dist)) neg_score model(neg_context, neg_center).view(batch_size, -1) # (batch, num_neg) # 正样本 loss 和负样本 loss 结合 pos_loss F.binary_cross_entropy_with_logits(pos_score, torch.ones_like(pos_score)) neg_loss F.binary_cross_entropy_with_logits(neg_score, torch.zeros_like(neg_score)) loss pos_loss neg_loss optimizer.zero_grad() loss.backward() optimizer.step() return loss.item()这段代码有几个关键点。repeat_interleave让负采样能用 batch 向量运算避免写循环。generate_negative_samples每次生成batch_size * num_neg个负中心词。负样本的上下文和正样本一样只是中心词被换成了随机词这样模型才能学到这个上下文下面出现某个词的概率。如果你的num_neg太小模型区分能力差太大负样本主导 loss。我通常用 5 到 15具体根据词典大小调整。4.3 训练循环与模型保存警惕 loss 不下降的问题训练词向量时loss 曲线下降很慢是常态但不会完全不动。我一般跑 20 到 50 个 epoch每轮记录平均 loss并每隔几轮打印一次。如果 loss 从第一轮开始就一直是同一个量级检查学习率和数据顺序。model CBOW(vocab_sizelen(vocab), embed_dim100) optimizer torch.optim.Adam(model.parameters(), lr0.01) epochs 20 for epoch in range(epochs): total_loss 0 for batch in dataloader: loss train_step(model, optimizer, batch, num_neg5, vocab_sizelen(vocab), unigram_distunigram_dist) total_loss loss print(fEpoch {epoch1}, Loss: {total_loss / len(dataloader):.4f}) # 每个 epoch 结束后保存一次 torch.save(model.state_dict(), fcbow_epoch_{epoch1}.pth)这里unigram_dist是提前算好的列表我在前面 3.3 节中用它来生成负样本。注意 Adam 的学习率我一般设 0.01 起步如果数据量小可以到 0.001。保存模型时别只保存 embedding 权重最好把整个 state_dict 保存之后加载时还要把 vocab 和 id 映射也一并存个 json不然你拿到向量也不知道对应哪个词。4.4 关于训练时间与资源什么时候该用多进程数据加载如果你的语料不是几万条而是几千万条数据管道会变成瓶颈。DataLoader的num_workers4或8可以并行加载和生成样本但要注意在 Windows 下多进程会出现EOFError这时可以在if __name__ __main__里包住训练脚本。另一个优化是预先把上下文词索引存成numpy数组再转换为 tensor减少每个 epoch 的重复 tokenize 开销。我在模拟项目里就是这么做的训练速度提升了三倍。5. 避坑指南词向量训练里最常见的五个翻车现场5.1 现象loss 快速下降但某些词向量始终是随机值这是未登录词问题。如果你的中心词索引在nn.Embedding里没有被训练大概率是负采样时生成的负样本索引超出了词典范围或者你把 padding 索引也算进了负采样。解决方法是负采样前过滤掉pad_token和低频词索引。另外检查词汇表里有没有保留单字词单字词很难被上下文预测准确因为能提供的信息太少。我一般是把出现次数低于 2 的词直接删掉。5.2 现象训练结果里相似词的余弦相似度全部接近 1这是向量空间坍缩的典型症状。原因是模型把所有词都推到了一个小范围通常是学习率太大或者初始化范围不对。nn.Embedding默认初始化是均匀分布范围很小但如果你手动初始化成正态分布方差过大训练初期就容易崩。我试过把 embedding 的init_range设为0.5 / embed_dim的一半效果更稳定。另外检查一下 loss 是否降到非常低低到过拟合也可能让向量趋同。5.3 现象loss 变成 NaNNaN 几乎都来自梯度爆炸。原因可能是分数计算中使用了大数相加或者负采样个数太多导致 loss 值过大。常见做法是给分数乘一个缩放系数比如score * 0.1或者加大学习率衰减。我用 PyTorch 时喜欢在每次优化器更新前加一个torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm5)这一行就能避免大多数 NaN。5.4 现象同一句话的不同切分导致词向量完全不同这是中文分词不一致造成的。比如人工智能在一条样本里被切成一个词在另一条里被切成人工和智能。你最后拿到的向量是人工而不是人工智能语义自然不对。我为此专门维护一个自定义词典并且把语料里所有分词后的词再统计一遍强制让共现频次高的词合并成词组。这个方法虽然简单但效果非常明显。5.5 现象加载保存的 embedding 时维度 mismatch保存的是state_dict但加载时模型结构变了比如没传入embed_dim。这个坑发生在我把训练和加载分成两个项目时。解药是把你训练时的超参数和词汇表一起保存下来加载时重建模型再load_state_dict。我通常在项目里建一个配置字典包括embed_dim、window_size、num_neg、vocab_size然后序列化成 json这样任何机器都能复现。6. 进阶验证用类比推理和可视化确认模型真的学到了语义6.1 类比推理测试A-BC-D训练完词向量最直观的验证是词类比。例如国王 - 男人 女人 ≈ 王后。在中文语料里我试过北京 - 中国 日本 ≈ 东京这样的地理类。测试代码很简单先归一化所有 embedding然后对目标词向量做加减再从余弦相似度最高的词里排除查询词本身。def analogy(model, vocab, word_a, word_b, word_c, top_k10): ids [vocab[w] for w in [word_a, word_b, word_c]] emb model.embed_v.weight.data # (vocab_size, embed_dim) # 归一化 emb_norm F.normalize(emb, dim1) vec emb_norm[ids[0]] - emb_norm[ids[1]] emb_norm[ids[2]] scores emb_norm vec _, ids_sorted torch.topk(scores, top_k 1) # 过滤掉输入词自身 result [vocab_rev[i.item()] for i in ids_sorted if i.item() not in ids][:top_k] return result这个测试能直接告诉你模型学到了多少语义关系。如果结果完全不相关先别急着调模型回头看你训练时是否 用了正确的上下文窗口。注意这里要vocab_rev也就是索引到词的反向映射保存模型时一定要存这个。6.2 可视化用 TSNE 把 100 维向量压到 2 维另一个验证手段是降维可视化。把训练后的 embedding 拿去跑sklearn.manifold.TSNE然后画散点图观察语义相近的词是否聚在一起。我用这个方法发现高频数字和量词挤在一堆而情感极性词分布在两端的边界上。可视化不是必须的但当你怀疑模型没有学好时它比 loss 曲线直观得多。从那以后我每次训练完词向量都会强制走一遍词类比 TSNE的验证流程不再只盯着 loss 数字。这个习惯帮我省去了很多调参时间。如果你也在复现这类模型希望这篇笔记能让你少踩几个我曾经翻过的坑。本文还有配套的精品资源点击获取

相关新闻

LeetCode 883 三维形体投影面积:用二维数组统计替代3D建模

LeetCode 883 三维形体投影面积:用二维数组统计替代3D建模

开头LeetCode 883:Projection Area of 3D Shapes,翻译过来叫“三维形体投影面积”,属于那种题目名字听着很难、实际做起来却很友好的类型。它给你一个 nn 的二维数组 grid,每个格子的数值表示这个位置上堆叠了几个 111 的立方体&a…

2026/10/16 9:53:39 阅读更多 →
文档提炼提示词实战:九个维度模板实现AI结构化摘要

文档提炼提示词实战:九个维度模板实现AI结构化摘要

1. 为什么你的文档提炼提示词总是不好用:先看清问题出在哪 我接触过不少整理资料的人,也看过大量所谓的“文档提炼提示词”,一个很普遍的现状是:模板堆了一长串,规则也写得天花乱坠,真正丢进对话窗口一测试…

2026/10/16 9:53:39 阅读更多 →
双目立体标定与校正实战:从棋盘格采集到共面行对准

双目立体标定与校正实战:从棋盘格采集到共面行对准

简介:本资源是一套基于OpenCV 3.0与Visual Studio 2013实现的双目视觉立体标定与校正完整工程,面向计算机视觉初学者、机器人感知方向学习者及三维重建实践者,解决双目相机系统参数标定、极线校正等核心问题,为后续立体匹配与深度…

2026/10/16 9:52:37 阅读更多 →

最新新闻

LabVIEW波峰波谷检测实战:从Peak Detector到数组遍历及参数调优

LabVIEW波峰波谷检测实战:从Peak Detector到数组遍历及参数调优

最近在调一套气动检测平台的采集程序,甲方要的指标很直接:每次气缸动作,上位机必须自动把压力波形的冲击峰值时刻标出来,漏一个峰都不行。这种需求在LabVIEW的日常项目里太常见了——振动监测要看极值区间,疲劳测试要统…

2026/10/16 10:42:49 阅读更多 →
计算机考研真题背后的系统级思维:从栈共享到TCP握手的底层逻辑

计算机考研真题背后的系统级思维:从栈共享到TCP握手的底层逻辑

简介:本资源为武汉理工大学计算机专业硕士研究生复试真题汇编,面向备考该校计算机学院考研复试的考生,系统覆盖近四年(2004–2007)复试试题及核心知识点解析,直击操作系统、数据结构、计算机网络、数据库原…

2026/10/16 10:42:49 阅读更多 →
Flink Exactly Once与At Least Once落地实战指南

Flink Exactly Once与At Least Once落地实战指南

1. 这不是理论考试,是生产环境里每天要签的“生死状”Flink 的 Exactly Once 和 At Least Once,这两个词在面试题里出现频率高得离谱,但真正让一线开发者头皮发紧的,从来不是背定义,而是某天凌晨三点收到告警&#xff…

2026/10/16 10:42:49 阅读更多 →
NSGA-III 的 MATLAB 实现:参考点引导的多目标优化代码解析

NSGA-III 的 MATLAB 实现:参考点引导的多目标优化代码解析

简介:这是一份可在 MATLAB 中直接运行的 NSGA-III 多目标进化算法代码,面向需要处理多目标优化问题、熟悉遗传算法但希望快速获得可复现基线的研究人员与高年级学生。资源实现了参考点生成、非支配排序、模拟二进制交叉与多项式变异、种群归一化、关联参…

2026/10/16 10:42:49 阅读更多 →
内置修改器1.67版版本匹配与安装排错指南

内置修改器1.67版版本匹配与安装排错指南

简介:GTA5中文内置修改器1.67版本是为GTA5线下单机玩家制作的游戏插件,由3DM-DJ小良汉化,支持2023年10月更新的1.67/3028版游戏,提供简体与繁体两套界面,具备一键刷车、武器获取、传送、保镖雇佣等常用功能&#xff0c…

2026/10/16 10:42:49 阅读更多 →
C#面向对象:Person类、Student类继承与构造函数全解析

C#面向对象:Person类、Student类继承与构造函数全解析

1. 面向对象的第一步:从Person类的设计说起很多人学C#敲的第一段面向对象代码,就是从定义人类Person开始的。这个题目看着简单,但背后其实藏着一堆值得掰扯清楚的细节——构造函数怎么写、字段和属性有什么区别、继承之后构造函数怎么联动。我…

2026/10/16 10:41:46 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →