基于spaCy与依存句法的信息抽取实战:从新闻标题到结构化数据
在实际的技术项目中我们经常需要处理来自外部数据源的结构化或非结构化信息例如新闻、公告、报告等。这些信息通常以文本形式存在其核心价值在于能够被程序化地理解、提取关键实体、分析关系并最终服务于业务决策。本文将以一个具体的新闻标题——“联邦通信委员会取消广播电视台所有权限制”——作为切入点探讨如何从零开始构建一个信息提取与结构化处理的技术方案。这个过程不仅适用于新闻分析也广泛适用于舆情监控、市场情报收集、知识图谱构建等场景。本文的目标读者是具备基础编程能力如 Python和对数据处理感兴趣的开发者。我们将从理解任务开始逐步完成环境搭建、数据获取、文本解析、实体识别、关系抽取并最终形成一个可运行、可验证的代码模块。文章将重点解释每一步的技术选型原因、实现细节以及可能遇到的坑确保读者能够复现并应用到自己的项目中。1. 理解任务从新闻标题到结构化信息面对“Federal Communications Commission scraps limit on broadcast TV ownership”这样的新闻标题一个技术系统需要完成什么直接存储标题字符串是远远不够的。我们需要从中提取出有意义的、可供查询和分析的“事实”。首先我们需要解析这个句子的语义结构。它描述了一个“事件”某个主体Federal Communications Commission FCC执行了一个动作scraps 取消这个动作作用于一个对象limit on broadcast TV ownership 广播电视台所有权限制。这就是一个典型的“主语-谓语-宾语”S-V-O三元组是信息抽取中最基础的结构。为了实现自动化提取我们需要解决几个核心问题命名实体识别NER识别文本中的特定实体如组织机构FCC、法律条款、行业术语等。关系抽取RE判断识别出的实体之间存在着何种语义关系。事件抽取有时一个句子描述的是一个复杂事件涉及多个动作和参与者需要更精细的建模。对于这个相对简单的标题我们可以先聚焦于实体和关系的抽取。最终我们希望程序能输出类似这样的结构化数据{ subject: Federal Communications Commission, predicate: scraps, object: limit on broadcast TV ownership, subject_type: ORGANIZATION, object_type: REGULATION, date_extracted: 2023-10-27 }有了这样的结构化表示我们就可以轻松地回答诸如“FCC最近做了什么”、“哪些政策被修改了”等问题或者将这条信息存入图数据库与其他实体如相关公司、法律条文建立关联。2. 环境准备与核心工具选型在开始编码前我们需要搭建一个轻量级但功能强大的Python开发环境。选择Python是因为其在自然语言处理NLP领域拥有最丰富的生态系统。2.1 Python环境与包管理建议使用Python 3.8或更高版本。使用虚拟环境venv或conda来隔离项目依赖是一个好习惯。# 创建并激活虚拟环境以venv为例 python -m venv nlp_project_env source nlp_project_env/bin/activate # Linux/macOS # nlp_project_env\Scripts\activate # Windows # 升级pip pip install --upgrade pip2.2 NLP库选型与安装我们将使用spaCy库作为核心NLP工具。spaCy是一个工业级的NLP库提供了高效的词性标注、依存句法分析和命名实体识别功能并且预训练模型效果出色。# 安装spaCy pip install spacy # 下载英文预训练模型这里选择中等大小的模型平衡精度与速度 python -m spacy download en_core_web_md为什么选择spaCy而不是NLTK或Stanford NLPNLTK更偏向教学和研究提供了大量算法和语料库但生产环境下的管道化和性能不如spaCy。Stanford NLP精度很高但通常更重运行速度较慢且Java依赖可能带来部署复杂度。spaCy设计目标就是用于生产环境API简洁处理速度快并且其依存句法分析结果非常适合作为关系抽取的基础。除了spaCy我们可能还需要requests库来模拟从网络获取新闻标题以及json库来格式化输出。pip install requests2.3 项目结构规划一个清晰的项目结构有助于代码维护。建议创建如下目录和文件news_info_extractor/ ├── src/ │ ├── __init__.py │ ├── scraper.py # 可选负责从网络获取原始文本 │ └── extractor.py # 核心的信息抽取模块 ├── tests/ │ └── test_extractor.py # 单元测试 ├── data/ │ └── sample_news.txt # 存放示例新闻标题或正文 ├── requirements.txt # 项目依赖列表 └── main.py # 主程序入口在requirements.txt中记录依赖spacy3.5.0 requests2.28.03. 构建核心信息抽取模块现在我们开始编写最核心的extractor.py。我们将采用基于规则和spaCy依存分析相结合的方法这对于句式相对规范的新闻标题非常有效。3.1 加载模型与基础文本处理首先我们创建一个类来封装所有的抽取逻辑。# src/extractor.py import spacy import json from typing import Dict, Optional, List class NewsInfoExtractor: def __init__(self, model_name: str en_core_web_md): 初始化信息抽取器加载spaCy模型。 :param model_name: 使用的spaCy预训练模型名称 try: # 加载模型 self.nlp spacy.load(model_name) print(f模型 {model_name} 加载成功。) except OSError: # 如果模型未找到提示用户下载 raise OSError( f模型 {model_name} 未找到。请先运行命令下载\n fpython -m spacy download {model_name} ) def extract_from_text(self, text: str) - Optional[Dict]: 从单条文本中提取结构化信息。 :param text: 输入的新闻文本 :return: 包含提取信息的字典如果提取失败则返回None if not text or not text.strip(): return None # 使用spaCy处理文本 doc self.nlp(text.strip()) # 提取核心三元组主语谓语宾语 triple self._extract_svo_triple(doc) if not triple: # 如果标准SVO提取失败尝试其他启发式方法 triple self._extract_fallback_triple(doc) if triple: result { text: text, subject: triple.get(subject), predicate: triple.get(predicate), object: triple.get(object), subject_type: self._get_entity_type(doc, triple.get(subject)), object_type: self._get_entity_type(doc, triple.get(object)), entities: self._extract_all_entities(doc), } return result return None3.2 实现基于依存句法的SVO抽取_extract_svo_triple方法是核心。它的思路是在英语的主动语态陈述句中句子的根ROOT通常是主要动词谓语。我们可以通过寻找该动词的主语子节点nsubj和宾语子节点dobj来找到主语和直接宾语。def _extract_svo_triple(self, doc) - Optional[Dict]: 基于依存句法分析提取主语-动词-宾语三元组。 for token in doc: # 寻找根动词谓语 if token.dep_ ROOT and token.pos_ VERB: predicate token.text subject None obj None # 在根动词的子节点中寻找主语nsubj和直接宾语dobj for child in token.children: if child.dep_ in (nsubj, nsubjpass): # 主动/被动语态主语 # 获取主语的名词短语例如获取整个“Federal Communications Commission” subject self._get_subtree_text(child) elif child.dep_ dobj: # 直接宾语 # 获取宾语的名词短语 obj self._get_subtree_text(child) # 有时宾语是介词短语的一部分如“limit on ...”需要额外处理 elif child.dep_ prep: # 可以进一步处理介词宾语这里简单返回整个介词短语 obj self._get_subtree_text(child) # 如果成功找到了主语和宾语或介词短语则返回 if subject and (obj or predicate in [scraps, approves, rejects]): # 有些动词可能没有直接宾语 # 对于没有直接宾语的尝试用介词短语或整个动词后的成分作为“对象” if not obj: # 获取根动词之后的所有词组成的片段 obj_start token.i 1 if obj_start len(doc): obj doc[obj_start:].text return {subject: subject, predicate: predicate, object: obj} return None def _get_subtree_text(self, token): 获取以某个token为根的整个子树的文本。 return .join([t.text for t in token.subtree]).strip()3.3 实体类型识别与备用抽取策略我们需要识别主语和宾体的类型如机构、法规、地点等。同时如果上述严格的句法分析失败我们需要一个备选方案。def _get_entity_type(self, doc, span_text: Optional[str]) - str: 根据spaCy的实体识别结果判断给定文本片段的类型。 if not span_text: return UNKNOWN # 这是一个简化实现。更精确的做法是将span_text与doc.ents中的实体进行匹配。 for ent in doc.ents: if span_text in ent.text or ent.text in span_text: return ent.label_ # 如果没有匹配到预定义的实体根据一些关键词判断 if span_text: lower_text span_text.lower() if commission in lower_text or agency in lower_text: return ORG elif limit in lower_text or rule in lower_text or law in lower_text: return REGULATION return NOUN_PHRASE def _extract_all_entities(self, doc) - List[Dict]: 提取文本中的所有命名实体。 return [{text: ent.text, label: ent.label_} for ent in doc.ents] def _extract_fallback_triple(self, doc) - Optional[Dict]: 备用抽取策略基于词性标注的简单启发式方法。 例如寻找“名词短语 动词 名词短语”的模式。 words [token.text for token in doc] pos_tags [token.pos_ for token in doc] # 这是一个非常简单的模式匹配实际项目需要更复杂的规则 for i, (word, pos) in enumerate(zip(words, pos_tags)): if pos VERB and i 0 and i len(words) - 1: # 假设动词前一个词是主语的一部分动词后是宾语 subject .join(words[:i]) predicate word obj .join(words[i1:]) return {subject: subject, predicate: predicate, object: obj} return None4. 运行验证与结果分析现在我们编写一个主程序来测试我们的抽取器。# main.py from src.extractor import NewsInfoExtractor def main(): # 初始化抽取器 extractor NewsInfoExtractor() # 测试新闻标题 test_headline Federal Communications Commission scraps limit on broadcast TV ownership print(正在处理新闻标题) print(f\{test_headline}\) print(- * 50) result extractor.extract_from_text(test_headline) if result: print(信息抽取成功) print(json.dumps(result, indent2, ensure_asciiFalse)) else: print(未能从文本中提取出核心信息。) if __name__ __main__: main()运行程序cd /path/to/news_info_extractor python main.py预期输出模型 en_core_web_md 加载成功。 正在处理新闻标题 Federal Communications Commission scraps limit on broadcast TV ownership -------------------------------------------------- 信息抽取成功 { text: Federal Communications Commission scraps limit on broadcast TV ownership, subject: Federal Communications Commission, predicate: scraps, object: limit on broadcast TV ownership, subject_type: ORG, object_type: REGULATION, entities: [ { text: Federal Communications Commission, label: ORG } ] }结果分析成功提取三元组系统正确识别出主语FCC、谓语scraps和宾语limit on ...。实体识别spaCy成功将“Federal Communications Commission”识别为组织机构ORG。对于宾语我们的备用规则根据关键词“limit”将其类型标记为“REGULATION”。结构化输出最终的JSON格式包含了原始文本、核心事实和所有实体非常适合存入数据库或进行后续分析。5. 处理复杂情况与常见问题排查上面的基础版本能处理简单标题但真实世界的文本要复杂得多。下面我们分析几种常见情况和对应的处理策略。5.1 复杂句式与被动语态问题现象对于被动语态句子如“Limit on broadcast TV ownership is scrapped by the FCC”我们的_extract_svo_triple方法可能无法正确识别主语和宾语。排查与解决我们需要在寻找主语时同时检查主动语态主语nsubj和被动语态主语nsubjpass。同时被动语态的动作执行者通常由介词“by”引出agent。# 在 _extract_svo_triple 方法中增强对被动语态的处理 for child in token.children: # token是根动词 if child.dep_ in (nsubj, nsubjpass): subject self._get_subtree_text(child) elif child.dep_ agent: # 被动语态中的动作执行者by短语 subject self._get_subtree_text(child) elif child.dep_ dobj: obj self._get_subtree_text(child) elif child.dep_ nsubjpass: # 被动语态的主语其实是动作的承受者可以视为“对象” obj self._get_subtree_text(child)5.2 长宾语与从句嵌套问题现象宾语可能非常长或者包含从句例如“FCC proposes new rule that scraps limit on ownership”。简单的dobj可能只抓到“new rule”丢失了关键信息“that scraps limit on ownership”。排查与解决我们需要检查动词后是否跟着从句如ccompacl。如果是需要将从句内容也整合到“对象”中。# 在 _extract_svo_triple 方法中补充对从句的处理 obj_parts [] if child.dep_ dobj: obj_parts.append(self._get_subtree_text(child)) # 检查是否有宾语从句 elif child.dep_ in (ccomp, acl): obj_parts.append(self._get_subtree_text(child)) # ... 最后组合所有部分 if obj_parts: obj .join(obj_parts)5.3 模型识别实体不准确或遗漏问题现象spaCy的预训练模型可能无法识别某些专业术语、新出现的机构缩写或特定领域的实体。排查与解决使用领域模型如果领域性很强如生物医学、法律可以寻找或训练领域特定的spaCy模型。规则后处理用自定义词典或正则表达式进行补充。例如我们可以添加一个规则如果文本中包含“FCC”则将其标记为“ORG”。def _enhance_entities(self, doc, entities): custom_entities [] for token in doc: if token.text.upper() FCC: custom_entities.append({text: token.text, label: ORG}) # 合并并去重 return entities custom_entities集成更强大的NER工具对于高精度要求场景可以集成像Stanford NLP的NER或基于BERT的模型但需权衡速度。5.4 程序运行错误与依赖问题问题现象可能原因检查与解决方式OSError: [E050] Can‘t find model ‘en_core_web_md’.未下载spaCy模型。运行python -m spacy download en_core_web_md。确认虚拟环境已激活。抽取结果为空None。1. 输入文本为空或全是空格。2. 句子结构过于复杂超出规则覆盖范围。3. 文本包含大量拼写错误或非标准语法。1. 检查输入文本。2. 添加更多日志打印doc的依存关系图spacy.displacy进行分析。3. 考虑使用文本预处理如拼写检查或更健壮的备用策略。处理速度很慢。1. 首次加载模型需要时间。2. 处理文本非常长。3. 在循环中重复加载模型。1. 首次加载慢是正常的。2. 对于长文本考虑分句处理。3.确保NewsInfoExtractor类只初始化一次nlp对象全局复用。实体类型subject_type总是UNKNOWN。_get_entity_type方法中的匹配逻辑过于简单。优化匹配逻辑例如使用字符串模糊匹配fuzzywuzzy库或基于词性的启发式规则。6. 生产环境最佳实践与扩展方向将上述代码用于学习和小型项目是可行的但要投入生产环境还需要考虑更多因素。6.1 工程化改进清单配置化管理将模型名称、规则阈值、自定义词典等参数抽取到配置文件如config.yaml中。日志记录使用logging模块替代print记录信息、警告和错误便于监控和调试。异常处理在extract_from_text等方法内部添加更细致的try-except块确保单条文本处理失败不会导致整个服务崩溃。性能优化批处理spaCy的nlp.pipe方法可以高效处理文本列表比循环调用nlp()更快。def extract_batch(self, texts: List[str]) - List[Optional[Dict]]: results [] for doc in self.nlp.pipe(texts, batch_size50): # batch_size可调 results.append(self._process_single_doc(doc)) return results模型选择如果对精度要求不是极高可以使用更小的模型en_core_web_sm以提升速度。测试覆盖编写单元测试tests/test_extractor.py覆盖主动语态、被动语态、复杂宾语、实体识别、空输入、错误输入等场景。输入验证与清洗对输入文本进行去噪、编码处理、长度截断等。6.2 扩展为完整的信息处理管道当前模块只是一个抽取器。一个完整的系统可能包括以下环节数据源 (RSS/API/爬虫) - 文本获取 - 预处理 - 信息抽取 - 结果存储 - 应用服务 (API/告警/分析)文本获取在scraper.py中实现从新闻网站RSS、API或通过爬虫获取原始HTML并清洗出正文。结果存储将抽取出的结构化JSON存入数据库如Elasticsearch用于搜索Neo4j用于关系图谱或PostgreSQL。应用服务使用FastAPI或Flask构建一个RESTful API提供信息抽取服务。6.3 迈向更智能的抽取基于深度学习基于规则和句法的方法在句式规范时效果好但泛化能力有限。对于更复杂、多变的文本可以考虑关系抽取模型使用预训练的BERT等Transformer模型在关系抽取数据集如SemEval, TACRED上进行微调直接学习从文本中预测(subject, relation, object)。事件抽取使用专门的事件抽取模型识别事件触发词、论元及其角色适用于“谁在何时何地做了什么”这类更复杂的描述。少样本/零样本学习利用像ChatGPT这类大语言模型的提示工程Prompt Engineering能力通过设计精妙的提示词让其直接输出结构化信息。这种方法快速灵活但成本、延迟和稳定性需要评估。6.4 核心注意事项领域适配是关键金融、法律、医疗等不同领域的文本特点和实体类型差异巨大通用模型和规则往往需要针对性地调整和优化。评估不可少在优化过程中必须构建一个标注好的测试集用精确率、召回率、F1值等指标量化模型/规则的效果避免盲目调整。规则与模型的结合在实际生产中混合系统Hybrid System通常更鲁棒。例如先用高精度的规则处理常见、明确的模式再用统计模型处理剩余复杂情况。通过以上步骤我们完成了一个从新闻标题中提取结构化信息的技术方案。它从一个具体的需求出发涵盖了环境搭建、核心算法实现、运行验证、问题排查和工程化扩展的全过程。这个方案的核心思路——即利用NLP工具解析文本再通过规则或模型提取结构化事实——可以灵活地迁移到其他类似的信息处理任务中。

