基于LSTM的网易云音乐评论情感分析:数据清洗与模型调优实战
简介面向数据仓库与数据挖掘课程设计、毕业设计等场景这份基于LSTM的网易云音乐评论分析项目提供了从网易云歌曲评论爬取、情感标注到模型训练与可视化的完整流程。项目包含Python源码、使用说明、数据集与训练好的LSTM模型按爬虫、统计、词云等功能模块拆分便于二次开发或直接运行验证。资源共18个文件涵盖4个py脚本、h5模型、csv/xls标注数据、ttf字体、停用词txt及词云效果图等压缩包约63.36MB并附依赖清单目录结构清晰。已有713人学习下载。通过该包可掌握LSTM在中文短文本情感分类中的落地方法包括nlp/data数据集训练流程、歌曲评论爬取、情感分布统计与词云绘制整体模块化设计便于替换数据集进行迁移训练适合有一定Python基础、希望快速完成课程作业或入门深度学习情感分析的学生和开发者。1. 基于LSTM的网易云音乐评论分析先想清楚这三件事再动手基于LSTM的网易云音乐评论分析这个标题写得很直白但做过类似活儿的人都知道真正的瓶颈从来不在LSTM本身。评论区里全是哈哈打卡来了歌词背错了吧这类短噪声文本模型还没见到真情感先被这些数据带偏了。你真正要解决的是短文本清洗、小样本标注、类别不平衡这三座山而不是纠结该用单层还是双层LSTM。如果你是为了课程设计、毕业设计或者简历项目来做这套方案我建议你先接受一个反直觉的结论在几千条标注数据这个量级LSTM的收益并不明显但它逼着你把从数据到评估的整条链路走通这才是这类项目最值钱的部分。这个压缩包分成源码、使用说明、数据集、模型四块下面我按数据怎么洗、模型怎么配、参数怎么调、坑在哪的顺序把这套方案的完整落地路径讲清楚。2. 数据决定上限评论采集、清洗与标注的落地做法2.1 评论数据怎么组织字段设计是后面所有代码的地基不管你拿到的是CSV还是JSON第一步永远是打开数据文件看字段而不是急着跑模型。做这个标题最常见的从业方案是先拿到一批歌曲或歌单的ID通过站内公开接口按分页把评论拉下来落成结构化表格。字段不需要多够用就行歌曲ID、评论内容、点赞数、评论时间。用户名我会直接丢弃一方面减小体积另一方面避免后面做文本分析时被ID噪声干扰。# 最小采集示意低频请求、单页拉取仅用于个人学习研究 import requests import pandas as pd def fetch_comments(song_id, offset0, limit100): # 示例接口地址与返回字段以实际业务返回为准 url https://api.example.com/comment params {songId: song_id, offset: offset, limit: limit} resp requests.get(url, paramsparams, timeout10) data resp.json().get(comments, []) rows [ { song_id: song_id, content: item.get(content, ), liked_count: item.get(likedCount, 0), comment_time: item.get(time, None), } for item in data ] return pd.DataFrame(rows)这段代码的逻辑是把一页评论转成DataFrame核心是只保留后续建模需要的四个字段。两个参数值得留意limit控制在100以内offset按页递增这就是最简单的低频采集够教学场景用了。拿到数据后我一般会先打印DataFrame的shape和前五行确认字段没对错列、评论内容没有整行缺失再进入清洗环节。点赞数和评论时间在这个项目里不是LSTM的输入但后面做歌曲维度聚合分析时会用到所以提前留好。2.2 文本清洗与分词把噪声变成能教的样本网易云音乐评论的噪声类型很集中URL、用户、表情符号、无意义短词、繁体与简体混杂。清洗的顺序有讲究先去掉URL和再处理emoji最后压缩空白顺序反了容易出现空字符串。import re import jieba def clean_comment(text: str) - str: # 1 去掉 URL、用户、话题标签 text re.sub(rhttps?://\S|\S|#.*?#, , text) # 2 只保留中英文、数字和常用中文标点其余字符含 emoji移除 text re.sub(r[^\u4e00-\u9fff0-9a-zA-Z。、·\s], , text) # 3 连续空白压缩为单个空格去掉首尾多余空格 text re.sub(r\s, , text).strip() return text def tokenize(text: str, stopwords: set) - list: words jieba.lcut(clean_comment(text)) # 长度小于等于1的词直接丢弃停用词表由你自己维护 return [w for w in words if w not in stopwords and len(w) 1]清洗函数里最容易出错的是emoji部分有人用emoji库去转义但那样会把表情变成一串英文描述反而增加分词负担我一般直接按字符范围滤掉。分词这里有个容易被忽略的点停用词表别用网上现成的大而全版本那种词表把没不很都删了直接破坏否定结构。常见做法是自己建一个小停用词表只收的了啊吧这类无意义虚词。另外哈哈沙发打卡这类词长度够但不能简单过滤它们是中性类的典型样本删了会让中性标签失去代表性这个问题后面专门说。2.3 标签怎么打三分类规则比模型结构更影响结果评论分析落在情感分类上常见做法是分三类正向、负向、中性。分两类看着省事但实际上哈哈哈哈哈算正向还是中性会把标注者逼疯所以三分类是这套方案最稳的标注口径。标注规范的完整程度直接决定你后面模型能学到什么边界。类别典型例子判断要点正向好听、单曲循环、唱到我心里了有明确表态或程度副词负向难听、失望、这版本不行有明确否定或负面情绪词中性打卡、来了、哈哈、歌词分享无明确情绪倾向标注规则最难的地方是中性的边界我常用的判据是如果这条评论删掉后不影响任何人知道发帖人有情绪它就是中性。打卡来了是互动行为哈哈是情绪噪声。规模上我一般建议至少标2000条太少的话正向和负向各自分不到多少样本。人工标注时一个人标容易产生系统性偏差常见做法是两个人各标一遍一致率低于85%的规则要回去修订不一致的样本放进验证集而不是简单丢弃。伪标签方案我不推荐作为主路径情感词典能覆盖的词汇和流行语相比覆盖度太低只能用来做标注前的初筛辅助。3. LSTM模型搭建从词表到输出层的关键决策3.1 短文本场景下LSTM为什么合适词序敏感是核心原因评论是典型的短文本平均长度往往只有二三十个字但词序信息非常密集。没想象中好听和想象中没这么好听表达的真实情感完全不同词袋模型在这种句子上会直接翻车而LSTM按顺序读入每个词能把这种局部否定结构保留在隐状态里。这是LSTM在这个场景相对朴素模型的核心优势也是你答辩或写报告时最该讲清楚的一点。但我也要说清边界评论太短词与词之间的长距离依存其实很少出现人话就是LSTM的长记忆优势在这个场景没有完全发挥。这也是为什么有些资料里用TextCNN也能做到类似效果。选LSTM的理由更多是它结构简单、训练稳定、对变长序列友好配合padding后实现成本低。如果你的数据量只有两三千条LSTM和TextCNN的差距基本在误差范围内不用在这上面死磕。3.2 词向量怎么选随机初始化往往比预训练向量实用词向量的选型是这一章里最该做减法的决定。很多人一上来就想去下载预训练词向量但那些向量是基于新闻或百科语料训练的音乐评论里的单曲循环网易云翻唱这些词根本不在词表里加载进来后大半词还是随机初始化还白白多出几百MB的体积。方案适用条件主要代价随机初始化Embedding数据量在万条以下训练中更新容易过拟合需要dropout配合自训练Word2Vec额外语料充足语料不足时收益低词表对齐麻烦预训练通用词向量领域分布一致体积大、领域覆盖差加载慢我一般直接选随机初始化把词表大小限制在两万以内未登录词统一映射到UNK。这样做的理由很实际评论词表本来就不大高频词就那几百个Embedding层完全有能力在训练过程中自己学到有用的表示。与其花时间折腾词向量文件不如把这些时间用在清洗和标注质量上那才是真正影响上限的地方。3.3 网络结构与PyTorch实现参数先照这套默认值跑模型结构按这个顺序搭Embedding层、单层LSTM、Dropout、全连接输出层。下面这段代码是完整的模型定义放到PyTorch里可以直接跑。import torch import torch.nn as nn class LSTMClassifier(nn.Module): def __init__(self, vocab_size, embedding_dim128, hidden_dim128, num_layers1, num_classes3, dropout0.4): super().__init__() # padding_idx0 让填充位不参与梯度更新 self.embedding nn.Embedding(vocab_size, embedding_dim, padding_idx0) self.lstm nn.LSTM(embedding_dim, hidden_dim, num_layersnum_layers, batch_firstTrue) self.dropout nn.Dropout(dropout) self.fc nn.Linear(hidden_dim, num_classes) def forward(self, x): # x 形状: (batch, seq_len) 的整数索引 emb self.embedding(x) out, (h_n, _) self.lstm(emb) last_hidden h_n[-1] logits self.fc(self.dropout(last_hidden)) return logits代码里最关键的是取h_n[-1]作为句向量它代表最后一个时间步的隐状态也就是模型读完整个句子后的摘要。为什么不是取out的平均池化因为评论短最后一步已经包含了全句信息取平均反而把开头的噪声词权重放大了。参数上几个值的经验值embedding_dim128足够hidden_dim128和它匹配num_layers1对短文本够用两层在小数据集上几乎必然过拟合dropout0.4是一个比较安全的起点。你的使用说明文档里如果写了Python版本记得PyTorch的版本要和它对应否则加载模型权重时报错会很莫名其妙。4. 训练与评估稳定跑出可信指标4.1 类别不平衡处理先用loss权重别急着改数据分布训练集里三类评论的数量几乎不可能均衡。中性类通常最多负向类往往只有百分之十几如果直接拿原始比例训练模型会学会全都猜中性来混过loss。常见的做法有两个一是欠采样砍掉中性类样本二是给loss加类别权重。我建议直接用第二个因为它不改数据分布只是让少数类的错判付出更高代价操作上也更省事。from sklearn.utils.class_weight import compute_class_weight import numpy as np import torch # train_labels 是训练集的整数标签列表取值 0/1/2 weights compute_class_weight( balanced, classesnp.unique(train_labels), ytrain_labels ) class_weight torch.tensor(weights, dtypetorch.float32)这段代码用sklearn的compute_class_weight算出每个类别的权重负向类样本少权重就高。注意返回的weights顺序是按classes参数排序的也就是说传进去的classes是[0,1,2]weights[0]就是中性类的权重。后面把这个class_weight传给损失函数的weight参数就行nn.CrossEntropyLoss(weightclass_weight)。优先用loss权重的另一个原因是它不会改变验证集的分布你用原始比例评估出来的指标才更接近真实情况。4.2 训练主循环与早停checkpoint要跟最好的验证分数绑定训练循环本身不复杂但有几个习惯必须养成每轮结束算验证集的loss和macro-F1分数变好了才覆盖保存模型同时记录连续多少个epoch没有提升超过阈值就提前停止。import torch.nn as nn criterion nn.CrossEntropyLoss(weightclass_weight.to(device)) optimizer torch.optim.Adam(model.parameters(), lr1e-3) best_f1 0.0 patience 0 for epoch in range(20): model.train() for batch_x, batch_y in train_loader: optimizer.zero_grad() logits model(batch_x) loss criterion(logits, batch_y) loss.backward() optimizer.step() # 每个 epoch 结束后在验证集上评估 val_f1 evaluate(model, val_loader) if val_f1 best_f1: best_f1 val_f1 torch.save(model.state_dict(), best_model.pt) patience 0 else: patience 1 if patience 3: print(fearly stop at epoch {epoch}) break这段逻辑里有两个参数最需要关注。lr1e-3配合Adam是这个量级数据最稳的组合调到5e-3以上loss会震荡得很厉害。patience设3意思是连续3个epoch验证指标不提升就停设太大浪费时间设太小容易被单次波动误杀。checkpoint只保存state_dict不保存整个模型加载的时候要先实例化同样结构的模型再load_state_dict这个顺序错了一定报错。4.3 评估指标只看accuracy会被中性类骗得团团转分类报告和混淆矩阵是这类项目必须打印出来的东西哪怕你的使用说明文档里没写我也强烈建议你跑一下。准确率在这个场景没有意义如果中性类占了60%模型全猜中性也有60%的准确率看起来还行实际上什么都没学会。from sklearn.metrics import classification_report, confusion_matrix # y_true 是真实标签y_pred 是模型预测标签 print(classification_report( y_true, y_pred, target_names[中性, 正向, 负向] )) print(confusion_matrix(y_true, y_pred))分类报告里主要看三行精确率、召回率、F1。对这三个类别我一般要求macro-F1至少到0.6以上才算这套方案基本成立0.7以上属于表现良好。混淆矩阵重点看负向类被分到哪去了最常见的错误是负向被分到中性这说明模型把难听失望这类词的信号学得太弱被句子里其他词稀释了。加载已保存的模型做推理时记得建好同样的配置再load_state_dict参数从配置文件里读不要在代码里硬编码一遍。5. 避坑记录LSTM评论分析最容易翻车的五个现场5.1 过拟合与类别失衡两个占比最高的翻车原因现象一训练loss一路下降验证集的F1却跟着上涨再突然掉头向下分类报告里负向类精确率暴跌。原因非常典型标注数据只有两三千条LSTM参数量相对数据规模过大模型开始背训练集而不是学规律。解决路径按顺序试把dropout从0.4提到0.5hidden_dim从128砍到64num_layers从2层改回1层最后是加早停。这个组合基本能压住90%的过拟合。现象二预测结果清一色是中性类正向负向几乎不出现。原因基本是类别不平衡没处理模型发现全部猜中性就能让loss很小。解决方法是把CrossEntropyLoss的weight参数传进去然后在验证集上重新看混淆矩阵如果正向负向还是很少被预测出来就要回去检查训练集的标签分布是不是已经严重失衡到负向连10%都不到。这种情况我会考虑把双向LSTM换成单向单向结构在小数据上更不容易偷懒。5.2 数据分布与分词三个容易被忽略的现场现象三哈哈哈哈哈被模型识别为高度正向置信度超过0.9。原因是清洗时没过滤这类长度大于1的互动短词模型发现带哈的样本大多被标成正向就学会偷懒了。解决方法是把标注规则里中性的判定写得更明确并在建词表时把纯语气词列表拿出来看一遍把哈哈打卡来了这类词直接加入中性强特征也就是在分词后保留它们但不让它们参与模型的情感判断。现象四换一批歌曲的评论准确率骤降十几个百分点。原因是训练数据集中在某一类风格的歌曲上比如全是民谣评论模型学到的是沧桑嗓音吉他这类风格词而不是通用情感词。解决方法是采样时按歌曲维度做分层保证训练集里至少覆盖几种风格的歌曲验证集用没见过的歌曲评论来测。这个操作我一般会在采集阶段就做好比训练完再补救省事得多。现象五不是很好被分词切成了不是/很好模型抓住好就判正向。这是短文本情感分析最经典的分词陷阱jieba对口语化否定结构切分能力有限。解决方案有三个层次一是给jieba加自定义词典把不是很好不太行没想象中整体收进去二是在预处理阶段做否定词扫描遇到不没别就把后面的词拼接成not_好这种特征词三是如果使用说明文档里允许改词表直接改词表优先级最高。这三个方案我建议都做因为否定结构在音乐评论区出现的频率比你想象的高得多。6. 把模型用起来从单条预测到歌曲维度的分析到此为止模型已经能对单条评论输出三类情感概率了但这个能力本身在评估里也就值一个好看的数字。真正让这个项目产生价值的是把单条预测聚合成歌曲维度。我常用的做法是把测试集换成某几首热歌的全部评论对每首歌曲按评论时间排序计算每周或每天的正向占比、负向占比画一条情绪走势线。这样就能回答这首歌曲发布后评论区情绪如何演变这类问题比单条情感分类更容易写进简历也让整个项目从训练了一个分类器变成做了一次完整的评论情绪时序分析。数据字段在采集阶段已经留好了评论时间和歌曲ID这里不需要再额外采集。验证模型是否真的学到了语义我有个固定的测试习惯手工挑十到二十条带转折或让步结构的评论比如虽然编曲一般但歌词写得真好和歌词虽然直白但旋律太上头了。把这两类句子丢进模型如果输出都偏向正向说明模型学的是歌词、旋律这类表面词汇如果第二句能正确判为正向、第一句能判为中性说明模型确实抓住了转折结构。这个测试成本极低但比看任何指标都更能说明模型学到了什么。我现在的习惯是每次训练完不急着收工先保存模型最确信的正向样本20条和最确信的负向样本20条肉眼扫一遍再去看分类报告。因为模型文件是个黑匣子指标只能告诉你它好不好这些样本才能告诉你它为什么好、为什么不好。这个习惯帮我少走了很多弯路也让我能在写报告时直接给出失败案例而不是只贴指标。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

