# 灵感点可视化工具
将灵感点分析数据(包括匹配结果、搜索结果等)生成交互式HTML可视化页面。
---
## 快速开始
```bash
python visualize_inspiration_points.py
```
生成的HTML文件位置:
```
data/阿里多多酱/out/人设_1110/how/灵感点可视化.html
```
在浏览器中打开该文件即可查看可视化结果。
---
## 功能特性
### 1. 步骤化展示
- **步骤1**:灵感点匹配灵感分类(基于step1数据)
- 显示灵感点与各个灵感要素的匹配关系
- 展示匹配分数、相同部分、增量部分、分数说明
- **步骤2**:搜索结果展示(基于search数据)
- **2.1**:直接搜索灵感分类
- 显示以灵感要素为关键词搜索到的小红书帖子
- 展示每个帖子与原始灵感点的匹配分数(基于step4数据)
### 2. 双层匹配分数展示
#### 步骤1分数(灵感点 → 灵感要素)
- 数据来源:`all_step1_灵感人设匹配_gemini-2.5-pro.json`
- 显示位置:步骤1匹配项的顶部标题栏
- 含义:灵感点与某个灵感要素的语义匹配度
#### 步骤4分数(搜索帖子 → 灵感点)
- 数据来源:`all_step4_搜索结果匹配_gemini-2.5-pro.json`
- 显示位置:搜索结果帖子卡片的右上角徽章
- 含义:搜索到的帖子内容与原始灵感点的匹配度
### 3. 交互功能
- **可折叠面板**
- 步骤1和步骤2可独立折叠
- 匹配项列表可折叠(默认只展开第一个)
- **卡片点击详情**
- 点击灵感点卡片:查看完整的灵感点信息
- 点击分类卡片:查看该灵感要素下的所有帖子
- 点击搜索结果卡片:查看帖子的完整详情
- **分数详情弹窗**
- 点击步骤4的匹配分数徽章
- 显示:分数、相同部分、增量部分、分数说明
- **图片轮播**
- 搜索结果卡片支持多图轮播
- 点击左右箭头切换图片
### 4. 智能排序
- 搜索结果按匹配分数降序排列
- 有匹配分数的帖子优先显示
- 无匹配分数的帖子排在最后
---
## 数据来源
### 输入文件
| 文件路径 | 用途 | 数据内容 |
|---------|------|---------|
| `data/阿里多多酱/out/人设_1110/how/灵感点/[灵感点名称]/all_summary_完整流程_gemini-2.5-pro.json` | 灵感点摘要 | 灵感点的基本信息、描述、维度等 |
| `data/阿里多多酱/out/人设_1110/how/灵感点/[灵感点名称]/all_step1_灵感人设匹配_gemini-2.5-pro.json` | 步骤1匹配 | 灵感点与灵感要素的匹配结果 |
| `data/阿里多多酱/out/人设_1110/how/灵感点/[灵感点名称]/search/all_search_*.json` | 搜索结果 | 以灵感要素为关键词搜索的小红书帖子 |
| `data/阿里多多酱/out/人设_1110/how/灵感点/[灵感点名称]/search/all_step4_搜索结果匹配_gemini-2.5-pro.json` | 步骤4匹配 | 搜索结果帖子与灵感点的匹配分数 |
| `data/阿里多多酱/out/人设_1110/分类索引_完整.json` | 分类索引 | 灵感分类、目的分类、关键点分类的完整索引 |
| `data/阿里多多酱/out/人设_1110/点到帖子映射.json` | 点映射 | 灵感点/目的点/关键点到帖子的映射 |
| `data/阿里多多酱/out/人设_1110/帖子到分类和点映射.json` | 帖子映射 | 帖子ID到分类和点的映射 |
### 输出文件
```
data/阿里多多酱/out/人设_1110/how/灵感点可视化.html
```
单个HTML文件包含所有数据和样式,可直接在浏览器中打开。
---
## 数据结构说明
### Step1 数据结构(灵感点 → 灵感要素)
**文件**: `all_step1_灵感人设匹配_gemini-2.5-pro.json`
```json
{
"灵感": "内容植入品牌推广",
"匹配结果列表": [
{
"输入信息": {
"B": "内容植入品牌推广",
"A": "将品牌/产品信息融入内容",
"A_Context": "所属视角: 灵感触发源\n一级分类: 商业合作的要求"
},
"匹配结果": {
"score": 0.9,
"score说明": "...",
"相同部分": {"内容": "...", "品牌": "..."},
"增量部分": {"推广": "..."}
},
"业务信息": {
"灵感": "内容植入品牌推广",
"匹配要素": "将品牌/产品信息融入内容"
}
}
]
}
```
**关键字段**:
- `输入信息.A`: 灵感要素名称(用于展示和搜索)
- `输入信息.A_Context`: 灵感要素的分类层级
- `匹配结果.score`: 灵感点与灵感要素的匹配分数
### Step4 数据结构(搜索帖子 → 灵感点)
**文件**: `all_step4_搜索结果匹配_gemini-2.5-pro.json`
```json
{
"输入信息": {
"灵感": "内容植入品牌推广",
"搜索关键词": "将品牌/产品信息融入内容",
"搜索结果数": 20
},
"匹配结果列表": [
{
"输入信息": {
"B": "内容植入品牌推广",
"A": "🔥 Gpt 4o 将品牌符号融入场景,附步骤!",
"A_Context": "..."
},
"匹配结果": {
"score": 0.75,
"score说明": "...",
"相同部分": {"内容植入": "...", "品牌推广": "..."},
"增量部分": {"品牌推广": "..."}
},
"业务信息": {
"灵感": "内容植入品牌推广",
"channel_content_id": "6842c7d3000000002001f6c4",
"title": "🔥 Gpt 4o 将品牌符号融入场景,附步骤!",
"likes": 801
}
}
]
}
```
**关键字段**:
- `输入信息.A`: 帖子标题
- `匹配结果.score`: 帖子与灵感点的匹配分数
- `业务信息.channel_content_id`: 帖子ID(用于关联搜索结果)
---
## 重要技术说明
### 变量命名隔离
**问题背景**:步骤1和步骤4使用相同的数据结构(相同部分、增量部分、score等),在同一个循环中处理时容易导致变量覆盖。
**解决方案**:使用不同的变量名前缀
**步骤1变量**(灵感点匹配):
```python
score = match_result.get("score", 0)
score_explain = match_result.get("score说明", "")
same_parts = match_result.get("相同部分", {})
increment_parts = match_result.get("增量部分", {})
```
**步骤4变量**(搜索结果匹配):
```python
note_score = score_info["score"]
note_score_explain = score_info.get("score说明", "")
note_same_parts = score_info.get("相同部分", {})
note_increment_parts = score_info.get("增量部分", {})
```
### None值处理
**问题**:JSON文件中某些字段可能为`null`,Python读取后为`None`,调用`.items()`或`.keys()`会报错。
**解决方案**:使用`or {}`或`or ""`确保默认值
```python
same_parts = match_result.get("相同部分", {}) or {}
score_explain = match_result.get("score说明", "") or ""
```
---
## 版本历史
### v1.1 (2025-11-13)
- **修复**: 变量命名冲突导致step1分数被step4数据覆盖
- 步骤1和步骤4的变量现在完全隔离
- step1显示正确的灵感匹配分数
- step4显示正确的帖子匹配分数
- **修复**: None值处理
- 添加`or {}`和`or ""`确保安全处理None值
- 修复"object of type 'NoneType' has no len()"错误
### v1.0 (2025-11-13)
- 初始版本
- 支持步骤1和步骤2的可视化展示
- 支持搜索结果匹配分数展示
- 支持交互式卡片和弹窗
---
## 使用场景
### 场景1:分析灵感点匹配效果
打开可视化页面,查看:
1. 灵感点与哪些灵感要素匹配度最高
2. 匹配的相同部分和增量部分是什么
3. 为什么得到这个分数(查看分数说明)
### 场景2:评估搜索结果质量
在步骤2中查看:
1. 以灵感要素为关键词搜索到的帖子
2. 哪些帖子与原始灵感点匹配度最高
3. 为什么这些帖子匹配度高(点击分数查看详情)
### 场景3:发现内容机会
通过可视化页面:
1. 了解哪些灵感分类缺少内容(匹配分数低)
2. 查看高分搜索结果,学习内容创作方向
3. 识别内容创作的相同点和差异点
---
## 常见问题
### Q1: 为什么有些搜索结果没有分数?
**A**: 只有在`all_step4_搜索结果匹配_gemini-2.5-pro.json`文件中的帖子才有匹配分数。如果搜索结果较多,step4可能只对部分帖子进行了匹配分析。
### Q2: step1分数和step4分数有什么区别?
**A**:
- **step1分数**:灵感点与灵感要素的语义匹配度(概念级别)
- **step4分数**:实际小红书帖子与灵感点的内容匹配度(内容级别)
### Q3: 为什么有些灵感点没有搜索结果?
**A**: 搜索功能依赖于step1匹配到的灵感要素。如果某个灵感点没有匹配到合适的灵感要素,或者没有执行搜索步骤,就不会有搜索结果。
### Q4: 如何更新可视化?
**A**: 当数据文件更新后,重新运行脚本即可:
```bash
python visualize_inspiration_points.py
```
---
## 相关文档
- [索引构建 README](README_索引构建.md)
- [搜索模块 README](script/search/README.md)
- [详情模块 README](script/detail/README.md)