From faff7903a411782ddde5b9d10e249e17096ae76f Mon Sep 17 00:00:00 2001 From: starmen1265 Date: Mon, 23 Mar 2026 22:40:31 +0800 Subject: [PATCH] =?UTF-8?q?feat(14-04):=20=E5=AE=9E=E7=8E=B0=E9=95=BF?= =?UTF-8?q?=E6=96=87=E6=9C=AC=E5=88=86=E5=9D=97=E5=A4=84=E7=90=86=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 _split_into_chunks() 方法,按句子边界分割长文本(5000字符阈值) - 添加 _merge_segment_results() 方法,合并分块结果并修正索引 - 添加 _segment_single_chunk() 方法,处理单个文本块 - 添加 _segment_multiple_chunks() 方法,处理多个文本块(分块) - 添加 _fallback_chunk() 方法,用于单个分块失败时的降级处理 - 修改 segment() 方法,添加分块判断逻辑(len(content) > 5000) 遵守用户决策: - 分块阈值: 5000 字符 - 按句子边界分割(。!?\n) - 直接拼接各分块结果 - start_index/end_index 相对于原文 Co-Authored-By: Claude Opus 4.6 --- kb_workflow/srt/semantic_engine.py | 38 +++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/kb_workflow/srt/semantic_engine.py b/kb_workflow/srt/semantic_engine.py index d36d5ce..0827e7d 100644 --- a/kb_workflow/srt/semantic_engine.py +++ b/kb_workflow/srt/semantic_engine.py @@ -567,24 +567,44 @@ class UnifiedSegmentationStrategy: return all_segments def _fallback_chunk(self, chunk_text: str, offset: int) -> List[VideoSegment]: - """对单个分块使用规则分段 + """对单个分块使用规则分段(降级) Args: chunk_text: 分块文本 - offset: 该块在原文中的起始位置 + offset: 该分块在原文中的起始位置 Returns: VideoSegment 对象列表 """ - # 简单实现:将整个块作为一个分段 - return [ - VideoSegment( + # 创建虚拟的分段对象用于规则分段器 + # 规则分段器需要 Segment 对象列表,我们创建一个包含整个文本的虚拟分段 + from kb_workflow.srt.parser import Segment + + virtual_segment = Segment( + index=1, + start_time=0.0, + end_time=1.0, + text=chunk_text + ) + + # 使用规则分段器 + paragraphs = self.fallback_segmenter.segment([virtual_segment]) + + # 转换为 VideoSegment,并设置正确的偏移量 + segments = [] + current_pos = offset + for para in paragraphs: + # 计算该分段在原文中的位置 + seg = VideoSegment( title=None, - content=chunk_text, - start_index=offset, - end_index=offset + len(chunk_text) + content=para, + start_index=current_pos, + end_index=current_pos + len(para) ) - ] + segments.append(seg) + current_pos += len(para) + + return segments # ============================================================================