-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy patheditor_review.py
More file actions
279 lines (216 loc) · 6.59 KB
/
editor_review.py
File metadata and controls
279 lines (216 loc) · 6.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
#!/usr/bin/env python3
"""
资深编辑审稿系统
全方位优化文章质量
"""
import os
import sys
from pathlib import Path
from anthropic import Anthropic
class SeniorEditor:
"""资深编辑 - 全方位审稿优化"""
def __init__(self):
# 从 content_gen.py 中读取正确的 API Key
api_key = os.getenv("ANTHROPIC_API_KEY")
if not api_key:
# 尝试从 content_gen.py 读取
try:
import sys
sys.path.insert(0, os.path.dirname(__file__))
from modules.content_gen import ContentGenerator
gen = ContentGenerator()
api_key = gen.client.api_key
except:
raise ValueError("未找到有效的 ANTHROPIC_API_KEY")
self.client = Anthropic(api_key=api_key)
# 作者人设
self.author_persona = """
**作者人设:ruby鑫燕**
- 背景:高级经管硕士,资深职场专家
- 性格:北京大妞儿,幽默风趣,直爽真诚
- 风格:文风鲜明独特,不说废话,简洁有力
- 特点:洞察力强,擅长非暴力沟通,去说教感
- 目标:提供实战干货,拒绝鸡汤和爹味
"""
def review_article(self, html_file: str) -> dict:
"""
全方位审稿
审核维度:
1. 选题价值
2. 引流能力
3. 内容逻辑
4. 标题吸引力
5. 子标题清晰度
6. 语气调性
7. 人设契合度
8. 配图审美
9. 排版设计
"""
print("\n" + "="*70)
print("📝 启动资深编辑审稿流程")
print("="*70)
# 读取文章
with open(html_file, 'r', encoding='utf-8') as f:
html_content = f.read()
# 提取纯文本内容
import re
content = re.sub(r'<[^>]+>', '\n', html_content)
content = re.sub(r'\n+', '\n', content).strip()
# 审稿提示词
review_prompt = f"""
你是一位资深公众号编辑,专注于打造爆款文章。现在需要全方位审核以下文章。
{self.author_persona}
**审核维度(10项)**:
1. **选题价值** (0-10分)
- 是否切中痛点?
- 话题是否有讨论价值?
- 能否引发共鸣?
2. **引流能力** (0-10分)
- 标题是否吸引点击?
- 开头是否抓人?
- 结尾是否有互动引导?
3. **内容逻辑** (0-10分)
- 结构是否清晰?
- 论证是否有力?
- 前后是否连贯?
4. **主标题** (0-10分)
- 是否简洁有力?
- 是否制造好奇?
- 是否避免标题党?
5. **子标题** (0-10分)
- 层次是否清晰?
- 提炼是否到位?
- 节奏是否流畅?
6. **语气调性** (0-10分)
- 是否去除说教感?
- 是否避免爹味?
- 是否平等对话?
7. **人设契合** (0-10分)
- 是否符合北京大妞儿风格?
- 是否幽默风趣?
- 是否简洁不废话?
8. **洞察深度** (0-10分)
- 是否有独特视角?
- 是否有方法论?
- 是否实战可用?
9. **非暴力沟通** (0-10分)
- 是否尊重读者?
- 是否共情到位?
- 是否避免评判?
10. **整体质量** (0-10分)
- 干货程度
- 可读性
- 传播价值
---
**文章内容**:
{content}
---
**请按照以下格式输出审稿意见**:
## 📊 评分总览
| 维度 | 得分 | 评语 |
|------|------|------|
| 选题价值 | X/10 | ... |
| 引流能力 | X/10 | ... |
| 内容逻辑 | X/10 | ... |
| 主标题 | X/10 | ... |
| 子标题 | X/10 | ... |
| 语气调性 | X/10 | ... |
| 人设契合 | X/10 | ... |
| 洞察深度 | X/10 | ... |
| 非暴力沟通 | X/10 | ... |
| 整体质量 | X/10 | ... |
**总分**: XX/100
## ✅ 优点(保留)
1.
2.
3.
## ⚠️ 问题(必改)
1.
2.
3.
## 💡 优化建议
### 标题优化
- 原标题:...
- 建议标题:...
- 理由:...
### 开头优化
- 问题:...
- 建议:...
### 子标题优化
- 第X个小标题问题:...
- 建议改为:...
### 语气调整
- 说教化表述:...
- 建议改为:...
### 人设强化
- 可以加入的个人特色:...
## 🎯 具体改写示例(3-5处)
**示例1**:
- 原文:...
- 改后:...(北京大妞儿风格,简洁有力)
**示例2**:
- 原文:...
- 改后:...(去说教,平等对话)
## 📝 终审意见
- [ ] 可直接发布(85分以上)
- [ ] 小幅修改后发布(70-84分)
- [ ] 大幅修改后发布(60-69分)
- [ ] 建议重写(60分以下)
**编辑批注**:
...
**预期效果**:
- 阅读完成率:...
- 分享率:...
- 涨粉潜力:...
"""
print("\n🔍 正在进行深度审稿...")
print(" 审核维度:10项")
print(" 审核标准:资深编辑级\n")
# 调用 Claude 审稿
response = self.client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=8000,
temperature=0.3,
messages=[{
"role": "user",
"content": review_prompt
}]
)
review_result = response.content[0].text
# 保存审稿意见
review_file = html_file.replace('.html', '_review.md')
with open(review_file, 'w', encoding='utf-8') as f:
f.write(f"# 资深编辑审稿意见\n\n")
f.write(f"**原文件**: {html_file}\n")
f.write(f"**审稿编辑**: AI资深编辑\n")
f.write(f"**审稿时间**: {Path(html_file).stat().st_mtime}\n\n")
f.write("---\n\n")
f.write(review_result)
print("\n" + "="*70)
print("✅ 审稿完成!")
print("="*70)
print(f"📄 审稿报告: {review_file}")
print("="*70 + "\n")
# 显示审稿结果
print(review_result)
return {
'review_file': review_file,
'review_content': review_result,
'original_file': html_file
}
def main():
import argparse
parser = argparse.ArgumentParser(description='资深编辑审稿系统')
parser.add_argument('html_file', help='HTML文章文件路径')
args = parser.parse_args()
if not os.path.exists(args.html_file):
print(f"❌ 文件不存在: {args.html_file}")
sys.exit(1)
editor = SeniorEditor()
result = editor.review_article(args.html_file)
print(f"\n💡 下一步:")
print(f" 1. 查看审稿报告: open {result['review_file']}")
print(f" 2. 根据建议修改文章")
print(f" 3. 重新审稿确认\n")
if __name__ == "__main__":
main()