import os, re dir_path = '/app/working/workspaces/default/novels/r2-ai-xiu-jiao' files = sorted( [f for f in os.listdir(dir_path) if f.endswith('.md') and f != 'README.md'], key=lambda x: int(re.search(r'第(\d+)章', x).group(1)) if re.search(r'第(\d+)章', x) else 99 ) all_text = ''.join(open(os.path.join(dir_path, f)).read() for f in files) sizes = [len(open(os.path.join(dir_path, f)).read().encode('utf-8')) for f in files] hz = len(re.findall(r'[\u4e00-\u9fff]', all_text)) print('=' * 60) print('《AI能代替一切,除了修脚》- 完整度检查') print('=' * 60) print(f'15章完整: {"OK" if len(files) == 15 else "ISSUE: " + str(len(files))}') print(f'汉字:~{hz} | 均:{sum(sizes)//15}b | 最短:{min(sizes)}b | 最长:{max(sizes)}b') print() print('--- 审核敏感词扫描 ---') for w in ['公司', '集团', '企业']: count = len(re.findall(w, all_text)) print(f' "{w}": {count}处 {"✅" if count == 0 else "⚠️"}') for w in ['被裁', '裁员', '辞退', '被优化', '被替代', '被代替']: count = len(re.findall(w, all_text)) print(f' "{w}": {count}处 {"✅" if count == 0 else "⚠️"}') print() print('--- 章节开头模式检查 ---') for f in files[:3]: lines = open(os.path.join(dir_path, f)).read().strip().split('\n') for l in lines: s = l.strip() if s and not s.startswith('# ') and len(s) > 5: print(f' {f[:15]}: {s[:60]}') break print() print('--- AI味残留扫描 ---') patterns = { '燃点标签': r'燃点|【燃|(燃', '章末标注': r'第[一二三四五六七八九十百]+章.*完', '深吸一口气': r'深吸一口气|深呼一口气', '握紧/攥紧': r'握紧|攥紧|捏紧', '——独立行': r'^\s*——+\s*$', 'meta自嘲': r'不对.*系统|这不是.*小说|作者注', '全书完': r'(全书完)|(全文完)', } for name, pat in patterns.items(): count = len(re.findall(pat, all_text, re.MULTILINE)) flag = '⚠️' if count > 0 else '✅' print(f' {name}: {flag} ({count}处)') print() print('--- 被动受害者叙事扫描 ---') bei_pat = r'被[^。!?]{0,20}替代|被[^。!?]{0,20}代替|被[^。!?]{0,20}辞退|被[^。!?]{0,20}裁' bei_count = len(re.findall(bei_pat, all_text)) print(f' 被动被XX叙事: {"✅ 0处" if bei_count == 0 else "⚠️ " + str(bei_count) + "处"}') score = 100 if min(sizes) < 1200: score -= 10 if bei_count > 0: score -= bei_count * 10 print() print(f'评分: {max(score, 0)}/100') print(f'评级: {"S - 可直接投番茄" if score >= 90 else "A - 微调后可投"}')