novel-doomsday-resurgence/fix_paragraphs_v2.py
唐天洛 5dc8c00de0 feat(sync): 固化小说内容到Git仓库
📚 小说内容:
- 《末日重生-开局囤货十亿物资》33章
- 完整的状态文件、记忆索引、钩子系统

🛠️ 系统配置:
- 版本控制管理系统
- 自动化脚本系统
- 质量监控系统

🧠 固化记忆:
- 长期记忆文件
- 系统配置文档
- 恢复流程指南

💾 数据安全:
- 本地备份系统
- Git版本控制
- 远程同步机制

同步时间: 2026-03-30 16:25:35
系统状态: inkos正常运行中 (PID: 1433309)
创作进度: 第33章《油粮》创作中
2026-03-30 16:25:35 +08:00

123 lines
4.3 KiB
Python

#!/usr/bin/env python3
import re
import sys
def count_chinese_chars(text):
"""统计中文字符数"""
return len([c for c in text if '\u4e00' <= c <= '\u9fff'])
def is_short_paragraph(text, threshold=35):
"""判断是否为短段落"""
# 排除标题行
if text.startswith('# ') or text.startswith('## ') or text.startswith('### '):
return False
# 统计有效字符
chinese_chars = count_chinese_chars(text)
# 数字和英文字母也算作有效字符
other_chars = len(re.findall(r'[a-zA-Z0-9]', text))
total_chars = chinese_chars + other_chars
return total_chars < threshold
def fix_paragraphs(input_file, output_file):
with open(input_file, 'r', encoding='utf-8') as f:
lines = f.readlines()
# 将内容分割成段落
paragraphs = []
current_para = []
for line in lines:
stripped = line.strip()
if stripped == '':
if current_para:
paragraphs.append(''.join(current_para))
current_para = []
paragraphs.append('') # 空段落
else:
current_para.append(line)
if current_para:
paragraphs.append(''.join(current_para))
# 合并短段落
merged_paragraphs = []
i = 0
while i < len(paragraphs):
if paragraphs[i] == '':
merged_paragraphs.append('')
i += 1
continue
current_text = paragraphs[i].strip()
# 如果是短段落,尝试合并后续短段落
if is_short_paragraph(current_text) and i + 1 < len(paragraphs) and paragraphs[i + 1] != '':
merged_text = current_text
j = i + 1
# 合并后续短段落
while j < len(paragraphs) and paragraphs[j] != '' and is_short_paragraph(paragraphs[j].strip()):
merged_text += ' ' + paragraphs[j].strip()
j += 1
# 如果合并后达到一定长度,停止合并
if count_chinese_chars(merged_text) >= 50:
break
merged_paragraphs.append(merged_text)
i = j
else:
merged_paragraphs.append(current_text)
i += 1
# 重新生成文本
result_lines = []
for para in merged_paragraphs:
if para == '':
result_lines.append('')
else:
# 清理多余的空白和标点
para = re.sub(r'\s+', ' ', para)
para = re.sub(r'([。!?])\s+', r'\1\n\n', para) # 在句号后添加换行
para = re.sub(r'([。!?])$', r'\1\n', para)
result_lines.append(para)
final_text = '\n'.join(result_lines)
# 写回文件
with open(output_file, 'w', encoding='utf-8') as f:
f.write(final_text)
# 统计信息
print(f'修复完成!')
print(f'输出文件: {output_file}')
# 分析原始和修复后的段落
original_non_empty = [p for p in paragraphs if p != '']
fixed_non_empty = [p for p in merged_paragraphs if p != '']
original_short = sum(1 for p in original_non_empty if is_short_paragraph(p.strip()))
fixed_short = sum(1 for p in fixed_non_empty if is_short_paragraph(p.strip()))
print(f'原始段落数: {len(original_non_empty)}')
print(f'原始短段落数: {original_short} ({original_short/len(original_non_empty)*100:.1f}%)')
print(f'修复后段落数: {len(fixed_non_empty)}')
print(f'修复后短段落数: {fixed_short} ({fixed_short/len(fixed_non_empty)*100:.1f}%)')
# 计算段落长度的改善
original_lengths = [count_chinese_chars(p) for p in original_non_empty]
fixed_lengths = [count_chinese_chars(p) for p in fixed_non_empty]
print(f'原始平均段落长度: {sum(original_lengths)/len(original_lengths):.1f}')
print(f'修复后平均段落长度: {sum(fixed_lengths)/len(fixed_lengths):.1f}')
print(f'长度增加: {(sum(fixed_lengths)/len(fixed_lengths) - sum(original_lengths)/len(original_lengths)):.1f}')
if __name__ == '__main__':
if len(sys.argv) != 3:
print('用法: python fix_paragraphs_v2.py 输入文件 输出文件')
sys.exit(1)
input_file = sys.argv[1]
output_file = sys.argv[2]
fix_paragraphs(input_file, output_file)