demo_bid_announcement.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. # -*- coding: utf-8 -*-
  2. """
  3. 检索招投标公告中的招标人和中标人信息示例
  4. 这个示例展示了如何使用 BidiRag 从招投标公告中提取:
  5. - 招标人(采购人/采购单位)
  6. - 中标人
  7. - 相关关键词
  8. """
  9. import sys
  10. import os
  11. # 添加项目根目录到路径
  12. sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
  13. from bdirag.bidi_rag import BidiRag
  14. def demo_bid_announcement_search():
  15. """演示招投标公告检索"""
  16. print("=" * 80)
  17. print("招投标公告信息检索示例")
  18. print("=" * 80)
  19. # 1. 初始化 BidiRag(使用 BM25 HTML Tree 方法)
  20. print("\n[步骤 1] 初始化 BidiRag...")
  21. rag = BidiRag(rag_method='bm25_html_tree')
  22. # 2. 模拟招投标公告数据
  23. print("\n[步骤 2] 添加招投标公告...")
  24. announcements = [
  25. """<html>
  26. <body>
  27. <h1>政府采购意向公告</h1>
  28. <table>
  29. <tr><td>采购意向单位</td><td>大连长兴岛经济技术开发区交流岛街道办事处</td></tr>
  30. <tr><td>采购项目名称</td><td>交流岛滨海路夜间出行照明提升工程</td></tr>
  31. <tr><td>预算金额</td><td>147.060000万元</td></tr>
  32. <tr><td>采购品目</td><td>路灯照明工程</td></tr>
  33. <tr><td>采购需求概况</td><td>在滨海路安装太阳能路灯200盏(单排)</td></tr>
  34. <tr><td>预计采购时间</td><td>2026-05</td></tr>
  35. </table>
  36. </body>
  37. </html>""",
  38. """<html>
  39. <body>
  40. <h1>中标公告</h1>
  41. <table>
  42. <tr><td>采购人</td><td>XX市财政局</td></tr>
  43. <tr><td>项目名称</td><td>办公设备采购项目</td></tr>
  44. <tr><td>中标人</td><td>XX办公设备有限公司</td></tr>
  45. <tr><td>中标金额</td><td>50万元</td></tr>
  46. <tr><td>采购内容</td><td>电脑、打印机、复印机等办公设备</td></tr>
  47. </table>
  48. </body>
  49. </html>""",
  50. """<html>
  51. <body>
  52. <h1>招标公告</h1>
  53. <table>
  54. <tr><td>招标人</td><td>XX市交通运输局</td></tr>
  55. <tr><td>项目名称</td><td>智慧交通系统建设项目</td></tr>
  56. <tr><td>项目预算</td><td>5000万元</td></tr>
  57. <tr><td>招标内容</td><td>交通信号控制系统、视频监控系统</td></tr>
  58. <tr><td>投标截止时间</td><td>2024-06-15</td></tr>
  59. </table>
  60. </body>
  61. </html>""",
  62. """<html>
  63. <body>
  64. <h1>中标结果公告</h1>
  65. <table>
  66. <tr><td>招标人</td><td>XX市城市建设投资集团</td></tr>
  67. <tr><td>中标人</td><td>XX建设工程有限公司</td></tr>
  68. <tr><td>项目名称</td><td>道路建设项目</td></tr>
  69. <tr><td>中标金额</td><td>18500万元</td></tr>
  70. <tr><td>建设内容</td><td>道路路基、路面、桥梁工程</td></tr>
  71. </table>
  72. </body>
  73. </html>"""
  74. ]
  75. rag.add_texts(announcements)
  76. print(f"✓ 已添加 {rag.get_document_count()} 个公告")
  77. # 3. 检索招标人信息
  78. print("\n" + "=" * 80)
  79. print("[示例 3] 检索招标人/采购人信息")
  80. print("=" * 80)
  81. print("\n使用关键词: ['招标人', '采购人', '采购意向单位']")
  82. results = rag.retrieve(
  83. query="招标人信息",
  84. top_k=5,
  85. keywords=["招标人", "采购人", "采购意向单位", "采购单位"]
  86. )
  87. print(f"\n找到 {len(results)} 个相关结果:\n")
  88. for i, (doc, score) in enumerate(results, 1):
  89. print(f"--- 结果 {i} (相关性: {score:.3f}) ---")
  90. print(doc.page_content)
  91. print()
  92. # 4. 检索中标人信息
  93. print("\n" + "=" * 80)
  94. print("[示例 4] 检索中标人信息")
  95. print("=" * 80)
  96. print("\n使用关键词: ['中标人']")
  97. results = rag.retrieve(
  98. query="中标人信息",
  99. top_k=5,
  100. keywords=["中标人", "中标单位"]
  101. )
  102. print(f"\n找到 {len(results)} 个相关结果:\n")
  103. for i, (doc, score) in enumerate(results, 1):
  104. print(f"--- 结果 {i} (相关性: {score:.3f}) ---")
  105. print(doc.page_content)
  106. print()
  107. # 5. 同时检索招标人和中标人
  108. print("\n" + "=" * 80)
  109. print("[示例 5] 同时检索招标人和中标人")
  110. print("=" * 80)
  111. print("\n使用关键词: ['招标人', '中标人']")
  112. results = rag.retrieve(
  113. query="项目参与方",
  114. top_k=5,
  115. keywords=["招标人", "中标人"]
  116. )
  117. print(f"\n找到 {len(results)} 个相关结果:\n")
  118. for i, (doc, score) in enumerate(results, 1):
  119. print(f"--- 结果 {i} (相关性: {score:.3f}) ---")
  120. print(doc.page_content)
  121. print()
  122. # 6. 关键词精确搜索
  123. print("\n" + "=" * 80)
  124. print("[示例 6] 关键词精确搜索")
  125. print("=" * 80)
  126. print("\n搜索同时包含'招标人'和'中标人'的公告:")
  127. results = rag.search_keywords(["招标人", "中标人"])
  128. print(f"\n找到 {len(results)} 个公告:\n")
  129. for i, doc in enumerate(results, 1):
  130. print(f"--- 公告 {i} ---")
  131. # 提取关键信息
  132. content = doc.page_content
  133. if "招标人" in content:
  134. import re
  135. match = re.search(r'招标人[::].{0,50}', content)
  136. if match:
  137. print(f" {match.group(0)}")
  138. if "中标人" in content:
  139. match = re.search(r'中标人[::].{0,50}', content)
  140. if match:
  141. print(f" {match.group(0)}")
  142. print()
  143. # 7. 检索特定项目
  144. print("\n" + "=" * 80)
  145. print("[示例 7] 检索特定项目信息")
  146. print("=" * 80)
  147. print("\n搜索'太阳能路灯'项目:")
  148. results = rag.retrieve(
  149. query="太阳能路灯",
  150. top_k=3,
  151. keywords=["路灯", "照明", "太阳能"]
  152. )
  153. print(f"\n找到 {len(results)} 个相关结果:\n")
  154. for i, (doc, score) in enumerate(results, 1):
  155. print(f"--- 结果 {i} (相关性: {score:.3f}) ---")
  156. print(doc.page_content[:300])
  157. print()
  158. print("\n" + "=" * 80)
  159. print("示例完成!")
  160. print("=" * 80)
  161. print("\n总结:")
  162. print("1. 使用 bm25_html_tree 方法可以有效检索 HTML 结构的招投标公告")
  163. print("2. 通过 keywords 参数可以精化检索结果")
  164. print("3. search_keywords 方法可以进行精确的关键词匹配")
  165. print("4. 可以从公告中提取招标人、中标人、项目信息等关键字段")
  166. if __name__ == "__main__":
  167. demo_bid_announcement_search()