Excel 批量关键词翻译脚本(适配讯飞星火模型)

这是一个用于批量翻译Excel关键词为简体中文的Python脚本,适配讯飞星火Lite模型。适合SEO关键词处理、跨境电商词库建设等应用场景。

功能特点

  • 支持 .xlsx 表格格式;
  • 自动识别关键词列并翻译;
  • 翻译失败自动重试最多3次;
  • 每翻译 N 行自动保存(防止中断丢失进度);
  • 控制请求频率(QPS = 2)防止触发接口限流。

使用方式

  • 安装依赖:
pip install openpyxl tqdm
  • 修改脚本中的以下参数为你自己的配置:
SPARKAI_APP_ID = 'your_app_id' SPARKAI_API_KEY = 'your_api_key' SPARKAI_API_SECRET = 'your_api_secret' INPUT_PATH = '你的Excel文件路径'
  • 运行脚本:
 python translate_excel.py

脚本会逐行翻译 Keyword 列的英文关键词,并将中文结果写入 中文含义 列。

注意事项

  • 本脚本默认使用讯飞星火 lite 模型,免费版本 QPS 限制为 2,因此设置了 time.sleep(0.5) 来控制频率;
  • 支持中断后继续运行,只会翻译未填写中文的行;
  • 建议每次翻译前备份原始 Excel 文件。

Code:

import time
import math
import openpyxl
from tqdm import tqdm
from sparkai.llm.llm import ChatSparkLLM
from sparkai.core.messages import ChatMessage

# ===== 星火Lite接口配置请填写你的 API 凭据)=====
SPARKAI_URL = 'wss://spark-api.xf-yun.com/v1.1/chat'
SPARKAI_APP_ID = 'your_app_id_here'       # 替换为你的 App ID
SPARKAI_API_SECRET = 'your_api_secret'    # 替换为你的 API Secret
SPARKAI_API_KEY = 'your_api_key'          # 替换为你的 API Key
SPARKAI_DOMAIN = 'lite'  # 使用免费 lite 模型

# 模型参数可调
MODEL_PARAMS = {
    'max_tokens': 4096,
    'temperature': 0.5,
    'top_k': 4
}

# ===== Excel 文件路径和列名 =====
INPUT_PATH = '处理文件路径'
TARGET_COL_NAME = 'Keyword'
CHINESE_COL_NAME = '中文含义'
SAVE_INTERVAL = 10  # 每翻译多少行保存一次

# ===== 初始化星火 Chat 模型 =====
spark = ChatSparkLLM(
    spark_api_url=SPARKAI_URL,
    spark_app_id=SPARKAI_APP_ID,
    spark_api_key=SPARKAI_API_KEY,
    spark_api_secret=SPARKAI_API_SECRET,
    spark_llm_domain=SPARKAI_DOMAIN,
    streaming=False,
    request_timeout=60,
    max_tokens=MODEL_PARAMS['max_tokens'],
    temperature=MODEL_PARAMS['temperature'],
    top_k=MODEL_PARAMS['top_k']
)

# ===== 翻译函数带自动重试机制 =====
def translate_keyword(kw, max_retries=3):
    for attempt in range(max_retries):
        try:
            messages = [ChatMessage(role="user", content=f"请将以下关键词翻译成简体中文:{kw}")]
            res = spark.generate([messages])
            if res and hasattr(res, 'generations') and res.generations:
                return res.generations[0][0].text.strip()
        except Exception as e:
            print(f"[重试 {attempt + 1}/{max_retries}] 翻译失败: {kw} -> 错误: {e}")
        time.sleep(1)  # 重试前等待
    return '[翻译失败]'  # 超过重试次数仍失败

# ===== 主流程处理函数 =====
def process_excel(input_path):
    wb = openpyxl.load_workbook(input_path)
    ws = wb.active

    headers = [cell.value for cell in ws[1]]
    if TARGET_COL_NAME not in headers:
        raise ValueError(f"未找到列名: {TARGET_COL_NAME}")

    kw_col_idx = headers.index(TARGET_COL_NAME) + 1

    # 如果中文含义列不存在创建它
    if CHINESE_COL_NAME not in headers:
        ws.cell(row=1, column=len(headers) + 1, value=CHINESE_COL_NAME)
        zh_col_idx = len(headers) + 1
    else:
        zh_col_idx = headers.index(CHINESE_COL_NAME) + 1

    total_rows = ws.max_row - 1
    to_translate = []

    # 收集未翻译的关键词
    for i in range(2, ws.max_row + 1):
        kw = ws.cell(row=i, column=kw_col_idx).value
        zh = ws.cell(row=i, column=zh_col_idx).value
        if kw and not zh:
            to_translate.append((i, kw.strip()))

    total = len(to_translate)
    print(f"准备翻译:{total} 个关键词(总共 {total_rows})")

    start_time = time.time()

    # 开始逐行翻译
    for idx, (row_num, keyword) in enumerate(tqdm(to_translate, desc="翻译中"), 1):
        translation = translate_keyword(keyword)
        ws.cell(row=row_num, column=zh_col_idx, value=translation)

        # 控制 QPS = 2(0.5秒请求间隔
        time.sleep(0.5)

        #  N 行保存一次
        if idx % SAVE_INTERVAL == 0:
            wb.save(input_path)
            print(f"已保存前 {idx} 行翻译结果...")

        # 估算剩余时间
        if idx % 10 == 0:
            elapsed = time.time() - start_time
            eta = (elapsed / idx) * (total - idx)
            print(f"已完成 {idx}/{total},预计剩余时间:{math.ceil(eta)} 秒")

    wb.save(input_path)
    print(f"翻译完成,文件已保存:{input_path}")
    total_time = round(time.time() - start_time, 2)
    print(f"总耗时:{total_time} 秒")

# ===== 启动程序 =====
if __name__ == '__main__':
    process_excel(INPUT_PATH)
属于什么分类: