如何基于在线翻译API对超长文本进行不拆句的长度合规切割
解决超长文本适配翻译API的分段切割方案
嘿,这个问题我之前帮不少开发者踩过坑——要把超5万字符的文本喂进Google、Yandex这类有长度限制的翻译API,还得保证句子不被劈成两半,核心就是基于完整句子的智能分段,我给你捋捋具体可落地的方案:
核心逻辑:先拆句子,再拼分段
翻译API的长度限制大多是按Unicode字符数算的(少数可能按字节,先确认目标API的具体规则),咱们的思路是:先把整段文本拆成一个个独立的完整句子,再把句子逐个拼接,直到接近但不超过API的长度限制,形成符合要求的分段。
具体实现(以Python为例,逻辑可迁移到其他语言)
1. 先搞定句子边界的识别
首先得准确区分“句子结束符”和“缩写里的点”,比如Mr. U.S.A.里的.不是句子结束,而Hello!里的!才是。用正则表达式可以精准匹配:
import re # 匹配英文句子的真实结束边界,排除缩写场景 sentence_end_pattern = re.compile(r'(?<!\w\.\w.)(?<![A-Z][a-z]\.)(?<=\.|\?|\!)\s') # 如果是中文文本,换成这个正则: # cn_sentence_end_pattern = re.compile(r'(?<=\。|\!|\?)\s')
简单解释下这个正则:它会匹配./?/!后面的空格,但前提是前面不是类似U.S.A.(双点缩写)或者Mr.(单字母缩写)的情况,避免误拆。
2. 把整文本拆成单个句子列表
用上面的正则把文本拆成独立句子:
raw_text = "你的超长文本内容...(这里替换成实际文本)" sentences = sentence_end_pattern.split(raw_text) # 处理最后一句可能没带空格的情况 if sentences and not sentence_end_pattern.search(sentences[-1]): sentences[-1] = sentences[-1].strip()
3. 按API长度限制拼接成合规分段
接下来写个函数,把句子一个个往分段里塞,直到接近阈值就收尾,开始新的分段:
def split_text_for_translation(text, max_char_limit=300): # 先拆成句子 sentences = sentence_end_pattern.split(text) chunks = [] current_chunk = "" for sentence in sentences: # 计算加入当前句子后的总长度(加1是留空格的位置) proposed_length = len(current_chunk) + len(sentence) + 1 if proposed_length <= max_char_limit: # 还能塞,就加进当前分段 current_chunk += f"{sentence} " else: # 当前分段满了,先存起来 if current_chunk: chunks.append(current_chunk.strip()) # 特殊情况:单个句子就超过阈值了(比如超长专业术语或无标点长句) if len(sentence) > max_char_limit: # 退而求其次,用逗号、分号这类次一级标点拆分 sub_chunks = re.split(r'(?<=,|;)\s', sentence) sub_current = "" for sub in sub_chunks: sub_proposed = len(sub_current) + len(sub) + 1 if sub_proposed <= max_char_limit: sub_current += f"{sub} " else: if sub_current: chunks.append(sub_current.strip()) sub_current = f"{sub} " if sub_current: chunks.append(sub_current.strip()) else: # 单个句子没超,直接作为新分段的开头 current_chunk = f"{sentence} " # 把最后一个没完成的分段加进去 if current_chunk: chunks.append(current_chunk.strip()) return chunks
4. 特殊场景兜底
- 超长句子:如果遇到单个句子就远超API限制的情况(比如某些学术文献里的长句),只能用逗号、分号这类语义停顿点拆分,尽量保证拆分后的片段语义完整。
- 多语言适配:如果是中文、日文这类非拉丁语系,只要调整句子边界的正则表达式,匹配对应语言的句末标点即可。
验证小技巧
拿到分段列表后,先逐个检查每个分段的字符数是否符合API限制,然后挑几个分段去调用翻译API测试,看翻译结果是否连贯,有没有出现句子被拆断的情况。
内容的提问来源于stack exchange,提问作者Nikita Popov
相关产品推荐
相关产品推荐

