# -*- 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()