Skip to content

Latest commit

 

History

History
231 lines (159 loc) · 16.5 KB

File metadata and controls

231 lines (159 loc) · 16.5 KB

AromaNexus

CI Python 3.11+

English · 简体中文

一套重视数据来源追踪的化学—感官数据整理工具:把化合物工作簿扩充为可核查、可继续分析的数据表。

AromaNexus 将化学身份、气相色谱保留指数、气味描述、阈值,以及可选的嗅觉受体实验结果串联起来。对于 XLSX 到 XLSX 的流程,它只更新指定工作表并保留受支持的工作簿内容,同时规范化不同来源的结果并记录每项扩充数据来自哪里。输出可作为后续统计分析、化学信息学与边界清晰的机器学习实验输入。

XLSX / CSV / TSV
      │
      ▼
验证标识符 ──► 带缓存的数据源适配器 ──► 规范字段 + 来源记录
                                                │
                                                ▼
                                      新的、便于分析的数据表

这次升级带来了什么

原有四套工作簿脚本仍然保留,同时新增了统一 CLI:

  • 严格验证 CAS,并明确标记名称匹配歧义;
  • 默认记录状态、来源 URL、获取时间、缓存、版本、许可链接和诊断信息;
  • 使用保守的访问间隔、有限重试与持久缓存;
  • 原子写入、定期生成恢复检查点,默认不覆盖已有文件;
  • 以工作簿为单位写入 XLSX,保留非目标工作表、未被输出字段指向的原公式、格式及常见工作表功能;
  • 在原有 NIST、MFFI、ChemicalBook 流程之外,增加 PubChem、Pyrfume 与 M2OR 扩充。

安装

需要 Python 3.11 或更高版本。

Windows PowerShell

python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
python -m pip install -e .

macOS 或 Linux

python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -e .

安装后先确认版本并查看所有数据源的访问模式:

aromanexus --version
aromanexus sources

# 控制台启动器不可用时,可使用等价的模块入口
python -m aromanexus --version

快速开始

CLI 支持 .xlsx.csv.tsv。列名均可修改;下面使用默认列名。

# 规范化身份、理化性质、同义词、CAS 标识符与带来源的气味文本
aromanexus pubchem compounds.xlsx --identifier-column "CAS Number"

# 在名称查询前跳过当前数据集中的结构标签
aromanexus pubchem compounds.xlsx --identifier-column "Name" --skip-pattern '^C\d+$'

# 只把已有 CAS 列作为名称查询候选的保守确认信号
aromanexus pubchem compounds.xlsx --identifier-column "Name" --existing-cas-column "Existing CAS"

# 跳过 PUG-View 请求,并省略仅用于气味信息的输出列组
aromanexus pubchem compounds.xlsx --no-odor

# 按精确名称选择工作表
aromanexus pubchem compounds.xlsx --sheet "Data" --identifier-column "Name"

# 在 NIST 中寻找最接近实验计算值的保留指数
aromanexus nist-ri data.xlsx \
  --cas-column "CAS Number" \
  --calculated-ri-column "Calculated RI"

# 通过 NIST WebBook 将化合物名称解析为 CAS
aromanexus resolve-cas names.xlsx --name-column "Name"

# 查询选定的 Pyrfume 集合;缺少 CID 时会通过 PubChem 解析
aromanexus pyrfume compounds.xlsx --archives aromadb,superscent

# 可选的分子—嗅觉受体实验依据
aromanexus m2or compounds.xlsx --cas-column "CAS Number"

# 需要交互浏览器的兼容数据源
aromanexus mffi compounds.xlsx --cas-column "CAS Number"

# 设有许可门槛的旧版数据源;命令会要求明确确认
aromanexus chemicalbook-legacy compounds.xlsx --cas-column "CAS Number"

在 PowerShell 中,请把多行命令写成一行,或将 Bash 的 \ 续行符换成 PowerShell 的反引号。

命令一览

命令 默认输入列 用途 默认输出后缀
aromanexus sources 列出数据源、用途和访问方式;providers 是别名。
aromanexus nist-ri INPUT CAS NumberCalculated RI 在原流程指定的 NIST 非极性柱、自定义升温 RI 表中匹配最接近值。 _nist_result
aromanexus resolve-cas INPUT Name 通过 NIST 将无歧义的化合物名称解析为 CAS Registry Number。 _with_cas
aromanexus pubchem INPUT CAS Number 添加 CID、名称、结构标识符、选定性质、同义词、CAS 标识符和带来源的气味注释。 _pubchem
aromanexus pyrfume INPUT PubChem CID;若需解析 CID,则用 CAS Number 匹配白名单内的固定版本档案:aromadbflavornetsuperscent;默认 aromadb,superscent _pyrfume
aromanexus m2or INPUT CAS Number 汇总分子—受体配对、响应配对、物种、人类响应受体和研究 DOI。 _m2or
aromanexus mffi INPUT CAS Number 通过可见 Chrome 获取中英文名、感官特征和水中阈值;确认不需要交互时才使用 --headless _mffi_result
aromanexus chemicalbook-legacy INPUT CAS Number 保留原有气味、阈值和香型交互流程;在确认有书面许可前禁用。 _cb_result

使用 aromanexus COMMAND --help 查看列名及数据源专用选项。全局参数必须写在子命令之前:

aromanexus --cache-dir .cache/aromanexus --timeout 30 pubchem compounds.xlsx

对于 XLSX 输入,所有表格命令默认处理工作簿顺序中的第一个工作表。使用 --sheet "Data" 可按区分大小写的精确名称选择其他工作表。若名称不存在,命令会在调用数据源前报错;CSV/TSV 输入不接受 --sheet

输出、检查点与覆盖保护

所有表格命令默认在输入文件旁生成新文件,保留原有行序和列,再添加数据源字段。例如,PubChem 会将 compounds.xlsx 输出为 compounds_pubchem.xlsx

当输入与输出均为 XLSX 时,AromaNexus 从源文件的不可变副本出发,只在指定工作表叠加扩充单元格。非目标工作表的 XML 保持不变;受支持的原值、样式、行高、列宽、冻结窗格、筛选器、表格、数据验证、条件格式、工作簿属性、公式及公式缓存结果也会保留。已有公式只在某个输出字段明确指向该单元格时才会按请求替换,其他原公式不会被改写。目标表格矩形之外的合并单元格会保留;与该矩形相交的合并区域会在访问数据源前被拒绝。新获取且形似公式的文本会被转义;.partial.xlsx 检查点遵循相同规则。

Openpyxl 无法保留所有 OOXML 功能。因此,AromaNexus 会先在内存中试写一遍;若检测到绘图形状、批注、ActiveX/OLE 控件、切片器、线程批注、VML、数字签名等已知高风险内容,或任何会被试写丢弃的 OOXML 包部件,就会在调用数据源前停止。Excel 的可选计算链可能会被移除,以便表格软件重新生成。若显式输出 CSV/TSV,结果只是扁平表格,无法保留 Excel 专属内容。

默认来源记录包括数据源状态、来源 URL、获取时间、是否命中缓存、数据源接口或固定快照标签、许可 URL 与诊断信息。Retrieved At 只表示真正取得数据源响应或缓存表示的时间;显式 skipped、请求前发现的无效输入、尚未收到响应的网络失败等本地结果会留空。只有在确实需要旧版形状时才使用 --no-provenance

PubChem 会单独报告 CAS 解析状态。仅当查询本身是已确认的 CAS、名称查询只剩一个校验有效的候选,或 --existing-cas-column 中的有效 CAS 确实出现在返回候选里时,才填入 Resolved CAS。已有 CAS 与候选冲突或本身无效时保持未解析;空单元格会回退到原有的 uniquemultiplemissing 规则。对于 partial 数据源结果,只接受查询或已有 CAS 的正向确认;依赖完整候选集合的判断会保持 not_evaluated。原始标识符列和已有 CAS 列都不会被改写;若已有 CAS 列名与当前输出列重叠,CLI 会在请求前拒绝运行。

PubChem 气味扩充默认开启。--no-odor 会跳过 PUG-View 请求,并且不新增或更新 PubChem OdorPubChem Odor AnnotationsPubChem Odor SourcesPubChem Odor Source URLsPubChem Odor License URLs。如果输入中原本就有这些列,它们会原样保留。

PubChem Version 是逐行记录的接口尝试标签。使用 --no-odor,或查询在尝试气味端点前已经结束时,该字段为 PUG REST;一旦开始请求 PUG-View,则为 PUG REST + PUG-View,即使该行随后报告为 partial。这个标签不代表 PUG-View 一定返回或贡献了气味注释;还应检查 PubChem StatusPubChem Message 与气味字段。在调用 PubChem 客户端前就被跳过的行,其版本字段保持为空。

# 明确指定输出位置
aromanexus pubchem compounds.xlsx --output results/compounds_enriched.xlsx

# 每处理 10 行保存一次恢复检查点;设为 0 可关闭
aromanexus pubchem compounds.xlsx --checkpoint-every 10

# 明确覆盖一个已存在的目标文件
aromanexus pubchem compounds.xlsx --output compounds_pubchem.xlsx --force

检查点形如 compounds_pubchem.partial.xlsx:需要使用时会在访问数据源前验证,运行期间定期刷新,中断后保留,最终文件写入成功后删除。每次保存的检查点仍是完整、可直接打开的工作簿,而不是进度日志。保真写入路径会尽量减少重复的整本工作簿序列化开销,但更短的间隔仍意味着更多次写盘,是运行速度与恢复文件新鲜度之间的取舍。AromaNexus 只会删除本次运行自己创建且未被外部替换的检查点;无关的 .partial 文件不会被碰。若目标文件或本次必需的检查点路径已存在,命令会停止,除非显式传入 --force。即使使用 --force,输入路径或同一文件的别名也不能作为输出或检查点路径。

成功的 HTTP 响应与下载快照默认缓存到 ~/.cache/aromanexus。如需更改位置,可设置 AROMANEXUS_CACHE_DIR,或在子命令之前传入 --cache-dir;更名前的缓存环境变量仍可兼容使用。

数据来源、访问方式与权利边界

访问规则与数据条款可能变化。正式抓取、发表或再分发前,请重新检查下列官方页面。本仓库不会替第三方数据授予使用权。

数据源 本工具使用的数据 访问与缓存方式 权利与科学边界
PubChem PUG REST + PUG-View 化合物身份、选定性质、同义词/CAS 标识符,以及带贡献者来源的气味注释 调用 NCBI 在线 API 并持久缓存响应。未缓存请求间隔为 0.25 秒,即每秒 4 次,低于 PubChem 的每秒 5 次上限;瞬时失败只进行有限重试。 PubChem 汇集不同贡献者记录。输出保留注释来源名、来源 URL 和许可 URL;请同时检查 NCBI 政策及各贡献者条款。
NIST Chemistry WebBook,SRD 69 保留指数查询、名称解析 CAS HTML 持久缓存;未缓存请求之间至少间隔 5 秒,遵守公开的 robots.txt 适用 NIST Standard Reference Data 权利规定。应按需获取并引用,不要把该服务当作可自由再分发的批量数据集。
Pyrfume Public Data Archive 以 PubChem CID 为键、固定版本的 aromadbflavornetsuperscent 文件 仅允许显式列出的档案;从固定提交下载选定文件并在本地缓存。 权利以每个 manifest 和上游集合为准。仓库代码的许可证不会自动覆盖每一份数据;输出会保留 manifest 的来源、备注与许可说明。
M2OR 分子—嗅觉受体配对、响应标签、物种、受体和 DOI 可选的固定版本 CSV 快照,约 43 MB;首次使用时下载并缓存,本仓库不捆绑该文件。 上游快照采用 Apache-2.0。这些是生物测定结果,不代表人的感知质量、安全性、疗效或临床结局。
MFFI 中英文名、感官特征和水中阈值 通过 Selenium/Chrome 交互访问,并使用保守的逐行间隔。目前未发现公开且有文档的 API 或速率政策。 目前未发现明确的再利用许可证。网页可访问或 robots 允许访问,并不等于获得再发布许可;请保守使用并引用来源。
ChemicalBook 旧版气味描述、嗅觉阈值和香型兼容流程 **默认禁用,并设有许可门槛。**当前 robots.txt 排除了搜索及属性页面路径。连接器保持可见和手动,不会破解或绕过 CAPTCHA。 只有在书面许可明确覆盖所需自动访问与再利用时才能运行。--i-have-permission 是操作者自己的声明,不代表本项目提供了许可。

