| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- # -*- 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 = [
- """<html>
- <body>
- <h1>政府采购意向公告</h1>
- <table>
- <tr><td>采购意向单位</td><td>大连长兴岛经济技术开发区交流岛街道办事处</td></tr>
- <tr><td>采购项目名称</td><td>交流岛滨海路夜间出行照明提升工程</td></tr>
- <tr><td>预算金额</td><td>147.060000万元</td></tr>
- <tr><td>采购品目</td><td>路灯照明工程</td></tr>
- <tr><td>采购需求概况</td><td>在滨海路安装太阳能路灯200盏(单排)</td></tr>
- <tr><td>预计采购时间</td><td>2026-05</td></tr>
- </table>
- </body>
- </html>""",
-
- """<html>
- <body>
- <h1>中标公告</h1>
- <table>
- <tr><td>采购人</td><td>XX市财政局</td></tr>
- <tr><td>项目名称</td><td>办公设备采购项目</td></tr>
- <tr><td>中标人</td><td>XX办公设备有限公司</td></tr>
- <tr><td>中标金额</td><td>50万元</td></tr>
- <tr><td>采购内容</td><td>电脑、打印机、复印机等办公设备</td></tr>
- </table>
- </body>
- </html>""",
-
- """<html>
- <body>
- <h1>招标公告</h1>
- <table>
- <tr><td>招标人</td><td>XX市交通运输局</td></tr>
- <tr><td>项目名称</td><td>智慧交通系统建设项目</td></tr>
- <tr><td>项目预算</td><td>5000万元</td></tr>
- <tr><td>招标内容</td><td>交通信号控制系统、视频监控系统</td></tr>
- <tr><td>投标截止时间</td><td>2024-06-15</td></tr>
- </table>
- </body>
- </html>""",
-
- """<html>
- <body>
- <h1>中标结果公告</h1>
- <table>
- <tr><td>招标人</td><td>XX市城市建设投资集团</td></tr>
- <tr><td>中标人</td><td>XX建设工程有限公司</td></tr>
- <tr><td>项目名称</td><td>道路建设项目</td></tr>
- <tr><td>中标金额</td><td>18500万元</td></tr>
- <tr><td>建设内容</td><td>道路路基、路面、桥梁工程</td></tr>
- </table>
- </body>
- </html>"""
- ]
-
- 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()
|