优化翻译的逻辑
This commit is contained in:
+59
-8
@@ -1,57 +1,108 @@
|
||||
import translators as ts
|
||||
import re
|
||||
|
||||
# 输入长度限制
|
||||
INPUT_LIMIT = 1000
|
||||
|
||||
def split_text_for_translation(text):
|
||||
"""
|
||||
按段落和完整句子拆分文本,返回句子列表(保持原有段落结构)。
|
||||
"""
|
||||
paragraphs = text.split('\n')
|
||||
split_paragraphs = []
|
||||
# 句子分隔符:句号、问号、感叹号(中英文)
|
||||
sentence_pattern = re.compile(r'([^。!?!?\r\n]+[。!?!?])', re.M)
|
||||
# 句子分隔符:句号、问号、感叹号(英文和中文)
|
||||
sentence_pattern = re.compile(r'([^.!?。!?]+[.!?。!?])', re.M)
|
||||
|
||||
for para in paragraphs:
|
||||
if not para.strip():
|
||||
split_paragraphs.append([''])
|
||||
continue
|
||||
|
||||
# 如果段落长度小于INPUT_LIMIT,直接添加
|
||||
if len(para) < INPUT_LIMIT:
|
||||
split_paragraphs.append([para])
|
||||
continue
|
||||
|
||||
# 分割句子
|
||||
sentences = sentence_pattern.findall(para)
|
||||
# 若正则未能分出句子,则整体作为一句
|
||||
|
||||
# 若正则未能分出句子,则按照INPUT_LIMIT拆分
|
||||
if not sentences:
|
||||
sentences = [para]
|
||||
split_paragraphs.append(sentences)
|
||||
sentences = [para[i:i+INPUT_LIMIT] for i in range(0, len(para), INPUT_LIMIT)]
|
||||
|
||||
# 组合句子的逻辑
|
||||
optimized_sentences = []
|
||||
current_group = []
|
||||
current_length = 0
|
||||
|
||||
for sent in sentences:
|
||||
# 计算当前句子长度
|
||||
sent_length = len(sent)
|
||||
|
||||
# 如果加入这个句子后总长度小于INPUT_LIMIT,则加入
|
||||
if current_length + sent_length < INPUT_LIMIT:
|
||||
current_group.append(sent)
|
||||
current_length += sent_length
|
||||
else:
|
||||
# 如果当前组不为空,先保存当前组
|
||||
if current_group:
|
||||
optimized_sentences.append(''.join(current_group))
|
||||
|
||||
# 重置组
|
||||
current_group = [sent]
|
||||
current_length = sent_length
|
||||
|
||||
# 添加最后一组
|
||||
if current_group:
|
||||
optimized_sentences.append(''.join(current_group))
|
||||
|
||||
split_paragraphs.append(optimized_sentences)
|
||||
|
||||
return split_paragraphs
|
||||
|
||||
def translate_text(text, to_lang='zh'):
|
||||
def translate_text(text, from_lang='en', to_lang='zh'):
|
||||
"""
|
||||
自动处理长文本,按段落和句子拆分,逐句翻译,组合返回。
|
||||
对于短文本,直接翻译。
|
||||
"""
|
||||
if not text:
|
||||
return ""
|
||||
|
||||
try:
|
||||
# 如果整个文本长度小于INPUT_LIMIT,直接翻译
|
||||
if len(text) < INPUT_LIMIT:
|
||||
return ts.translate_text(text, translator='bing', from_language=from_lang, to_language=to_lang)
|
||||
|
||||
# 拆分文本为段落和句子
|
||||
split_paragraphs = split_text_for_translation(text)
|
||||
|
||||
translated_paragraphs = []
|
||||
|
||||
for sentences in split_paragraphs:
|
||||
if sentences == ['']:
|
||||
translated_paragraphs.append('')
|
||||
continue
|
||||
|
||||
translated_sentences = []
|
||||
for sent in sentences:
|
||||
sent = sent.strip()
|
||||
if not sent:
|
||||
continue
|
||||
# 逐句翻译
|
||||
translated = ts.translate_text(sent, translator='bing', from_language='auto', to_language=to_lang)
|
||||
translated = ts.translate_text(sent, translator='bing', from_language=from_lang, to_language=to_lang)
|
||||
translated_sentences.append(translated)
|
||||
translated_paragraphs.append(''.join(translated_sentences))
|
||||
|
||||
return '\n'.join(translated_paragraphs)
|
||||
except Exception as e:
|
||||
return f"[翻译失败] {str(e)}"
|
||||
|
||||
|
||||
def translate_texts(strings, target_language):
|
||||
translated_strings = []
|
||||
for text in strings:
|
||||
try:
|
||||
translated_string = translate_text(text, target_language)
|
||||
translated_string = translate_text(text, 'auto', target_language)
|
||||
translated_strings.append(translated_string)
|
||||
except Exception as e:
|
||||
translated_strings.append(f"Translation error: {str(e)}")
|
||||
|
||||
Reference in New Issue
Block a user