# -*- coding: utf-8 -*- """ 检索招投标公告中的招标人和中标人信息示例 这个示例展示了如何使用 BidiRag 从招投标公告中提取: - 招标人(采购人/采购单位) - 中标人 - 相关关键词 """ import sys import os # 添加项目根目录到路径 sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from bdirag.bidi_rag import BidiRag def demo_bid_announcement_search(): """演示招投标公告检索""" print("=" * 80) print("招投标公告信息检索示例") print("=" * 80) # 1. 初始化 BidiRag(使用 BM25 HTML Tree 方法) print("\n[步骤 1] 初始化 BidiRag...") rag = BidiRag(rag_method='bm25_html_tree') # 2. 模拟招投标公告数据 print("\n[步骤 2] 添加招投标公告...") announcements = [ """

政府采购意向公告

采购意向单位大连长兴岛经济技术开发区交流岛街道办事处
采购项目名称交流岛滨海路夜间出行照明提升工程
预算金额147.060000万元
采购品目路灯照明工程
采购需求概况在滨海路安装太阳能路灯200盏(单排)
预计采购时间2026-05
""", """

中标公告

采购人XX市财政局
项目名称办公设备采购项目
中标人XX办公设备有限公司
中标金额50万元
采购内容电脑、打印机、复印机等办公设备
""", """

招标公告

招标人XX市交通运输局
项目名称智慧交通系统建设项目
项目预算5000万元
招标内容交通信号控制系统、视频监控系统
投标截止时间2024-06-15
""", """

中标结果公告

招标人XX市城市建设投资集团
中标人XX建设工程有限公司
项目名称道路建设项目
中标金额18500万元
建设内容道路路基、路面、桥梁工程
""" ] rag.add_texts(announcements) print(f"✓ 已添加 {rag.get_document_count()} 个公告") # 3. 检索招标人信息 print("\n" + "=" * 80) print("[示例 3] 检索招标人/采购人信息") print("=" * 80) print("\n使用关键词: ['招标人', '采购人', '采购意向单位']") results = rag.retrieve( query="招标人信息", top_k=5, keywords=["招标人", "采购人", "采购意向单位", "采购单位"] ) print(f"\n找到 {len(results)} 个相关结果:\n") for i, (doc, score) in enumerate(results, 1): print(f"--- 结果 {i} (相关性: {score:.3f}) ---") print(doc.page_content) print() # 4. 检索中标人信息 print("\n" + "=" * 80) print("[示例 4] 检索中标人信息") print("=" * 80) print("\n使用关键词: ['中标人']") results = rag.retrieve( query="中标人信息", top_k=5, keywords=["中标人", "中标单位"] ) print(f"\n找到 {len(results)} 个相关结果:\n") for i, (doc, score) in enumerate(results, 1): print(f"--- 结果 {i} (相关性: {score:.3f}) ---") print(doc.page_content) print() # 5. 同时检索招标人和中标人 print("\n" + "=" * 80) print("[示例 5] 同时检索招标人和中标人") print("=" * 80) print("\n使用关键词: ['招标人', '中标人']") results = rag.retrieve( query="项目参与方", top_k=5, keywords=["招标人", "中标人"] ) print(f"\n找到 {len(results)} 个相关结果:\n") for i, (doc, score) in enumerate(results, 1): print(f"--- 结果 {i} (相关性: {score:.3f}) ---") print(doc.page_content) print() # 6. 关键词精确搜索 print("\n" + "=" * 80) print("[示例 6] 关键词精确搜索") print("=" * 80) print("\n搜索同时包含'招标人'和'中标人'的公告:") results = rag.search_keywords(["招标人", "中标人"]) print(f"\n找到 {len(results)} 个公告:\n") for i, doc in enumerate(results, 1): print(f"--- 公告 {i} ---") # 提取关键信息 content = doc.page_content if "招标人" in content: import re match = re.search(r'招标人[::].{0,50}', content) if match: print(f" {match.group(0)}") if "中标人" in content: match = re.search(r'中标人[::].{0,50}', content) if match: print(f" {match.group(0)}") print() # 7. 检索特定项目 print("\n" + "=" * 80) print("[示例 7] 检索特定项目信息") print("=" * 80) print("\n搜索'太阳能路灯'项目:") results = rag.retrieve( query="太阳能路灯", top_k=3, keywords=["路灯", "照明", "太阳能"] ) print(f"\n找到 {len(results)} 个相关结果:\n") for i, (doc, score) in enumerate(results, 1): print(f"--- 结果 {i} (相关性: {score:.3f}) ---") print(doc.page_content[:300]) print() print("\n" + "=" * 80) print("示例完成!") print("=" * 80) print("\n总结:") print("1. 使用 bm25_html_tree 方法可以有效检索 HTML 结构的招投标公告") print("2. 通过 keywords 参数可以精化检索结果") print("3. search_keywords 方法可以进行精确的关键词匹配") print("4. 可以从公告中提取招标人、中标人、项目信息等关键字段") if __name__ == "__main__": demo_bid_announcement_search()