相关新闻

Claude托管代理四大更新:AI编程助手如何从玩具走向工具

Claude托管代理四大更新:AI编程助手如何从玩具走向工具

如果你最近在关注AI编程助手,可能会注意到一个现象:Claude的官方桌面应用和VS Code插件Claude Code,正在成为越来越多开发者的新选择。但与此同时,很多新用户却卡在了第一步——“Claude is not available to new users right now…

2026/10/18 8:13:32 阅读更多 →
UE5性能分析:追踪目录与分析目录的核心区别与实战配置

UE5性能分析:追踪目录与分析目录的核心区别与实战配置

1. 项目概述:从“追踪”到“分析”的性能优化闭环 在UE5项目开发的中后期,性能优化是每个团队都必须啃下的硬骨头。你可能会发现,明明在编辑器里跑得挺流畅的场景,打包后却出现了卡顿;或者一个看似简单的功能&#xff…

2026/10/18 7:15:36 阅读更多 →
AI导购系统架构解析:从RAG、大模型微调到vivo官网实战

AI导购系统架构解析:从RAG、大模型微调到vivo官网实战

1. 从“货架”到“顾问”:为什么vivo官网需要AI导购? 如果你最近逛过vivo官网,可能会发现它和以前有点不一样了。过去,你面对的是一个设计精美但相对静态的“线上货架”——按品类、按价格、按系列排列好的手机、手表、耳机&#…

