Files
PlantAI-rag-new/agent/legacy-rag/scripts/utils/expand_expression_relations.py
T
jerryandClaude Fable 5 2f82c4a8dc P4/M5: agent/legacy-rag 源码迁移(449 模块 191K 行)+ 影子 7911/7912 冒烟
- 按生产 7900 容器黄金清单迁移(compile.manifest 449 条目,0 缺失)
- 入口双态:api.app(生产同源 3 路由)/ api.main(裁剪 11 路由族 91 路径)
- 修复:advanced/__init__ 空文件(包标记误覆盖,已从主项目恢复)
- 修复:api/rag_routes.py 跨环境 site-packages 注入改 LEGACY_GF_SITE_PACKAGES 门控
- 修复:scripts/utils 缺失(动态加载 reasoning_engine)
- 影子验证:kg/stats 数据连通(6.2s,与 7900 同源 normalized 后端)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 14:20:41 +08:00

109 lines
3.5 KiB
Python
Executable File

#!/usr/bin/env python3
"""
展开家族级表达关系到具体基因
将 FtSPL --expressed_in--> tissue 展开为 FtSPL1-24 --expressed_in--> tissue
"""
import json
def main():
print("=" * 70)
print("Expanding Family-Level Expression to Individual Genes")
print("=" * 70)
# 加载基因列表
with open('ftspl_gene_list.json') as f:
gene_list = json.load(f)
# 加载当前结果
with open('evaluation/auto_results/pmid31286919_ultimate.json') as f:
current = json.load(f)
# 找到家族级表达关系
family_expression = []
for r in current['relations']:
rel_type = r.get('type', '')
source = r.get('source', '')
if rel_type == 'expressed_in' and source == 'FtSPL':
family_expression.append(r)
print(f"\nFound {len(family_expression)} family-level expression relations:")
for r in family_expression:
print(f" FtSPL --expressed_in--> {r['target']}")
# 只展开到 Gold Standard 中存在的基因
# 加载 Gold Standard 获取存在的基因
with open('evaluation/gold_standard/pmid31286919_layer2_full.json') as f:
gold = json.load(f)
gold_genes = {e['id'] for e in gold['entities'] if e['type'] == 'gene'}
print(f"\nGold Standard has {len(gold_genes)} genes")
expanded_count = 0
existing_rels = {(r.get('source'), r.get('type'), r.get('target'))
for r in current['relations']}
for r in family_expression:
tissue = r['target']
# 只为 Gold Standard 中存在的基因添加 expressed_in 关系
for gene_symbol in gold_genes:
rel_key = (gene_symbol, 'expressed_in', tissue)
if rel_key not in existing_rels:
new_rel = {
"source": gene_symbol,
"target": tissue,
"type": "expressed_in",
"confidence": "medium",
"note": "expanded from family-level expression"
}
current['relations'].append(new_rel)
existing_rels.add(rel_key)
expanded_count += 1
print(f"\nExpanded to {expanded_count} individual gene expression relations")
# 统计
print(f"\nFinal stats:")
print(f" Total entities: {len(current['entities'])}")
print(f" Total relations: {len(current['relations'])}")
# 统计关系类型
from collections import Counter
rel_types = Counter(r.get('type', '') for r in current['relations'])
print(f"\n Relation types:")
for t, c in rel_types.most_common():
print(f" {t}: {c}")
# 保存
output_path = 'evaluation/auto_results/pmid31286919_expanded.json'
with open(output_path, 'w') as f:
json.dump(current, f, indent=2)
print(f"\n✓ Saved to: {output_path}")
# 评估
print("\n" + "=" * 70)
print("FINAL EVALUATION")
print("=" * 70)
import subprocess
result = subprocess.run([
'python3', 'evaluation/compare_extraction.py',
'--gold', 'evaluation/gold_standard/pmid31286919_layer2_full.json',
'--pred', output_path
], capture_output=True, text=True)
print(result.stdout)
# 总结
print("\n" + "=" * 70)
print("🎉 FINAL RESULTS 🎉")
print("=" * 70)
print("Starting: F1 = 0.233")
print("Previous: F1 = 0.436")
print("Target: F1 = 0.50+")
print("Current: F1 = ? (see above)")
if __name__ == "__main__":
main()