test(12-01): add failing tests for SemanticSegmenter
- Test merging short segments into paragraphs - Test segmentation on topic change (time gap) - Test max paragraph length constraint - Test empty segments handling Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -149,3 +149,92 @@ class TestParseSrtFile:
|
||||
|
||||
with pytest.raises(FileNotFoundError):
|
||||
parse_srt_file(Path("/nonexistent/file.srt"))
|
||||
|
||||
|
||||
# =============================================================================
|
||||
# Test 2: Semantic Segmenter
|
||||
# =============================================================================
|
||||
|
||||
@pytest.fixture
|
||||
def short_segments():
|
||||
"""连续短句字幕分段"""
|
||||
from kb_workflow.srt.parser import Segment
|
||||
return [
|
||||
Segment(id=1, start_time=0.0, end_time=2.0, text="这是第一句短句"),
|
||||
Segment(id=2, start_time=2.0, end_time=4.0, text="这是第二句短句"),
|
||||
Segment(id=3, start_time=4.0, end_time=6.0, text="这是第三句短句"),
|
||||
]
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def segments_with_gap():
|
||||
"""带有长停顿的字幕分段"""
|
||||
from kb_workflow.srt.parser import Segment
|
||||
return [
|
||||
Segment(id=1, start_time=0.0, end_time=5.0, text="第一段内容在这里"),
|
||||
Segment(id=2, start_time=5.0, end_time=10.0, text="继续第一段"),
|
||||
# 5秒停顿
|
||||
Segment(id=3, start_time=15.0, end_time=20.0, text="第二段从这里开始"),
|
||||
Segment(id=4, start_time=20.0, end_time=25.0, text="继续第二段"),
|
||||
]
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def long_text_segment():
|
||||
"""长文本分段(超过500字符)"""
|
||||
from kb_workflow.srt.parser import Segment
|
||||
long_text = "这是一段很长的文本," * 50 # 约600字符
|
||||
return [
|
||||
Segment(id=1, start_time=0.0, end_time=60.0, text=long_text),
|
||||
]
|
||||
|
||||
|
||||
class TestSemanticSegmenter:
|
||||
"""测试语义分段器"""
|
||||
|
||||
def test_merge_short_segments(self, short_segments):
|
||||
"""Test 1: 连续短句被合并为段落"""
|
||||
from kb_workflow.srt.segmenter import SemanticSegmenter
|
||||
|
||||
segmenter = SemanticSegmenter()
|
||||
paragraphs = segmenter.segment(short_segments)
|
||||
|
||||
# 所有短句应该被合并
|
||||
assert len(paragraphs) >= 1
|
||||
# 验证所有内容都被保留
|
||||
merged_text = ' '.join(paragraphs)
|
||||
assert "第一句短句" in merged_text
|
||||
assert "第二句短句" in merged_text
|
||||
assert "第三句短句" in merged_text
|
||||
|
||||
def test_segment_on_topic_change(self, segments_with_gap):
|
||||
"""Test 2: 主题变化时自动分段(基于时间间隔)"""
|
||||
from kb_workflow.srt.segmenter import SemanticSegmenter
|
||||
|
||||
segmenter = SemanticSegmenter(gap_threshold=3.0)
|
||||
paragraphs = segmenter.segment(segments_with_gap)
|
||||
|
||||
# 应该分成两段(因为中间有5秒停顿)
|
||||
assert len(paragraphs) == 2
|
||||
assert "第一段" in paragraphs[0]
|
||||
assert "第二段" in paragraphs[1]
|
||||
|
||||
def test_max_paragraph_length(self, long_text_segment):
|
||||
"""Test 3: 单个段落不超过 500 字符"""
|
||||
from kb_workflow.srt.segmenter import SemanticSegmenter
|
||||
|
||||
segmenter = SemanticSegmenter(max_paragraph_chars=500)
|
||||
paragraphs = segmenter.segment(long_text_segment)
|
||||
|
||||
# 每个段落不应该超过限制
|
||||
for para in paragraphs:
|
||||
assert len(para) <= 520 # 允许小范围超出(最后一块)
|
||||
|
||||
def test_empty_segments(self):
|
||||
"""空分段列表返回空列表"""
|
||||
from kb_workflow.srt.segmenter import SemanticSegmenter
|
||||
|
||||
segmenter = SemanticSegmenter()
|
||||
paragraphs = segmenter.segment([])
|
||||
|
||||
assert paragraphs == []
|
||||
|
||||
Reference in New Issue
Block a user