第6章:Spring AI 2.0 ChatClient 门面

第6章:Spring AI 2.0 ChatClient 门面

上章思考题答案 用户原话里的 {orderId} 若放进 SystemPromptTemplate 再渲染,StringTemplate 会把它当成变量。缺这个键时,ValidationMode.THROW 抛 IllegalStateException,正常咨询被拒绝。用户原话应走 UserMessage 或 ChatClient.user&a…

2026/10/14 0:03:43 阅读更多 →
【车载定位】基于扩展卡尔曼滤波 EKF,分别利用 TDOA、AOA 以及 TDOA+AOA 融合观测,搭配近恒速 NCV / 近恒位置 NCP运动模型对车辆轨迹估计附Matlab代码

【车载定位】基于扩展卡尔曼滤波 EKF,分别利用 TDOA、AOA 以及 TDOA+AOA 融合观测,搭配近恒速 NCV / 近恒位置 NCP运动模型对车辆轨迹估计附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和数学建模资料 &…

2026/10/14 0:03:43 阅读更多 →
人工智能期末复习:用习题集构建考点地图,高效备考不挂科

人工智能期末复习:用习题集构建考点地图,高效备考不挂科

简介:这份资源汇集人工智能课程各章小结与经典习题解答,适合正在系统学习人工智能基础、准备期末考试的本科生或自学者使用。内容覆盖人工智能的概念与发展阶段、研究学派与研究领域、知识与知识表示(谓词逻辑、产生式规则、框架、语义网络&a…

2026/10/14 0:03:43 阅读更多 →

最新新闻

尖叫声音样本数据集eva:从包结构到训练基线的完整实践

尖叫声音样本数据集eva:从包结构到训练基线的完整实践

简介:EVA尖叫声音样本数据集是一份面向音乐信息检索(MIR)与音频分类研究的人声尖叫样本库,由台湾清华大学MIR课程项目整理,旨在为尖叫检测、异常声音识别、SVM分类等实验提供稀缺的领域数据。压缩包共63个文件&#xf…

2026/10/14 0:47:55 阅读更多 →
现代C++多线程编程实践与优化指南

现代C++多线程编程实践与优化指南

1. 现代C多线程编程的核心价值十年前我刚接触多线程编程时,还在用pthread这类原始接口手动管理线程生命周期。现代C11标准引入的库彻底改变了游戏规则——现在我们可以用更安全、更直观的方式构建并发程序。举个例子,过去需要几十行代码实现的线程同步&a…

2026/10/14 0:47:55 阅读更多 →
Neo4j驱动的RAG:从向量检索到知识图谱推理的工程跃迁

Neo4j驱动的RAG:从向量检索到知识图谱推理的工程跃迁

1. 这份“日报”不是资讯汇编,而是工程实践的切片快照你点开这份标题为《Agent / LLM 技术精选日报 2026-09-28(知乎版)》的文档时,大概率会下意识把它当成一份轻量级技术资讯摘要——类似科技媒体每日推送的“今日AI圈发生了什么…

2026/10/14 0:47:55 阅读更多 →
JVM元空间内存泄漏排查与防护实战指南

JVM元空间内存泄漏排查与防护实战指南

1. 面试题背后的技术深度剖析当这个面试题出现在阿里巴巴Java技术面试中时,它实际上考察的是候选人对JVM内存管理的系统化理解能力和复杂问题排查经验。元空间(Metaspace)内存泄漏不同于传统的堆内存问题,它的隐蔽性更强且往往在应用运行较长时间后才显现…

2026/10/14 0:47:55 阅读更多 →
老虎数据集2055张VOC+YOLO格式:目标检测训练与标注避坑指南

老虎数据集2055张VOC+YOLO格式:目标检测训练与标注避坑指南

简介:本资源为面向目标检测学习者的老虎数据集,采用Pascal VOC与YOLO双格式标注,适合从事单类别目标检测训练、模型验证及算法对比的研究人员与开发者使用。压缩包共约2000个文件,以1999个xml标注文件和1个说明txt为主&#xff0c…

2026/10/14 0:47:55 阅读更多 →
开题报告是研究旅程的导航图,科迅捷AI帮你把路线画清楚

开题报告是研究旅程的导航图,科迅捷AI帮你把路线画清楚

如果把博士阶段的研究比作一段长途旅行,开题报告就是出发前画好的导航图。导航图不决定你路上的每一个细节,但它决定了方向:往哪走、经过哪些站点、预计什么时候到达。没有这张图,你很容易在路上迷路,或者走很远才发现…

2026/10/14 0:46:55 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →