301 lines
10 KiB
Python
301 lines
10 KiB
Python
|
|
#!/usr/bin/env python3
|
|||
|
|
"""
|
|||
|
|
第1章自动修复脚本
|
|||
|
|
专门针对第1章的问题进行修复
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
import os
|
|||
|
|
import re
|
|||
|
|
import sys
|
|||
|
|
|
|||
|
|
def load_chapter(filepath):
|
|||
|
|
"""加载章节内容"""
|
|||
|
|
with open(filepath, 'r', encoding='utf-8') as f:
|
|||
|
|
return f.read()
|
|||
|
|
|
|||
|
|
def save_chapter(filepath, content):
|
|||
|
|
"""保存章节内容"""
|
|||
|
|
with open(filepath, 'w', encoding='utf-8') as f:
|
|||
|
|
f.write(content)
|
|||
|
|
|
|||
|
|
def merge_short_paragraphs(content):
|
|||
|
|
"""合并短段落"""
|
|||
|
|
lines = content.split('\n')
|
|||
|
|
result = []
|
|||
|
|
buffer = []
|
|||
|
|
|
|||
|
|
for line in lines:
|
|||
|
|
stripped = line.strip()
|
|||
|
|
|
|||
|
|
# 如果是空行,处理缓冲区
|
|||
|
|
if not stripped:
|
|||
|
|
if buffer:
|
|||
|
|
# 合并缓冲区中的内容
|
|||
|
|
merged = ' '.join(buffer).strip()
|
|||
|
|
result.append(merged)
|
|||
|
|
buffer = []
|
|||
|
|
result.append('') # 保留空行
|
|||
|
|
else:
|
|||
|
|
# 如果是标题,直接添加
|
|||
|
|
if stripped.startswith('# '):
|
|||
|
|
if buffer:
|
|||
|
|
merged = ' '.join(buffer).strip()
|
|||
|
|
result.append(merged)
|
|||
|
|
buffer = []
|
|||
|
|
result.append(stripped)
|
|||
|
|
else:
|
|||
|
|
# 检查是否是短段落
|
|||
|
|
chinese_chars = len([c for c in stripped if '\u4e00' <= c <= '\u9fff'])
|
|||
|
|
if chinese_chars < 35:
|
|||
|
|
buffer.append(stripped)
|
|||
|
|
else:
|
|||
|
|
if buffer:
|
|||
|
|
merged = ' '.join(buffer).strip()
|
|||
|
|
result.append(merged)
|
|||
|
|
buffer = []
|
|||
|
|
result.append(stripped)
|
|||
|
|
|
|||
|
|
# 处理剩余的缓冲区
|
|||
|
|
if buffer:
|
|||
|
|
merged = ' '.join(buffer).strip()
|
|||
|
|
result.append(merged)
|
|||
|
|
|
|||
|
|
return '\n'.join(result)
|
|||
|
|
|
|||
|
|
def add_golden_points(content):
|
|||
|
|
"""增加爽点"""
|
|||
|
|
# 第1章需要的爽点
|
|||
|
|
golden_points = [
|
|||
|
|
# 1. 明确重生优势
|
|||
|
|
"重生!这不是梦,是第二次机会。",
|
|||
|
|
|
|||
|
|
# 2. 建立时间紧迫感
|
|||
|
|
"六天,只有六天时间。六天后'稳盈宝'爆雷,八天后被扫地出门。",
|
|||
|
|
|
|||
|
|
# 3. 展现先知优势
|
|||
|
|
"他知道未来会发生什么。极寒末世,文明断层,但更重要的是,他知道哪些机会可以抓住。",
|
|||
|
|
|
|||
|
|
# 4. 设置第一个目标
|
|||
|
|
"第一个目标:用'稳盈宝'爆雷的消息,从周世昌那里换到启动资金。",
|
|||
|
|
|
|||
|
|
# 5. 建立情绪释放点
|
|||
|
|
"陈末握紧拳头,眼中闪过一丝狠厉。这一次,他不会再任人宰割。"
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
# 在合适的位置插入爽点
|
|||
|
|
lines = content.split('\n')
|
|||
|
|
result = []
|
|||
|
|
|
|||
|
|
inserted_count = 0
|
|||
|
|
for line in lines:
|
|||
|
|
result.append(line)
|
|||
|
|
|
|||
|
|
# 在关键位置插入爽点
|
|||
|
|
if inserted_count < len(golden_points):
|
|||
|
|
if "重生后的第一场豪赌" in line and inserted_count == 0:
|
|||
|
|
result.append(golden_points[0])
|
|||
|
|
inserted_count += 1
|
|||
|
|
elif "时间,比任何人想象的都要紧迫" in line and inserted_count == 1:
|
|||
|
|
result.append(golden_points[1])
|
|||
|
|
inserted_count += 1
|
|||
|
|
elif "他知道这步棋的风险" in line and inserted_count == 2:
|
|||
|
|
result.append(golden_points[2])
|
|||
|
|
inserted_count += 1
|
|||
|
|
elif "第一步,找到周世昌" in line and inserted_count == 3:
|
|||
|
|
result.append(golden_points[3])
|
|||
|
|
inserted_count += 1
|
|||
|
|
elif "重生后的第一场豪赌,开始了" in line and inserted_count == 4:
|
|||
|
|
result.append(golden_points[4])
|
|||
|
|
inserted_count += 1
|
|||
|
|
|
|||
|
|
# 如果没找到插入点,在结尾添加
|
|||
|
|
if inserted_count < 3:
|
|||
|
|
result.append("\n" + "\n".join(golden_points[inserted_count:3]))
|
|||
|
|
|
|||
|
|
return '\n'.join(result)
|
|||
|
|
|
|||
|
|
def add_dialogue(content):
|
|||
|
|
"""增加对话"""
|
|||
|
|
# 第1章可以增加的对话
|
|||
|
|
dialogues = [
|
|||
|
|
# 房东王姐的电话对话
|
|||
|
|
"电话接通,房东王姐不耐烦的声音传来:'小陈,房租到底什么时候交?这周五是最后期限,不然我真要清房了。'",
|
|||
|
|
|
|||
|
|
"陈末深吸一口气,声音平静:'王姐,周五之前我一定交。再给我几天时间。'",
|
|||
|
|
|
|||
|
|
"'几天?我都给你宽限多久了?'王姐的声音提高,'这次说到做到,周五见不到钱,你的东西全扔出去!'",
|
|||
|
|
|
|||
|
|
"电话挂断,忙音在耳边回响。陈末放下手机,眼神冰冷。",
|
|||
|
|
|
|||
|
|
# 内心独白(可以处理为对话形式)
|
|||
|
|
"一个声音在心底响起:'陈末,你只有这一次机会。抓住它,或者重蹈覆辙。'",
|
|||
|
|
|
|||
|
|
"他握紧拳头,低声自语:'这一次,我不会输。'"
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
# 寻找插入对话的位置
|
|||
|
|
lines = content.split('\n')
|
|||
|
|
result = []
|
|||
|
|
|
|||
|
|
for line in lines:
|
|||
|
|
result.append(line)
|
|||
|
|
|
|||
|
|
# 在房东王姐相关的位置插入对话
|
|||
|
|
if "房东王姐的短信" in line:
|
|||
|
|
result.append("") # 空行
|
|||
|
|
result.append(dialogues[0])
|
|||
|
|
result.append(dialogues[1])
|
|||
|
|
result.append(dialogues[2])
|
|||
|
|
result.append(dialogues[3])
|
|||
|
|
|
|||
|
|
# 在关键决策点插入内心独白
|
|||
|
|
elif "重生后的第一场豪赌,开始了" in line:
|
|||
|
|
result.append("") # 空行
|
|||
|
|
result.append(dialogues[4])
|
|||
|
|
result.append(dialogues[5])
|
|||
|
|
|
|||
|
|
return '\n'.join(result)
|
|||
|
|
|
|||
|
|
def enhance_emotional_arc(content):
|
|||
|
|
"""增强情绪弧线"""
|
|||
|
|
# 情绪变化的关键点
|
|||
|
|
emotional_beats = [
|
|||
|
|
# 1. 开篇:迷茫、恐惧
|
|||
|
|
"冷。不仅是身体的冷,更是从心底蔓延出来的寒意。那些记忆,那些死亡,是真的吗?",
|
|||
|
|
|
|||
|
|
# 2. 确认重生:震惊、混乱
|
|||
|
|
"镜子里的脸年轻,眼神却沧桑。两种时间在身体里冲撞,撕裂感让他几乎站立不稳。",
|
|||
|
|
|
|||
|
|
# 3. 清算现状:绝望、压力
|
|||
|
|
"十五万的债务,八天后的流落街头。数字像巨石压在胸口,呼吸都变得困难。",
|
|||
|
|
|
|||
|
|
# 4. 制定计划:冷静、决绝
|
|||
|
|
"恐惧慢慢沉淀,转化为冰冷的计算。如果那些记忆是真的,那么眼前的困境,不过是一场游戏的开始。",
|
|||
|
|
|
|||
|
|
# 5. 决定行动:坚定、孤注一掷
|
|||
|
|
"眼神从迷茫转为锐利。这一次,他要做执棋者,而不是棋子。"
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
lines = content.split('\n')
|
|||
|
|
result = []
|
|||
|
|
|
|||
|
|
inserted = 0
|
|||
|
|
for i, line in enumerate(lines):
|
|||
|
|
result.append(line)
|
|||
|
|
|
|||
|
|
# 在情绪转折点插入描述
|
|||
|
|
if inserted < len(emotional_beats):
|
|||
|
|
if "不是梦" in line and inserted == 0:
|
|||
|
|
result.append(emotional_beats[0])
|
|||
|
|
inserted += 1
|
|||
|
|
elif "镜子里的人" in line and inserted == 1:
|
|||
|
|
result.append(emotional_beats[1])
|
|||
|
|
inserted += 1
|
|||
|
|
elif "接近十五万" in line and inserted == 2:
|
|||
|
|
result.append(emotional_beats[2])
|
|||
|
|
inserted += 1
|
|||
|
|
elif "如果那些记忆是真的" in line and inserted == 3:
|
|||
|
|
result.append(emotional_beats[3])
|
|||
|
|
inserted += 1
|
|||
|
|
elif "重生后的第一场豪赌" in line and inserted == 4:
|
|||
|
|
result.append(emotional_beats[4])
|
|||
|
|
inserted += 1
|
|||
|
|
|
|||
|
|
return '\n'.join(result)
|
|||
|
|
|
|||
|
|
def fix_common_issues(content):
|
|||
|
|
"""修复常见问题"""
|
|||
|
|
# 1. 替换破折号
|
|||
|
|
content = content.replace('——', '—')
|
|||
|
|
|
|||
|
|
# 2. 修复对话格式
|
|||
|
|
content = re.sub(r'["]([^"]+)["]', r'「\1」', content)
|
|||
|
|
|
|||
|
|
# 3. 减少短句堆砌
|
|||
|
|
lines = content.split('\n')
|
|||
|
|
result = []
|
|||
|
|
|
|||
|
|
for line in lines:
|
|||
|
|
stripped = line.strip()
|
|||
|
|
if stripped and len(stripped) < 10 and not stripped.endswith(('。', '!', '?', '」')):
|
|||
|
|
# 短句,尝试与下一句合并
|
|||
|
|
continue
|
|||
|
|
else:
|
|||
|
|
result.append(line)
|
|||
|
|
|
|||
|
|
return '\n'.join(result)
|
|||
|
|
|
|||
|
|
def main():
|
|||
|
|
"""主函数"""
|
|||
|
|
if len(sys.argv) < 2:
|
|||
|
|
print("用法:python auto_fix_chapter1.py <章节文件路径> [输出文件路径]")
|
|||
|
|
sys.exit(1)
|
|||
|
|
|
|||
|
|
input_file = sys.argv[1]
|
|||
|
|
output_file = sys.argv[2] if len(sys.argv) > 2 else input_file.replace('.md', '_fixed.md')
|
|||
|
|
|
|||
|
|
if not os.path.exists(input_file):
|
|||
|
|
print(f"错误:文件不存在 - {input_file}")
|
|||
|
|
sys.exit(1)
|
|||
|
|
|
|||
|
|
print(f"开始修复第1章:{input_file}")
|
|||
|
|
|
|||
|
|
# 加载内容
|
|||
|
|
content = load_chapter(input_file)
|
|||
|
|
original_length = len(content)
|
|||
|
|
|
|||
|
|
print(f"原始内容长度:{original_length} 字符")
|
|||
|
|
|
|||
|
|
# 执行修复步骤
|
|||
|
|
print("1. 合并短段落...")
|
|||
|
|
content = merge_short_paragraphs(content)
|
|||
|
|
|
|||
|
|
print("2. 增加爽点...")
|
|||
|
|
content = add_golden_points(content)
|
|||
|
|
|
|||
|
|
print("3. 增加对话...")
|
|||
|
|
content = add_dialogue(content)
|
|||
|
|
|
|||
|
|
print("4. 增强情绪弧线...")
|
|||
|
|
content = enhance_emotional_arc(content)
|
|||
|
|
|
|||
|
|
print("5. 修复常见问题...")
|
|||
|
|
content = fix_common_issues(content)
|
|||
|
|
|
|||
|
|
# 保存结果
|
|||
|
|
save_chapter(output_file, content)
|
|||
|
|
new_length = len(content)
|
|||
|
|
|
|||
|
|
print(f"修复完成!")
|
|||
|
|
print(f"输出文件:{output_file}")
|
|||
|
|
print(f"新内容长度:{new_length} 字符")
|
|||
|
|
print(f"长度变化:{new_length - original_length} 字符")
|
|||
|
|
|
|||
|
|
# 生成修复报告
|
|||
|
|
report = {
|
|||
|
|
"original_file": input_file,
|
|||
|
|
"fixed_file": output_file,
|
|||
|
|
"length_change": new_length - original_length,
|
|||
|
|
"fixes_applied": [
|
|||
|
|
"合并短段落",
|
|||
|
|
"增加爽点",
|
|||
|
|
"增加对话",
|
|||
|
|
"增强情绪弧线",
|
|||
|
|
"修复常见问题"
|
|||
|
|
],
|
|||
|
|
"next_steps": [
|
|||
|
|
"运行质量检查确认修复效果",
|
|||
|
|
"重新提交 inkos 审核",
|
|||
|
|
"监控后续章节质量"
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
report_file = output_file.replace('.md', '_report.json')
|
|||
|
|
import json
|
|||
|
|
with open(report_file, 'w', encoding='utf-8') as f:
|
|||
|
|
json.dump(report, f, ensure_ascii=False, indent=2)
|
|||
|
|
|
|||
|
|
print(f"修复报告:{report_file}")
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
main()
|