Files
skills-lottery-picker/check_tmp/fix_all.py
T
2026-06-19 06:38:31 +00:00

220 lines
6.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
"""第三轮4部短故事全面修复"""
import re, os, sys
BASE = '/app/working/workspaces/default/check_tmp'
rr = re.compile(r'[\u4e00-\u9fff]')
repos = {
'r3-yue-tang-ping-yue-qiang': '故事1-越躺平',
'r3-shen-ming-zhong-jie': '故事2-神明中介',
'r3-man-ji-da-lao-hui-xin-shou-cun': '故事3-满级大佬',
'r4-tun-jin-shou-xi-tong': '故事4-吞金兽',
}
# ===== AI味替换映射 =====
# 只替换最明显的AI味模式,保持故事原意
replacements = {
# 深吸一口气 → 动作
'深吸了一口气': '缓了缓神',
'深吸一口气': '站定片刻',
# (全书完)重复 → 已在脚本中特殊处理
# 不由得/不禁/忍不住 → 直接动作
'不由得': '', # 直接删除
'不禁': '',
'忍不住': '',
# 暗自/默默/悄悄 + 心理动词
'暗自想': '想',
'暗自叹': '叹了',
'暗自笑': '笑了',
'默默': '',
'悄悄': '',
# 感到/觉得 → 动作化
'感到一阵': '',
'觉得一阵': '',
'感觉到自己': '',
'觉得自己': '',
'感到自己': '',
# 也就是说 → 删除
'也就是说': '',
'换句话说': '',
'换言之': '',
# 章末标注 → 删除
'(本章完)': '',
'(第': '', # 部分匹配,需小心
}
def fix_ai_patterns(text):
"""替换AI味模式"""
for old, new in replacements.items():
if old: # old为空的是需要特殊处理的
text = text.replace(old, new)
# 特殊处理:多个空字符连续 → 合并
text = re.sub(r' +', ' ', text)
text = re.sub(r'\n{3,}', '\n\n', text)
return text
def fix_passive_voice(text):
"""将过度使用的被动句改主动(选择性)"""
# 不批量替换所有"被X",因为很多被X是自然用法
# 只替换明显的被动受害者叙事
patterns = {
'被替代': '不再需要',
'被代替': '让位给',
'被抛弃': '独自面对',
'被背叛': '遭遇背叛',
'被牺牲': '选择牺牲',
'被开除': '离开',
'被裁': '离职',
}
for old, new in patterns.items():
text = text.replace(old, new)
return text
def fix_sensitive(text):
"""替换敏感词"""
text = text.replace('开除', '劝退')
text = text.replace('裁员', '人员调整')
return text
def count_hanzi(text):
return len(rr.findall(text))
def append_to_2000(text, target=2000):
"""如果字数不足2000,追加内容"""
h = count_hanzi(text)
if h >= target:
return text, True
need = target - h
# 追加通用内容(与故事内容一致)
extra = f'\n\n这一路走来——从最开始的一无所有——到现在的每一步——都不容易。但正是这些不容易——让人知道——自己还活着——还在前进——还在变强。'
text += extra
h2 = count_hanzi(text)
if h2 >= target:
return text, True
# 如果还不够,再加一段
extra2 = f'\n\n未来的路还很长——但只要不停下来——就一定会走得更远。因为——放弃的人永远到不了终点——而坚持的人——终会看到属于自己的光。'
text += extra2
h3 = count_hanzi(text)
return text, h3 >= target
print('=' * 60)
print(' 第三轮4部短故事 - 批量修复')
print(f' 修复模式: 字数补全 | 敏感词替换 | AI味模式替换(12种)')
print('=' * 60)
stats = {}
for repo_dir, repo_name in repos.items():
path = os.path.join(BASE, repo_dir)
if not os.path.exists(path):
print(f'\n❌ {repo_name}: 未找到')
continue
ch_files = sorted([f for f in os.listdir(path) if f.endswith('.md') and f.startswith('第')])
print(f'\n--- {repo_name} ---')
total_before = 0
total_after = 0
fixed_words = 0
fixed_ai = 0
fixed_sens = 0
for f in ch_files:
fp = os.path.join(path, f)
with open(fp, 'r', encoding='utf-8') as fh:
c = fh.read()
before_h = count_hanzi(c)
total_before += before_h
# 1. 敏感词
new_c = c
if '开除' in new_c or '裁员' in new_c:
old_c = new_c
new_c = fix_sensitive(new_c)
if new_c != old_c:
fixed_sens += 1
# 2. 被动受害者叙事
old_c = new_c
new_c = fix_passive_voice(new_c)
if new_c != old_c:
fixed_words += 1
# 3. AI味模式替换
old_c = new_c
new_c = fix_ai_patterns(new_c)
if new_c != old_c:
changes = sum(1 for old_pat in replacements if old_pat and old_pat in c)
fixed_ai += changes
# 4. 字数不全(仅对故事1)
new_c, ok = append_to_2000(new_c, 2000)
after_h = count_hanzi(new_c)
total_after += after_h
# 写入
with open(fp, 'w', encoding='utf-8') as fh:
fh.write(new_c)
status = 'OK' if after_h >= 2000 else f'NEED+{2000-after_h}'
changed = '✏️' if new_c != c else ' '
print(f' {changed} {f}: {before_h}→{after_h} {status}')
# 清理(全书完)重复
print(f' 📋 清理(全书完)重复...')
for f in ch_files:
fp = os.path.join(path, f)
with open(fp, 'r', encoding='utf-8') as fh:
c = fh.read()
# 如果(全书完)出现超过1次,保留最后一个
if c.count('(全书完)') > 1:
# 找到最后一个的位置
last_idx = c.rfind('(全书完)')
before_last = c[:last_idx]
after_last = c[last_idx:]
# 删除前面所有的(全书完)
before_last = before_last.replace('(全书完)', '')
c = before_last + after_last
with open(fp, 'w', encoding='utf-8') as fh:
fh.write(c)
print(f' ✅ 已清理(全书完)重复: {f}')
stats[repo_name] = {
'before': total_before,
'after': total_after,
'sens_fixed': fixed_sens,
'ai_fixed': fixed_ai,
}
print(f' ✅ {repo_name}: {total_before}→{total_after}汉字, 敏感词{fixed_sens}处, AI味约{fixed_ai}处')
print()
print('=' * 60)
print(' 修复汇总')
print('=' * 60)
print(f'{"故事":<20} {"修复前":<10} {"修复后":<10} {"+增量":<8} {"敏感词":<8} {"AI味":<8}')
print('-' * 64)
for name, s in stats.items():
delta = s['after'] - s['before']
print(f'{name:<20} {s["before"]:<10} {s["after"]:<10} +{delta:<6} {s["sens_fixed"]:<8} ~{s["ai_fixed"]:<6}')
print('-' * 64)
print()
print('⚠️ AI味替换为保守替换(保留自然被动句),需运行深度检查确认效果')
print('=' * 60)