extract_features.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. #!/usr/bin/env python3
  2. """
  3. 特征提取脚本 - 小葱笔记风格海报
  4. 功能:从 4 张图片中提取 7 个维度的特征
  5. """
  6. import json
  7. import os
  8. from datetime import datetime
  9. # 输入输出路径
  10. INPUT_DIR = "/Users/elksmmx/Desktop/agent 2.10/Agent_dragon/examples/find knowledge_xiaocong/input"
  11. OUTPUT_DIR = "/Users/elksmmx/Desktop/agent 2.10/Agent_dragon/examples/find knowledge_xiaocong/output/features"
  12. # 创建输出目录
  13. DIMENSIONS = [
  14. "background_texture",
  15. "core_english_word",
  16. "hand_drawn_decorations",
  17. "layout_structure",
  18. "color_highlight",
  19. "knowledge_chart",
  20. "paper_clip"
  21. ]
  22. for dim in DIMENSIONS:
  23. os.makedirs(os.path.join(OUTPUT_DIR, dim), exist_ok=True)
  24. # 读取制作表
  25. def load_production_table(img_id):
  26. table_path = os.path.join(INPUT_DIR, f"小葱__img_{img_id}_制作表.json")
  27. with open(table_path, 'r', encoding='utf-8') as f:
  28. return json.load(f)
  29. # 读取提取需求
  30. def load_extraction_requirements():
  31. req_path = os.path.join(INPUT_DIR, "小葱提取需求.json")
  32. with open(req_path, 'r', encoding='utf-8') as f:
  33. content = f.read()
  34. # 解析需求(简化处理)
  35. return content
  36. # 生成 mapping.json 的函数
  37. def create_mapping_entry(dimension, img_id, paragraph_id, feature_type, feature_name, output_file):
  38. return {
  39. "dimension": dimension,
  40. "image": f"img_{img_id}.jpg",
  41. "paragraph": paragraph_id,
  42. "feature_type": feature_type, # 实质/形式
  43. "feature_name": feature_name,
  44. "output_file": output_file,
  45. "extraction_tool": "PaddleOCR + rembg + OpenCV (planned)",
  46. "extraction_date": datetime.now().isoformat()
  47. }
  48. # 主执行逻辑
  49. def main():
  50. print("=" * 60)
  51. print("小葱笔记风格海报 - 特征提取脚本")
  52. print("=" * 60)
  53. # 加载制作表
  54. tables = {}
  55. for i in range(1, 5):
  56. tables[i] = load_production_table(i)
  57. print(f"✓ 加载图{i}制作表")
  58. # 加载提取需求
  59. requirements = load_extraction_requirements()
  60. print("✓ 加载提取需求")
  61. # 初始化 mapping 数据
  62. mappings = {dim: [] for dim in DIMENSIONS}
  63. # 维度 1: 背景纹理
  64. print("\n--- 维度 1: 背景纹理 ---")
  65. for img_id in range(1, 5):
  66. paragraph_id = f"段落{img_id}.1" if img_id > 1 else "段落 1.1"
  67. entry = create_mapping_entry(
  68. dimension="background_texture",
  69. img_id=img_id,
  70. paragraph_id=paragraph_id,
  71. feature_type="实质 + 形式",
  72. feature_name="背景纹理与基质",
  73. output_file=f"img_{img_id}_background.png"
  74. )
  75. mappings["background_texture"].append(entry)
  76. print(f" 图{img_id}: {paragraph_id} → img_{img_id}_background.png")
  77. # 维度 2: 核心英文单词
  78. print("\n--- 维度 2: 核心英文单词 ---")
  79. for img_id in range(1, 5):
  80. paragraph_id = f"段落{img_id}.3.3" if img_id == 1 else f"段落{img_id}.2.2"
  81. entry = create_mapping_entry(
  82. dimension="core_english_word",
  83. img_id=img_id,
  84. paragraph_id=paragraph_id,
  85. feature_type="实质",
  86. feature_name="核心英文单词 Embedding",
  87. output_file=f"img_{img_id}_core_word.png"
  88. )
  89. mappings["core_english_word"].append(entry)
  90. print(f" 图{img_id}: {paragraph_id} → img_{img_id}_core_word.png")
  91. # 维度 3: 手绘装饰
  92. print("\n--- 维度 3: 手绘装饰元素 ---")
  93. decoration_paragraphs = {
  94. 1: ["段落 1.2.1.1", "段落 1.5.2"], # 星星、花朵
  95. 2: [], 3: [], 4: [] # 图 2-4 的装饰在回形针维度处理
  96. }
  97. for img_id, paragraphs in decoration_paragraphs.items():
  98. for para_id in paragraphs:
  99. entry = create_mapping_entry(
  100. dimension="hand_drawn_decorations",
  101. img_id=img_id,
  102. paragraph_id=para_id,
  103. feature_type="实质",
  104. feature_name="手绘装饰 (星星/花朵)",
  105. output_file=f"img_{img_id}_decorations.png"
  106. )
  107. mappings["hand_drawn_decorations"].append(entry)
  108. print(f" 图{img_id}: {para_id} → img_{img_id}_decorations.png")
  109. # 维度 4: 排版结构
  110. print("\n--- 维度 4: 排版结构与导视 ---")
  111. for img_id in range(1, 5):
  112. paragraph_id = f"段落{img_id}.3" if img_id == 1 else f"段落{img_id}.3"
  113. entry = create_mapping_entry(
  114. dimension="layout_structure",
  115. img_id=img_id,
  116. paragraph_id=paragraph_id,
  117. feature_type="形式",
  118. feature_name="排版结构与导视",
  119. output_file=f"img_{img_id}_layout.json"
  120. )
  121. mappings["layout_structure"].append(entry)
  122. print(f" 图{img_id}: {paragraph_id} → img_{img_id}_layout.json")
  123. # 维度 5: 色彩高亮
  124. print("\n--- 维度 5: 语义化色彩高亮 ---")
  125. color_paragraphs = {
  126. 1: "段落 1.3.4", # 粉色涂抹
  127. 2: "段落 2.3.2", # 蓝色高亮
  128. 3: "段落 3.3.4", # 紫色关键词
  129. 4: "段落 4.3.2" # 紫色关键词
  130. }
  131. for img_id, para_id in color_paragraphs.items():
  132. entry = create_mapping_entry(
  133. dimension="color_highlight",
  134. img_id=img_id,
  135. paragraph_id=para_id,
  136. feature_type="形式",
  137. feature_name="语义化色彩高亮",
  138. output_file=f"img_{img_id}_colors.json"
  139. )
  140. mappings["color_highlight"].append(entry)
  141. print(f" 图{img_id}: {para_id} → img_{img_id}_colors.json")
  142. # 维度 6: 知识可视化图表
  143. print("\n--- 维度 6: 知识可视化图表 ---")
  144. entry = create_mapping_entry(
  145. dimension="knowledge_chart",
  146. img_id=2,
  147. paragraph_id="段落 2.3.5",
  148. feature_type="实质",
  149. feature_name="Tokenization-Embedding 表格",
  150. output_file="img_2_table.png"
  151. )
  152. mappings["knowledge_chart"].append(entry)
  153. print(f" 图 2: 段落 2.3.5 → img_2_table.png")
  154. # 维度 7: 回形针装饰
  155. print("\n--- 维度 7: 回形针装饰 ---")
  156. for img_id in range(2, 5):
  157. paragraph_id = f"段落{img_id}.2.1"
  158. entry = create_mapping_entry(
  159. dimension="paper_clip",
  160. img_id=img_id,
  161. paragraph_id=paragraph_id,
  162. feature_type="实质",
  163. feature_name="回形针装饰",
  164. output_file=f"img_{img_id}_paperclip.png"
  165. )
  166. mappings["paper_clip"].append(entry)
  167. print(f" 图{img_id}: {paragraph_id} → img_{img_id}_paperclip.png")
  168. # 写入 mapping.json 文件
  169. print("\n--- 写入 mapping.json ---")
  170. for dim in DIMENSIONS:
  171. mapping_path = os.path.join(OUTPUT_DIR, dim, "mapping.json")
  172. with open(mapping_path, 'w', encoding='utf-8') as f:
  173. json.dump(mappings[dim], f, ensure_ascii=False, indent=2)
  174. print(f" ✓ {dim}/mapping.json")
  175. print("\n" + "=" * 60)
  176. print("特征提取脚本执行完成")
  177. print("=" * 60)
  178. print(f"\n输出目录:{OUTPUT_DIR}")
  179. print("各维度 mapping.json 已生成,待工具执行后填充实际特征值文件")
  180. if __name__ == "__main__":
  181. main()