// 源文本 → 产业链环节 · 批量矩阵映射
将任意源文本文档,通过向量相似度与可配置的规则矩阵,批量精准映射到产业链图谱的具体环节。 支持百万级文档处理,所有匹配逻辑编码为矩阵运算,一次乘法得出全量结果,无需逐条循环。
A/B组门控、排他兜底、L0级联筛选,全部预编码为配置矩阵。匹配时一次矩阵乘法得出 m×n 完整结果,无逐条循环,可扩展至百万级文档。
A 组(特定应用)需通过 L0 根节点相似度门控;B 组(通用赋能)直接匹配,两类链路共存于同一矩阵运算中,无需分批处理。
排他归属矩阵(Exclusion Mapping Matrix)确保兜底节点仅在同级所有具体节点均未命中时才触发,支持 L3、L4 等多层级场景。
内置四步标定流水线:按相似度分箱采样 → LLM 判断 → 统计符合率 → 导出个性化阈值。也支持手动配置 CSV 跳过此步骤。
一次性运行:LLM 为每个产业链节点生成 embedding 友好的文字定义,向量化后保存。更换产业链时重新执行此阶段即可,匹配阶段无需变动。
支持任意文本类型(描述、摘要等)。预处理后分批向量化,输出 source_part_*.npz,可增量追加新批次。
步骤 0→3:构建配置矩阵 → 批量相似度计算 → 阈值+掩码匹配 → 导出 Parquet。无 GPU 要求,全程矩阵运算,支持断点续跑。
所有匹配判断均编码为矩阵运算,核心思路是将"业务规则"提前预计算为配置矩阵,
匹配时只需三次矩阵乘法 + 逐元素掩码合并,即可得到 m × n 的完整匹配结果。
Sim_L0 = L0_Embed @ D.T → (1, n) L0 根节点 vs 全部源文本 Sim_Spec = Spec_Embeds @ D.T → (m_spec, n) 具体链路 vs 全部源文本 Sim_Other_Parent = OtherParent_Embeds @ D.T → (m_other, n) "其他"父级 vs 全部源文本
| 链路类型 | 匹配条件 | 涉及矩阵 |
|---|---|---|
| A 组具体链路 | Sim_Spec[j,i] > Threshold_Spec[j] 且 Sim_L0[i] > T_L0 | Spec_Mask ∧ Cascade_Mask |
| B 组具体链路 | Sim_Spec[j,i] > Threshold_Spec[j] | Spec_Mask(L0 门控自动豁免) |
| "其他"兜底节点 | Sim_Other_Parent[k,i] > Threshold_Other[k] 且 同级具体节点均未命中 且 通过类型门控 | Other_Mask ∧ No_Sibling_Match ∧ Cascade_Mask |
每条链路预标注类型(A=特定应用 / B=通用赋能)。A 组链路需要 L0 相似度超过全局阈值 T_L0 才能命中,
B 组直接匹配。两组共享同一套相似度矩阵,Chain_Type_Vector 控制 L0 门控是否生效。
预计算一个稀疏矩阵 E (m_other × m_spec),记录每个"其他"节点需要排他的具体兄弟节点。
匹配时 No_Sibling_Match = (E @ Spec_Mask_bool == 0),
一次矩阵乘法即可判断是否有兄弟节点命中。
相似度连续值需要转换为二元匹配决策。内置四步流水线: 按分箱采样 → LLM 逐条判断 → 统计各箱符合率 → 取目标符合率对应分位数作为阈值, 每条链路独立确定,也可完全手动配置。
源文本按文件分批处理,每批次的相似度矩阵独立保存。 中断后从上次完成的批次继续,不重复计算已完成的批次。 支持可选 GPU 加速(CuPy),CPU 环境同样可运行。
pip install -r requirements.txt
生成一条包含 13 个节点的虚构产业链和 200 条模拟文档,以及配套阈值文件。
python sample_data/generate_sample_data.py
python chain_matching_sop/prepare_chain_config.py # 步骤 0:构建配置矩阵 python chain_matching_sop/run_similarity.py # 步骤 1:计算相似度 python chain_matching_sop/apply_matching.py # 步骤 2:应用匹配逻辑 python chain_matching_sop/export_results.py # 步骤 3:导出结果
import pandas as pd
df = pd.read_parquet("chain_matching_sop/results/final_matching_results.parquet")
print(df.columns.tolist())
# ['chain_id', 'chain_name', 'info_id', 'similarity', 'source_text']
.env)| 变量 | 说明 |
|---|---|
| LLM_API_URL | OpenAI 兼容的 LLM 接口地址(阈值标定用) |
| LLM_API_KEY | API 鉴权密钥 |
| LLM_MODEL_NAME | LLM 判断所用的模型名称 |
| EMBEDDING_MODEL_PATH | 本地 embedding 模型路径(上游流水线用) |
| 文件 | 必需字段 | 形状 |
|---|---|---|
| chain_embeddings.npz | chain_names(字符串数组)、embeddings(float32) |
(m, d) |
| l0_embedding.npz | chain_names(单元素数组)、embeddings(float32) |
(1, d) |
| chain_type_classification.csv | chain_name、type(取值 A 或 B) |
— |
| source_part_*.npz | ids(整数数组)、embeddings(float32) |
(n_batch, d) |
| source_part_*.parquet | id(整数)、source_text(字符串) |
— |
chain_matching_sop/results/final_matching_results.parquet
| 字段 | 类型 | 说明 |
|---|---|---|
| chain_id | int | 产业链节点索引 |
| chain_name | str | 产业链节点全路径名称 |
| info_id | int | 源文本 ID |
| similarity | float32 | 余弦相似度得分 |
| source_text | str | 源文本内容 |
source_part_ 为前缀
(如 source_part_1.parquet → source_part_1.npz),
与 data_config.py 中的 SOURCE_EMBEDDINGS_PATTERN 保持一致。
如需自定义前缀,同步修改该配置项即可。