发布于 

甄嬛Chat复现-Part01-从剧本文件提取对话

本文复现:使用extract-dialogue工具从剧本提取对话。

extract-dialogue调用DeepSeek V3 Chat模型API,使用schema预设的样例模板,从剧本txt中提取对话,保持成json格式。

生出的角色对话格式示例:

{"role": "甄嬛", "content": "嬛儿是尽人事以听天命。"}

1、下载huanhuan-chat代码仓

git clone https://ghfast.top/https://github.com/KMnO4-zx/huanhuan-chat.git

在huanhuan-chat/dataset/input/huanhuan目录下存有《甄嬛传》剧本文件。

2、下载extract-dialogue,初始化pip环境

git clone https://ghfast.top/https://github.com/KMnO4-zx/extract-dialogue.git
cd extract-dialogue

# 创建python环境
conda create -n huanhuan python=3.12

# 按照依赖包
pip install -r requirements.txt

3、配置DeekSeek API Key

在extract-dialogue根目录下创建.env文件,内容如下:

DEEPSEEK_BASE_URL=https://api.deepseek.com
DEEPSEEK_API=<api_key>

其中:<api_key>需替换成你自己的api秘钥(需要去官网充值才能用!处理一个txt 10元足够)。

在DeepSeek API Key网页,新建一个API Key,名称用于助记,可以随便取,注意:生成后要立即点击Copy 复制到本地,后续是无法复制的,只能重新创建另一个Key。

deepseek_api_key.png

复制sk-开头的序列,替换掉<api_key> 即可。

4、运行处理脚本

拷贝《甄嬛传》文本到data/目录

cp /path/to/huanhuan-chat/dataset/input/huanhuan/*.txt ./data/

修改example.py:1)剧本文件路径;2)response的解析方式

from extract import system_prompt
from schema import novel_schema
from LLM import DeepseekChat
from utils import ReadFiles
from tqdm import tqdm
import json

# 改成你要处理的剧本路径
file_path = 'data/甄嬛传剧本01-10.txt'

docs = ReadFiles(file_path).get_content(max_token_len=500, cover_content=0)

sys_prompt = system_prompt(novel_schema)

model = DeepseekChat()

file_name = file_path.split('/')[-1].split('.')[0]

for i in tqdm(range(len(docs))):
response = model.chat(sys_prompt, docs[i])

# 新增这一行的原因是:DS-V3返回的结果格式是:```json[{...}]```,
# 需要将头尾的```剔除,以及将前缀"json"删掉,才能正确解析成json。
response = response.strip('`')[4:]

print(response)
try:
response = json.loads(response)
for item in response:
with open(f'{file_name}.jsonl', 'a', encoding='utf-8') as f:
json.dump(item, f, ensure_ascii=False)
f.write('\n')
except Exception as e:
print(e)

执行分析:

python example.py

会在当前目录生出一个同名的jsonl文件:甄嬛传剧本01-10.jsonl。内容如下:

{"role": "太监", "content": "跪!一叩首!再叩首!三叩首!兴!"}
{"role": "苏培盛", "content": "奉天承运,皇帝诏曰:隆科多真圣祖皇帝忠臣,朕之功臣,国家良臣,袭一等公,授吏部尚书并兼管理藩院。川陕总督年羹尧授二等公,凡调遣军兵、动用粮饷之处,着边防办饷大臣及川陕云南督抚提镇等,俱照年大将军办理,钦此。"}
{"role": "百官", "content": "谢主隆恩!"}
{"role": "官员甲", "content": "咱们皇上可真是器重年将军和隆科多大人。"}
{"role": "官员乙", "content": "隆科多大人,恭喜恭喜啊!您可是国家的大功臣啊!"}
{"role": "官员丙", "content": "年大将军,皇上对你可是垂青有加呀!"}
...

处理速度比较慢,大约10s输出一段,建议睡前启动,运行一晚即可。