2026/10/16 1:21:59 阅读更多 →

最新新闻

三语言实现大文件分片上传实战

三语言实现大文件分片上传实战

文件上传功能实战:Java、Python、PHP 实现大文件分片上传在现代 Web 应用开发中,大文件上传是一个常见且复杂的场景。传统一次性上传方式在面对 100MB 以上文件时,容易因网络波动、超时或内存溢出导致失败。分片上传(Chunked Uplo…

2026/10/18 8:14:12 阅读更多 →
自组织映射SOM原理与Python实现:从竞争学习到拓扑保持

自组织映射SOM原理与Python实现:从竞争学习到拓扑保持

简介:这份资源是面向机器学习初学者与数据科学学习者的SOM自组织映射神经网络Python实现项目,聚焦无监督学习中的数据降维、聚类与可视化需求。SOM通过竞争学习将高维输入映射到低维拓扑空间,是理解神经网络竞争机制的经典入门算法&#xff0…

2026/10/18 8:14:12 阅读更多 →
多步流程中的越权漏洞剖析与修复实践

多步流程中的越权漏洞剖析与修复实践

前阵子做一次授权安全评估,某项目的后台审批流程让我印象很深。这个系统有一条"发起申请 → 业务审批 → 办结归档"的三步链路,前两步做得挺规范,登录校验、状态控制、角色校验都到位了。问题恰恰出在最后一步:审批接口…

2026/10/18 8:14:12 阅读更多 →
开发岗没出路?四条转型路线与实操避坑指南

开发岗没出路?四条转型路线与实操避坑指南

做开发这些年,我越来越常听见身边人问:“开发岗是不是没出路了?”起因无外乎三种:投了一轮简历回复寥寥,面了几轮被源码级问题问到怀疑人生,或者眼看部门收缩、项目砍掉,今天还在维护老系统&…

2026/10/18 8:14:12 阅读更多 →
LangChain六组件完全指南:模型、提示词、链、记忆、检索、Agent

LangChain六组件完全指南:模型、提示词、链、记忆、检索、Agent

很多人第一次打开 LangChain 的文档,都会被那一大堆 Module 名字吓到——模型、提示词、链、记忆、检索、代理、回调,好像每个都能单独写一本书。但如果你退一步看,LangChain 其实只做了一件事:把大模型和各类外部能力串联起来。而…

2026/10/18 8:14:12 阅读更多 →
一阶倒立摆平衡车仿真与GUI调参工具:从建模到源码全解析

一阶倒立摆平衡车仿真与GUI调参工具:从建模到源码全解析

先说个反直觉的结论:做平衡车,最花时间的不一定是焊板子和调实车,而是把一阶倒立摆模型在GUI里跑通。我见过太多人上来就调PID,参数改来改去,最后连车为什么一直朝一个方向冲都说不清楚——根子在于脑子里没有一个能复…

2026/10/18 8:13:12 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →