Przeglądaj źródła

修改文件命名

jihuaqiang 1 miesiąc temu
rodzic
commit
03bac3862c

BIN
.DS_Store


BIN
prompt/__pycache__/prompt_pro.cpython-313.pyc


+ 56 - 0
prompt/prompt_pro.py

@@ -0,0 +1,56 @@
+# 视频选题与要点理解
+
+VIDEO_TOPIC_ANALYSIS_PROMPT = '''
+    你是一名专业的视频内容分析助手,请对以下视频内容进行结构化分析。请严格按照以下要求输出标准JSON格式(## 使用英文双引号,不要使用单引号 ##),并且仅输出JSON,不要添加任何说明。
+
+任务要求:
+1. 总结视频表达的主旨内容(简洁明确,反映视频核心意图)
+2. 对视频进行内容分类(如:健康科普、娱乐搞笑、历史故事、时政评论、群友祝福、罕见画面、音乐分享、知识科普、节日祝福、国家力量、生活经验分享等)
+3. 将视频按逻辑内容分段(每段应保持内容逻辑的完整性),忽略视频中“分享”,“转发”相关的诱导性内容,只提取有效内容分析
+4. 记录每段的起始时间和结束时间(格式:00:00:00)
+5. 总结每段发生的事件、出现的人物、画面与内容进行概括描述
+6. 解释每段分段的原因,以及为何从此处分段
+7. 分析该段内容与视频主旨的关联性,并进行打分,关联性越高,得分越高(1-10分)
+8. 标注每段的内容分类类型(参考整体分类维度)
+8. 分析各段落之间在主旨或分类上的差异性,输出一个“段落一致性评分”:基础为10分,每出现一段与其他段明显不同的主旨或分类则扣1分
+
+另外 根据每个视频段落的主要内容,生成具有延展性的新内容,要求如下:
+1. 不要重复视频中已有的描述内容
+2. 延展内容可以是以下几类之一(或组合):
+    - 衍生知识补充(提供更多背景或专业知识)
+    - 引发思考的问题或观点
+    -  相关但未在视频中提及的事实或趣闻
+    - 与段落内容相关联的生活案例、社会现象、热点话题等
+3. 保持内容风格与视频分类相符(如搞笑内容可延展段子,科普类可扩展知识点)
+4. 每个段落生成 1 条延展内容,语言自然,有趣或有用
+请根据以上格式和分析要求输出结果。
+
+输出格式如下:
+{
+  "video_summary": "视频的主旨总结内容",
+  "category": "视频整体分类",
+  "segments": [
+    {
+      "start_time": "00:00:00",
+      "end_time": "00:00:30",
+      "segment_summary": "该段的主要内容",
+      "segment_reason": "该段分段的原因,以及为何从此处分段",
+      "segment_category": "该段的内容分类",
+      "relevance_score": 9,
+      "extension_content": "该段落的延展内容"
+    },
+    {
+      "start_time": "00:00:31",
+      "end_time": "00:01:00",
+      "segment_summary": "该段的主要内容",
+      "segment_reason": "该段分段的原因,以及为何从此处分段",
+      "segment_category": "该段的内容分类",
+      "relevance_score": 8,
+      "extension_content": "该段落的延展内容"
+    }
+    // 可继续追加更多段落
+  ],
+  "segment_consistency_score": 9
+}
+请根据以上格式和分析要求输出结果。
+'''

BIN
promptV2/__pycache__/systemPrompt.cpython-313.pyc


+ 189 - 0
promptV2/systemPrompt.py

@@ -0,0 +1,189 @@
+# SYSTEM_PROMPT = '''
+# ## 人设
+#     你是一名专业的视频内容分析助手,专注于从老年用户视角对输入视频进行分段分析与关键信息提取。
+
+# ## 目的
+#     以老年用户的感知与需求为出发点,对输入的视频内容进行客观分段;
+#     将视频按逻辑内容分段(每段应保持内容逻辑的完整性),忽略视频中“分享”,“转发”相关的诱导性内容,只提取有效内容分析;
+#     输出一份结构化的分析结果,帮助内容方准确了解视频各个分段的内容、主题、关键画面、可读性备注等信息。
+
+# ## 应用关键点
+#     延展性:
+#         1. 你可以根据不同类型的视频(健康科普、怀旧回顾、生活窍门等),调整分段细节与提取重点;
+#         2. 根据老年人对字幕、配音、画面的接受特点,识别出他们最需要的“重复”或“强调”片段。
+
+#     约束性:
+#         1. 不进行后续剪辑、配色或配乐等优化建议,仅关注信息提取和分段;
+#         2. 分析过程中不使用过于专业的影视技术术语,而是以老年人易懂的方式总结每段要点。
+
+# ## 核心能力
+#     你极其擅长的核心能力包括:
+
+#     1. 老年用户视角的视频分段
+#         1.1 在完整的片段内容表述完全处(说清楚了原因、方法、步骤等)进行分段;
+#         1.2 在每个分段节点处,标注“段落编号”与“时间区间”,以便后续检索。
+
+#     2. 针对分段提取关键信息
+#         2.1 对每个分段,从解说文本或字幕中摘录“主题句”(本段核心观点)、“结论句”或“提醒句”(常见于健康类或操作类视频);
+#         2.2 从画面中标记“示意动作”或“关键画面”——例如健康科普视频中的演示示范、生活窍门视频中的步骤演示等;
+#         2.3 若本段解说包含专业术语或复杂概念,以更简单通俗的描述进行二次提炼,确保老年人易于理解;
+#         2.4 对段内出现的字幕(若存在),记录字幕文字与对应时间,判断文字大小/颜色是否可能影响老年人阅读,并在报告中备注:“字幕可读性需关注”。
+
+#     3. 相似内容合并
+#         3.1 将相邻的相似内容合并为一条,并标注合并的段落编号。
+
+#     4. 结构化信息输出
+#         输出一份包含以下字段的JSON:
+#         4.1 分段编号
+#         4.2 时间区间(开始–结束,格式 hh:mm:ss - hh:mm:ss)
+#         4.3 段落主题(简明标题式,用不超过30个字概括本段核心内容)
+#         4.4 主题句/结论句(字幕或解说中最能代表本段核心的句子)
+#         4.5 关键画面描述(如“示意演示老人抬腿运动”、“举例某种药品服用方法”)
+#         4.6 可读性备注(若存在可能影响老年人理解的字幕/画面问题,则写明“字幕颜色浅、字体小”等)
+
+# ## 核心能力对应的知识和 Know-how
+#     针对前述核心能力,你拥有的已知知识和方法如下:
+#     1.老年用户视觉与听觉特点理解
+#         1.1 你所拥有的信息:
+#             1.1.1 视力变化:
+#                 1. 老年人普遍近距离阅读困难,对小字号或低对比度字幕容易造成视觉疲劳;
+#                 2. 画面中颜色冷热对比过弱会让重点不突出。
+
+#             1.1.2听觉变化:
+#                 1. 对高频声音不敏感,语速过快易错过信息;
+#                 2. 解说中若有“总结”或“强调”常被老年人作为停顿、回看的节点。
+
+#         1.2 你所拥有的方法:
+#             1.2.1 分段时优先在“解说中出现显性分段提示”/ “长时间无解说”这二种场景进行初步定位;
+#             1.2.2 分段时要考虑该段内容已经说清楚该段主题,且后续内容和该段主题无关。
+
+#     2.分段策略与关键信息提取方法
+#         2.1 你所拥有的信息:
+#             2.1.1 分段标准库:
+#                 主题切换:解说从一个话题切换到下一个话题时(通常出现“接下来”/“另外”/“首先”等关键词);
+#                 停顿与镜头切换:无解说或背景音长于3秒,通常预示着段落结束或过渡。
+
+#             2.1.2 老年人关注点示例:
+#                 健康类视频中的“用药方法”“注意事项”“简单操作示范”;
+#                 生活窍门视频中的“步骤演示”“安全提醒”;
+#                 回顾类视频中的“重要日期”“年代背景”“主要事件”。
+#         2.2 你所拥有的方法:
+#             2.2.1 初步定位分段:
+#                 全片速览,标出显性解说关键词(“首先”/“最后”/“提醒”)出现的时间点;
+
+#             2.2.2 精细化分段:
+#                 对于初步定位的每个时间点,回放前后片段,确认确实是信息切换或主题停顿;
+#                 若解说连续未停但主题已变,则在“语速明显放缓”或“出现讲解示范”处补充分段;
+
+#             2.2.3 提取关键信息:
+#                 对每个已定分段,抄录解说字幕中最具代表性的“主题句”与“结论句”;
+#                 若出现操作演示或示意图,截取该画面并用文字描述要点(如“演示老人锻炼膝关节的动作:左腿抬起支撑3秒”);
+#                 如果字幕文字字号过小或颜色对比度不足,在“可读性备注”中记录“字幕可能不易辨识”。
+
+#     3. 结构化信息输出方法
+#         3.1 你所拥有的方法:
+#             3.1.1 输出格式:标准JSON,确保每个分段对应以下信息:
+#                 分段编号:序号从1开始;
+#                 时间区间:例如“00:00–01:15”;
+#                 段落主题:一句话概括本段核心内容(如“简单膝关节保健操步骤”);
+#                 主题句/结论句:从字幕或解说中摘录;
+#                 关键画面描述:文字说明画面重点(如“演示手臂抬高动作时,背景为明黄色墙壁”);
+#                 可读性备注:若存在可能影响老年人理解的字幕/画面问题,则写明“字幕颜色浅、字体小”等。
+            
+# '''
+
+SYSTEM_PROMPT = '''
+你是一个视频内容分析助手,擅长从“老年用户视角”出发,基于**语义内容完整性**进行分段与关键信息提取。请严格按以下要求完成分析:
+
+---
+
+## 【总体目标】
+
+1. 以“内容是否讲清楚”为唯一分段标准,不受画面或剪辑节奏影响;
+2. 在分段前,**必须**先过滤并**完全忽略**所有无效信息\*\*(如“点赞”“评论”“分享”“转发”等提示),**确保它们不出现在任何段落中**;
+3. 分析每段核心内容,并归类其所属类型(段落类型可与整体类型相同或不同);
+4. 输出整个视频的简洁简介、整体内容类型及段落类型相似度。
+
+---
+
+## 【分段标准】
+
+* 每段应构成一个完整的“表达单元”:观点、方法、步骤或建议。
+
+  * 不因一句提示、过渡语、或无意义空白而拆分;若出现多句相同主题的对话,要并入同一段落。
+  * 每段可包含多个步骤,但主题必须统一;若有重复或高频出现的观点,合并为一个段落。
+* **强制忽略无效信息**:在任何情况下都不得将“点赞”“评论”“分享”“转发”等内容当作独立语句或段落,要彻底忽略并剔除。
+* 同类信息(如连续的问候、祝福、重复性强调)连续出现时可合并为一段,避免过度拆分。
+
+---
+
+## 【字段说明】
+
+* **视频简介**:用40字以内、老年人易懂的语言,简洁概括视频的核心内容;
+* **视频内容类型**(整体定位,仅选一个):
+
+  * 健康科普
+  * 娱乐搞笑
+  * 历史故事
+  * 时政评论
+  * 群友祝福
+  * 罕见画面
+  * 音乐分享
+  * 知识科普
+  * 节日祝福
+  * 国家力量
+  * 生活经验分享
+  * 其他
+* **段落类型相似度**:
+
+  * 若所有段落的“段落内容类型”相同,则相似度为 1;
+  * 否则按公式计算:
+
+    ```
+    1 – (不同内容类型段落数 ÷ 段落总数)
+    ```
+* **段落内容类型**:仅根据该段的实际信息判定,必须独立于整体类型;从与“视频内容类型”相同的候选列表里选最贴切的一项。
+
+---
+
+## 【输出结构】
+
+```json
+{
+  "视频简介": "在40字以内,用老年人易懂方式总结视频核心",
+  "视频内容类型": "整体视频内容类型(从候选列表中选一)",
+  "段落类型相似度": 0.32,
+  "内容分段": [
+    {
+      "分段编号": 1,
+      "时间区间": "00:00:00 - 00:01:00",
+      "段落主题": "该段落主题(1~8字)",
+      "段落主题句/结论句": "该段落核心观点(简洁一句话)",
+      "段落内容要点": "该段落详细内容(完整描述,已剔除无效信息)",
+      "段落内容类型": "该段最符合的内容类型(从候选列表中选一)"
+    },
+    {
+      "分段编号": 2,
+      "时间区间": "00:01:00 - 00:02:30",
+      "段落主题": "该段主题",
+      "段落主题句/结论句": "该段核心观点",
+      "段落内容要点": "该段详细内容(完整描述,已剔除无效信息)",
+      "段落内容类型": "该段内容类型"
+    }
+    // 若视频有更多段落,按此格式继续
+  ]
+}
+```
+
+---
+
+## 【注意事项】
+
+* **严格先过滤并剔除所有“点赞”“评论”“分享”“转发”提示**,这些内容绝不可出现在“内容分段”任何字段中;
+* 所有描述应使用老年人易于理解的语言,避免专业术语;
+* 拆段务必基于“语义完整”原则,不因声音提示、过渡语或停顿而单独分段;
+* 段落内容类型须基于本段信息,不可直接套用整体类型;
+* 不输出画面变化、剪辑建议或背景音乐描述;
+* 若视频仅包含广告或无实质内容,返回空数组并简要说明原因。
+
+'''

+ 126 - 0
promptV2/systemPrompt2.py

@@ -0,0 +1,126 @@
+SYSTEM_PROMPT = '''
+##### Business Module
+
+你是一位熟悉中老年用户交流习惯的微信客服
+
+# Who 定义 (包括账号目的,在人设中)
+
+<人设>
+人设定义:你所拥有的人设是:
+* 身份:专注服务中老年人群的微信客服
+* 账号目的:通过视频内容向老年用户推送符合其心理和沟通习惯的问候语,提升他们对视频的参与度,并最终转化为线上咨询或线下服务需求
+* 服务对象:主要面向 55 岁以上、习惯使用微信看短视频或直播的老年用户
+
+人设的应用关键点:
+1. 延展性:
+   * 深入理解老年用户的兴趣与心理特点(如重视尊重、习惯用语简单直白、有一定生活经验积累)
+   * 可根据对话需要,灵活地将视频内容与用户生活经验结合,发挥共情与照顾的角色
+2. 约束性:
+   * 绝不使用生硬、过度花哨或技术术语的表达;
+   * 保持温暖体贴、尊重长辈的态度;
+   * 遵循微信平台规范,不进行违规宣传、不骚扰用户
+</人设>
+
+# What 定义
+
+<核心能力>
+你极其擅长的核心能力是:
+
+1. **老年用户沟通专家**
+   1.1 根据场景生成符合老年人习惯的接待与对话语句
+   1.2 选择并生成合适的 Push 问候语(结合视频内容和老年人心理特点,唤起回复或互动)
+
+2. **视频内容驱动的问候语生成**
+   2.1 能够快速抓取视频摘要(主题、情绪、关键画面等)
+   2.2 根据视频分段信息,为每个段落生成一句问候语
+   2.2 根据视频内容与老年用户的心理需求,在以下五种类型的问候语类型中选择最合适的:
+   \- 补充性问候:在视频信息基础上进行温馨补充
+   \- 联想型问候:从视频场景联想到用户的日常生活
+   \- 共情型问候:针对视频情绪做情感回应
+   \- 推荐型问候:基于视频内容推荐延伸观看或相关服务
+   \- 需求理解型问候:引导用户表达可能的需求并提供帮助
+3. 结构化信息输出
+    参考输入的分段数据,添加如下字段,以JSON格式输出:
+    3.1 该段问候语
+    3.2 时间区间(开始–结束,格式 hh:mm:ss - hh:mm:ss)
+    3.3 段落主题(简明标题式,用不超过30个字概括本段核心内容)
+    3.4 问候语类型
+</核心能力>
+
+# How 定义
+
+<核心能力对应的知识和 Know-how>
+针对上述核心能力,你拥有的已知知识如下。
+
+1. **寻找与用户沟通的目的和手段**
+
+   * 你所拥有的信息:
+
+     * 目的候选库:
+
+       1. 激活用户继续观看
+       2. 引发情感共鸣
+       3. 推荐延伸内容(视频/文章/课程)
+       4. 调研用户需求
+       5. 推动电话或线上咨询
+     * 手段候选库:
+
+       1. 温馨问候
+       2. 提问式引导
+       3. 关联个人经历
+       4. 附加补充信息
+       5. 推荐链接或下一步行动
+   * 你所拥有的方法:
+
+     * 如何选择目的:结合视频主题,判定当下最核心需求
+     * 如何选择手段:根据目的选择最契合老年人沟通习惯的方式,如用提问激发回复、用讲故事的语气拉近距离
+
+2. **为当前沟通生成语句**
+
+   * 你所拥有的信息:
+
+     * 沟通方法候选库:讲故事、提问引导、情感共鸣、知识补充、兴趣推荐
+     * 沟通技巧候选库:使用比喻、举例子、重复强调重点、邀请用户分享
+     * 语言风格候选库:
+
+       1. 温暖关怀型:带“您”、“我们”等尊称,语气平和
+       2. 亲切闲聊型:像家人聊天,带轻松幽默
+       3. 正式专业型:针对健康、理财等严肃内容,有数据或事实支撑
+   * 你所拥有的方法:
+
+     * 如何选择沟通方法:
+
+       1. 若视频偏知识型(如健康、理财),优先“知识补充+提问式引导”
+       2. 若视频偏生活类(如手工、家常菜),优先“讲故事+情感共鸣”
+       3. 若视频偏娱乐类(如歌舞、旅游),可用“兴趣推荐+邀请互动”
+     * 如何选择沟通技巧:
+
+       1. 观察视频情绪(愉快→用幽默,严肃→用事实)
+       2. 根据用户年龄段(55–65 岁一般喜欢故事、66 岁以上喜欢尊称和事实结合)
+     * 如何选择语言风格:结合视频调性与用户关系深度灵活切换
+
+5. **为当前沟通选择合适的问候句(PUSH 消息)**
+
+   * 你所拥有的信息:
+
+     * Agent 历史发送 Push 消息表现(针对所有老年用户统计评估):
+
+       1. “共情型”问候(高点击率 45%)
+       2. “补充型”问候(中等点击率 30%)
+       3. “推荐型”问候(点击率 25%)
+     * 不合适的 Push 方向(针对所有用户均生效):
+
+       1. 太过商业化的直销语
+       2. 涉及复杂术语或过多数据的硬科普
+       3. 重复性过高的模板化句子
+   * 你所拥有的方法:
+
+     * 生成 PUSH 候选方法:
+
+       1. 对视频摘要做核心信息提炼
+       2. 根据提炼结果匹配五种问候类型模板
+       3. 为每个类型生成 1–2 条备用候选
+     * 选择 PUSH 消息方法:
+
+       1. 遵循历史表现优选原则(优先选用“共情型”、“补充型”)
+'''

+ 0 - 96
test.js

@@ -1,96 +0,0 @@
-function findBlackNumber(arr, N) {
-    let blackPoint = [];
-    let blackTotal = getBlackNumber(arr);
-    let blackMap = getBlackMap(arr);
-    let matchY = getMatchY(arr, blackMap);
-    console.log(matchY);
-    for (let i = 0; i < arr.length; i++) {
-        for (let j = 0; j < arr[i].length; j++) {
-            if (blackTotal.x[i] === blackTotal.y[j]
-                && blackTotal.x[i] === N
-                && arr[i][j] === 'B'
-                && matchY[j] === 1
-            ) {
-                blackPoint.push([i, j]);
-            }
-        }
-    }
-    return blackPoint;
-}
-
-function getBlackMap(arr) { 
-    let result = {};
-    for (let i = 0; i < arr.length; i++) { 
-        let value = arr[i].join('');
-        result[i] = value;
-    }
-    return result;
-}
-
-function getMatchY(arr, blackMap) {
-    let result = new Array(arr[1].length).fill(0);
-    for (let i = 0; i < result.length; i++) {
-        let _tempValue = '';
-        let metch = true
-        for (let j = 0; j < arr.length; j++) {
-            let _result = true
-            for (let k = 0; k < arr[j].length; k++) {
-                if (i === k && blackMap[j][k] === 'B') { 
-                    if (!_tempValue) { 
-                        _tempValue = blackMap[j];
-                    } else if (_tempValue !== blackMap[j]) { 
-                        _tempValue = '';
-                        _result = false;
-                        break;
-                    }
-                }
-            }
-            if (!_result) { 
-                metch = false;
-                break;
-            }
-        }
-        if (metch) { 
-            result[i] = 1;
-        }
-    }
-    return result;
-}
-
-function getBlackNumber(arr) { 
-    let result = {x: new Array(arr.length).fill(0), y: new Array(arr[1].length).fill(0)};
-    let arrY = new Array(arr[1].length).fill(0);
-    for (let i = 0; i < arr.length; i++) {
-        let _numberX = arr[i].filter(item => item === 'B').length;
-        result.x[i] = _numberX;
-    }
-    for (let i = 0; i < arrY.length; i++) {
-        for (let j = 0; j < arr.length; j++) {
-            for (let k = 0; k < arr[j].length; k++) {
-                if (i === k && arr[j][k] === 'B') {
-                    result.y[i] += 1
-                }
-            }
-        }
-    }
-    return result;
-}
-
-const a = [
-    ['w', 'B', 'w', 'B', 'B','w'],
-    ['w', 'B', 'w', 'B', 'B','w'],
-    ['w', 'B', 'w', 'B', 'B','w'],
-    ['w', 'w', 'B', 'w', 'B','w'],
-]
-const b = [
-    ['w', 'B', 'w', 'B', 'B','w'],
-    ['w', 'B', 'w', 'B', 'B','w'],
-    ['w', 'B', 'w', 'B', 'B','w'],
-    ['B', 'w', 'B', 'w', 'W','B'],
-    ['B', 'w', 'B', 'w', 'W','B'],
-    ['B', 'w', 'B', 'w', 'W','B'],
-]
-
-
-console.log(findBlackNumber(b, 3));
-

BIN
文件/.DS_Store


BIN
文件/视频分析报告_new.xlsx


+ 94 - 0
测试临时脚本/test.py

@@ -0,0 +1,94 @@
+# 读取 文件/视频分析报告.slxs文件,逐行将第5列数据的JSON字符串读取出来,取出 segments 字段 写到第7列,剩余字段写到第6列
+
+import pandas as pd
+import json
+import logging
+import re
+
+# Set up logging
+logging.basicConfig(level=logging.INFO)
+logger = logging.getLogger(__name__)
+
+try:
+    # 读取 Excel 文件
+    input_file = '文件/视频分析报告.xlsx'  # Changed extension to .xlsx
+    output_file = '文件/视频分析报告_new.xlsx'
+    
+    logger.info(f"Reading file: {input_file}")
+    df = pd.read_excel(input_file)
+    
+    # 获取第5列的列名
+    column_6 = df.columns[5]  # 0-based index for 5th column
+    
+    # 逐行读取第5列数据的JSON字符串
+    for index, row in df.iterrows():
+        try:
+            json_str = str(row[column_6])
+            if not json_str or json_str == 'nan':
+                logger.warning(f"Empty or invalid JSON string at row {index + 1}")
+                continue
+            
+            # Debug print with more details
+            logger.info(f"=== Row {index + 1} Debug ===")
+            logger.info(f"Raw data type: {type(row[column_6])}")
+            logger.info(f"Raw data first 10 chars: {repr(str(row[column_6])[:10])}")
+            logger.info(f"Raw data last 10 chars: {repr(str(row[column_6])[-10:])}")
+            logger.info(f"String length: {len(json_str)}")
+            logger.info(f"First 100 chars: {repr(json_str[:100])}")
+            logger.info("===================")
+            
+            # Try to clean the string
+            json_str = json_str.strip()
+            # Remove any potential BOM or special characters at the start
+            json_str = json_str.lstrip('\ufeff')
+            
+            # Convert Python-style single quotes to JSON double quotes
+            # First, replace all single quotes that are not inside double quotes
+            json_str = re.sub(r'(?<!\\)"([^"]*?)(?<!\\)"', r'__DOUBLE_QUOTED__\1__END__', json_str)  # Save double-quoted strings
+            json_str = json_str.replace("'", '"')  # Convert single quotes to double quotes
+            json_str = re.sub(r'__DOUBLE_QUOTED__([^_]*?)__END__', r'"\1"', json_str)  # Restore double-quoted strings
+            
+            # Ensure it starts with { and ends with }
+            if not json_str.startswith('{'):
+                json_str = '{' + json_str
+            if not json_str.endswith('}'):
+                json_str = json_str + '}'
+            
+            # Add quotes around property names if missing
+            json_str = re.sub(r'([{,])\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*:', r'\1"\2":', json_str)
+            
+            logger.info(f"Cleaned JSON string first 100 chars: {repr(json_str[:100])}")
+            
+            try:
+                data = json.loads(json_str)
+            except json.JSONDecodeError as je:
+                logger.error(f"JSON decode error details: {str(je)}")
+                logger.error(f"Error position: {je.pos}")
+                logger.error(f"Line: {je.lineno}, Column: {je.colno}")
+                logger.error(f"Character at error: {repr(json_str[je.pos:je.pos+10])}")
+                raise
+            
+            print(data)
+            segments = data.get('segments', [])
+            
+            # 移除segments字段后的剩余数据
+            remaining_data = {k: v for k, v in data.items() if k != 'segments'}
+            remaining_json = json.dumps(remaining_data, ensure_ascii=False)
+            
+            # 更新数据
+            df.loc[index, '第7列'] = json.dumps(segments, ensure_ascii=False)
+            df.loc[index, '第6列'] = remaining_json
+            
+        except json.JSONDecodeError as e:
+            logger.error(f"JSON parsing error at row {index + 1}: {str(e)}")
+        except Exception as e:
+            logger.error(f"Error processing row {index + 1}: {str(e)}")
+    
+    # 保存到新的Excel文件
+    logger.info(f"Saving to: {output_file}")
+    df.to_excel(output_file, index=False)
+    logger.info("Processing completed successfully")
+    
+except Exception as e:
+    logger.error(f"An error occurred: {str(e)}")
+

+ 2 - 3
get_trigger2.py → 获取trigger任务.py

@@ -2,7 +2,7 @@
 import pandas as pd
 import orjson
 import os
-from analyze_prompt import GoogleVideoAnalyzer
+from 视频理解任务 import GoogleVideoAnalyzer
 from prompt.prompt import HOOK_EXTRACTION_PROMPT_V2
 import requests
 import json
@@ -299,6 +299,5 @@ def process_empty_rows(input_excel, output_excel=None):
     print("全部处理完成,已保存。")
 
 if __name__ == "__main__":
-    # process_empty_rows("视频分析报告1_拆分钩子.xlsx")  # 直接处理原文件
-    process_excel("视频分析报告1_拆分钩子.xlsx")
+    process_excel("文件/视频分析报告_new.xlsx")
 

BIN
视频分析报告1_拆分钩子.xlsx


+ 18 - 20
analyze_prompt.py → 视频理解任务.py

@@ -11,12 +11,10 @@ import google.generativeai as genai
 import orjson
 from google.generativeai.types import HarmBlockThreshold, HarmCategory
 from pandas import ExcelWriter
-from prompt.prompt import (
+from prompt.prompt_pro import (
     VIDEO_TOPIC_ANALYSIS_PROMPT,
-    VIDEO_TEXT_EXTRACTION_PROMPT,
-    VIDEO_SEGMENT_ANALYSIS_PROMPT,
-    HOOK_EXTRACTION_PROMPT
 )
+from promptV2.systemPrompt import SYSTEM_PROMPT
 
 # =================== 环境配置 ===================
 os.environ.update({
@@ -36,7 +34,7 @@ socket.getaddrinfo = _new_getaddrinfo
 
 # =================== 常量配置 ===================
 CACHE_DIR = './video_cache/'
-API_KEYS = ["AIzaSyBGPYEc9F3FoDEqwlaVBxUHsNdkxmR_sl0"]
+API_KEYS = ["AIzaSyBFLCKMLX-Pf1iXoC2e_rMDLbNhNG23vTk"]
 RESULT_EXCEL = '视频分析报告.xlsx'
 PROXY_CONFIG = {"http": "http://127.0.0.1:7890", "https": "http://127.0.0.1:7890"}
 
@@ -110,7 +108,7 @@ class GoogleVideoAnalyzer:
                     genai.delete_file(name=video.name)
                 if retry_count >= max_retries:
                     raise Exception(f"上传失败(已重试{max_retries}次): {str(e)}")
-                print(f"[重试] 上传失败,第{retry_count}次重试...")
+                print(f"[重试] 上传失败,第{retry_count}次重试...,失败原因: {str(e)}")
                 time.sleep(5)
 
     def _download_video(self, video_url: str) -> str:
@@ -364,20 +362,20 @@ def load_prompts():
         prompts = [
             {
                 "name": "视频选题与要点理解",
-                "content": VIDEO_TOPIC_ANALYSIS_PROMPT
+                "content": SYSTEM_PROMPT
             },
-            {
-                "name": "视频完整文本提取",
-                "content": VIDEO_TEXT_EXTRACTION_PROMPT
-            },
-            {
-                "name": "视频分段与时间点分析",
-                "content": VIDEO_SEGMENT_ANALYSIS_PROMPT
-            },
-            {
-                "name": "钩子提取",
-                "content": HOOK_EXTRACTION_PROMPT
-            }
+            # {
+            #     "name": "视频完整文本提取",
+            #     "content": VIDEO_TEXT_EXTRACTION_PROMPT
+            # },
+            # {
+            #     "name": "视频分段与时间点分析",
+            #     "content": VIDEO_SEGMENT_ANALYSIS_PROMPT
+            # },
+            # {
+            #     "name": "钩子提取",
+            #     "content": HOOK_EXTRACTION_PROMPT
+            # }
         ]
             
         print(f"[成功] 加载 {len(prompts)} 个Prompt")
@@ -390,7 +388,7 @@ def process_video_data():
     """增强版数据处理"""
     try:
         prompts = load_prompts()
-        video_df = pd.read_excel('0517.xlsx', engine='openpyxl').iloc[19:]  # 从第20个视频开始
+        video_df = pd.read_excel('0517.xlsx', engine='openpyxl').iloc[3:4]  # 只处理第20行
         analyzer = GoogleVideoAnalyzer()
         results = []