Codex 项目 Skill

仓库内置了项目级 Skill:.agents/skills/curate-aroma-data/。在 Codex 中可直接调用:

$curate-aroma-data

该 Skill 会检查工作簿、选择满足需求的最小数据源组合、预览访问及输出影响、执行一个聚焦命令,并核对行数、结构、状态和来源记录。它只是本软件包之上的流程编排指南,不是另一套爬虫,也不会自动赋予数据使用权。

也可以直接运行其中只读的工作簿检查工具:

python .agents/skills/curate-aroma-data/scripts/inspect_workbook.py compounds.xlsx --sheet "Data"

旧版兼容入口

更名前的 flavor-data 命令与 flavor_data_crawler Python 命名空间继续作为兼容别名。新集成建议使用 aromanexus,现有自动化无需立刻重写。

原有脚本与 Windows 启动器仍然保留,继续支持固定的工作簿布局。它们默认处理第一个工作表;需要选择其他工作表时请使用统一 CLI。

启动器 脚本 预期工作簿 必需列 输出
start1.bat nist_excel_tool.py data.xlsx CAS NumberCalculated RI data_result.xlsx
start2.bat name_to_cas.py name.xlsx Name name_with_cas.xlsx
start3.bat mffi_spider.py max.xlsx CAS Number max_mffi_result.xlsx
start4.bat cb_spider.py Odor.xlsx CAS Number Odor_cb_result.xlsx

.bat 会依次寻找 .venvmyenvvenv,最后才使用系统 python。兼容脚本会刻意生成不含来源列的旧版结果,并覆盖固定名称的结果文件;新任务建议使用 CLI,以获得明确路径与覆盖保护。MFFI 和 ChemicalBook 需要本机可用的 Chrome,ChemicalBook 仍会要求输入许可确认短语。

开发与测试

安装开发依赖后,运行离线测试和代码检查:

python -m pip install -e ".[dev]"
python -m ruff check .
python -m ruff format --check .
python -m pytest

CI 会在 Ubuntu 与 Windows 上使用 Python 3.11 和 3.13 执行上述检查。测试通过固定样例或注入客户端运行,不依赖实时网站,也不依赖 Codex 运行环境。

负责任地使用

  • 针对你的具体用途核对数据源条款、robots 规则、引用要求和再分发权利。
  • 保持保守请求频率,优先使用缓存。
  • 不得绕过 CAPTCHA、身份验证、付费墙或其他访问控制。
  • not_foundinvalid_inputhttp_errornetwork_errorparse_errormissing_datadata_errorpartialblockedskipped 视为不同结果。
  • 在统计、化学信息学或机器学习工作中使用前,核对来源记录与生物学适用范围。

许可证

AromaNexus 的源代码与原创文档采用 MIT License 授权。

该许可证不会授予任何第三方数据集、网站内容、数据源响应或生成数据集的使用权。 通过 PubChem、NIST、Pyrfume、M2OR、MFFI、ChemicalBook 或其他来源取得的 数据,仍分别受各来源适用的条款、许可证及使用限制约束。