Python實現(xiàn)文檔精準分句并調用模型進行預翻譯
一、問題的來源
計算機輔助翻譯CAT工具通常會把導入的文件如Docx文件進行分句,形成左右照的表格形式,再調用翻譯記憶庫、機器翻譯或者大模型進行預翻譯,譯者根據(jù)術語庫、預翻譯結果進行譯后編輯。
我一直想在Python中模擬這個過程,但是受限于分句工具NLTK工具箱中的sent_tokenize不夠準確,經(jīng)常把Mr. Washington D.C.中的句點分割成句子,造成分句結果十分不理想。
二、問題的解決
最近,我發(fā)現(xiàn)一個可以精準分句的模塊。由開源社區(qū)出品PySBD模塊可以處理縮寫和多語言文本,精確識別句子的結束位置,為實現(xiàn)精準的句子分割提供了現(xiàn)成的“輪子”??聪旅娴睦?,PySBD很好地識別出了句子結尾的位置,并把字符串精準分割句子列表,為后續(xù)的預翻譯奠定了基礎。
import pysbd
seg = pysbd.Segmenter(language="en", clean=True)
print(seg.segment("Dr. Smith went to Washington. It rained."))
# ['Dr. Smith went to Washington.', 'It rained.']三、問題的延伸
有了準確分句的支持,下一步就可以利用Python調用python-docx模塊讀取要翻譯的文件,分割句子,然后調用機器翻譯API或者大模型進行逐句翻譯,并寫入到新文件中。為了保持原有的段落格式,還要對段落進行標記,以便將預翻譯和譯后編輯的雙語文本進行還原,以便進行段對段的校核。
1. 定義翻譯函數(shù)
為了更好地維護代碼,我們利用小牛機器翻譯定義一個翻譯模塊,可以在主程序中進行調用,代碼如下:
# niutrans.py
import json
import requests
class Translator:
def __init__(self, apikey="Your API"): #錄入你的翻譯API
self.apikey = apikey
self.url = 'http://api.niutrans.com/NiuTransServer/translation'
def translate(self, sentence, src_lan="auto", tgt_lan="zh"):
data = {"from": src_lan, "to": tgt_lan, "apikey": self.apikey, "src_text": sentence}
res = requests.post(self.url, data=data)
res_dict = json.loads(res.text)
if "tgt_text" in res_dict:
result = res_dict['tgt_text']
else:
result = res.text
return result
def translate(sentence, src_lan, tgt_lan, apikey="Your API"):
"""便捷函數(shù),直接調用翻譯"""
translator = Translator(apikey)
return translator.translate(sentence, src_lan, tgt_lan)
if __name__ == "__main__":
while True:
line = input("請輸入要翻譯的文本:")
try:
trans = translate(line, 'auto', 'en')
print(trans)
except Exception as exc:
print(exc)在DeepSeek的輔助下,我們輕松定義這個翻譯模塊,可以使用當前代碼或在另一個test.py文件中輸入以下代碼進行測試。調用上述模塊的方法有三種,代碼如下所示:
# 方式1:使用便捷函數(shù)
from niutrans import translate
result = translate("你好", "auto", "en")
print(result)
# 方式2:使用Translator類
from niutrans import Translator
translator = Translator()
result = translator.translate("你好", "auto", "en")
print(result)
# 方式3:使用自定義API密鑰
from niutrans import Translator
translator = Translator(apikey="d99fc0600b16efa6e310f53579593c57")
result = translator.translate("你好", "auto", "en")
print(result)2. 編寫主程序
主要執(zhí)行讀取要翻譯的文件,記錄段落信息,生成段落字符串組成的列表。然后,利用pysbd按照段落來分割句子,并存儲在列表當中。最后逐句翻譯后,生成英漢句級對照的文本,為譯后編輯提供便利。
為了方便測試,DeepSeek還輔助生成了一個測試的函數(shù)。對于可能存在的錯誤信息也進行了及時的反饋。
import pysbd
from docx import Document
from niutrans import Translator
import re
class DocxSentenceProcessor:
def __init__(self, language="en", clean=True):
self.segmenter = pysbd.Segmenter(language=language, clean=clean)
self.translator = Translator()
def read_docx(self, file_path):
"""讀取DOCX文件內(nèi)容"""
doc = Document(file_path)
content = []
for i, paragraph in enumerate(doc.paragraphs):
if paragraph.text.strip(): # 忽略空段落
content.append({
'paragraph_id': i,
'original_text': paragraph.text,
'sentences': []
})
return content
def segment_sentences(self, text):
"""切分句子"""
return self.segmenter.segment(text)
def translate_sentence(self, sentence, dest_language='zh'):
"""翻譯句子"""
try:
translation = self.translator.translate(sentence, "auto", dest_language)
return translation # 直接返回翻譯結果,因為新版本返回的是字符串
except Exception as e:
print(f"翻譯錯誤: {e}")
return f"[翻譯失敗] {sentence}"
def process_docx(self, input_file, output_file, dest_language='zh'):
"""處理DOCX文件:切分句子并翻譯"""
# 讀取原始文檔
paragraphs = self.read_docx(input_file)
# 處理每個段落
for para in paragraphs:
if para['original_text']:
# 切分句子
sentences = self.segment_sentences(para['original_text'])
# 對每個句子進行翻譯
for i, sentence in enumerate(sentences):
if sentence.strip(): # 忽略空句子
translated = self.translate_sentence(sentence.strip(), dest_language)
para['sentences'].append({
'sentence_id': i,
'original': sentence.strip(),
'translated': translated
})
# 保存處理后的文檔
self.save_processed_docx(paragraphs, output_file)
return paragraphs
def save_processed_docx(self, paragraphs, output_file):
"""保存處理后的DOCX文件(逐句對照)"""
doc = Document()
for para in paragraphs:
if para['sentences']:
# 添加段落標簽
p = doc.add_paragraph()
p.add_run(f"[段落{para['paragraph_id']+1}] ").bold = True
# 添加逐句照內(nèi)容
for sentence_data in para['sentences']:
p = doc.add_paragraph()
p.add_run(f"[{sentence_data['sentence_id']+1}] ")
p.add_run(sentence_data['original'])
p = doc.add_paragraph()
p.add_run(sentence_data['translated'])
p.add_run(" ")
doc.save(output_file)
print(f"處理后的文檔已保存為: {output_file}")
def restore_bilingual_docx(self, processed_paragraphs, output_file):
"""恢復為雙語對照格式的DOCX(用換行分割)"""
doc = Document()
for para in processed_paragraphs:
if para['sentences']:
# 添加段落標簽
p_label = doc.add_paragraph()
p_label.add_run(f"[段落{para['paragraph_id']+1}]").bold = True
# 逐句添加雙語對照,用換行分割
for sentence_data in para['sentences']:
# 英文句子
p_en = doc.add_paragraph()
p_en.add_run(f"[{sentence_data['sentence_id']+1}] ").bold = True
p_en.add_run(sentence_data['original'])
# 中文翻譯(換行)
p_zh = doc.add_paragraph()
p_zh.add_run(" " * 4) # 縮進
p_zh.add_run(sentence_data['translated'])
# 添加空行分隔段落
doc.add_paragraph()
doc.save(output_file)
print(f"雙語對照文檔已保存為: {output_file}")
def restore_bilingual_compact(self, processed_paragraphs, output_file):
"""恢復為緊湊雙語對照格式(段落級別換行)"""
doc = Document()
for para in processed_paragraphs:
if para['sentences']:
# 添加段落標簽
# p_label = doc.add_paragraph()
# p_label.add_run(f"[段落{para['paragraph_id']+1}]").bold = True
# 英文段落
p_en = doc.add_paragraph()
p_en.add_run("EN: ").bold = True
for sentence_data in para['sentences']:
p_en.add_run(f"[{sentence_data['sentence_id']+1}] {sentence_data['original']} ")
# 中文段落(換行)
p_zh = doc.add_paragraph()
p_zh.add_run("CN: ").bold = True
for sentence_data in para['sentences']:
p_zh.add_run(f"[{sentence_data['sentence_id']+1}] {sentence_data['translated']} ")
# 添加空行分隔
doc.add_paragraph()
doc.save(output_file)
print(f"緊湊雙語對照文檔已保存為: {output_file}")
# 使用示例
def main():
# 初始化處理器
processor = DocxSentenceProcessor()
# 處理DOCX文件
input_file = "input.docx"
output_file = "processed_output.docx"
bilingual_file = "bilingual_output.docx"
bilingual_compact_file = "bilingual_compact_output.docx"
try:
# 處理文檔:切分句子并翻譯
processed_data = processor.process_docx(input_file, output_file)
# 恢復為雙語對照格式(逐句換行)
processor.restore_bilingual_docx(processed_data, bilingual_file)
# 恢復為緊湊雙語對照格式(段落級別換行)
processor.restore_bilingual_compact(processed_data, bilingual_compact_file)
# 打印處理結果示例
print("\n=== 處理結果示例 ===")
for para in processed_data[:2]: # 顯示前2個段落
print(f"\n段落 {para['paragraph_id']+1}:")
for sentence in para['sentences'][:3]: # 顯示前3個句子
print(f" [{sentence['sentence_id']+1}] EN: {sentence['original']}")
print(f" CN: {sentence['translated']}")
print() # 換行分割
except FileNotFoundError:
print(f"錯誤: 找不到輸入文件 {input_file}")
print("正在創(chuàng)建示例文件...")
create_sample_docx(input_file)
if __name__ == "__main__":
# 運行測試
test_sentence_segmentation()
print("\n" + "="*50 + "\n")
# 運行主程序
main()最終用一百多行代碼實現(xiàn)了文檔讀取、分句、翻譯、存儲的整個過程,模擬了普通CAT工具從導入文件——分句——預翻譯——導出雙語文本。
3. 進階優(yōu)化
由于Python代碼十分靈活,還可以定制個性化的翻譯引擎,如調用DeepSeek的API實現(xiàn)句子翻譯。而且只需要把niutrans.py中的內(nèi)容替換成調用DeepSeek API的代碼就可以了。
先在DeepSeek官方文檔中找到調用的樣例代碼:
# Please install OpenAI SDK first: `pip3 install openai`
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ.get('DEEPSEEK_API_KEY'),
base_url="https://api.deepseek.com")
response = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "system", "content": "You are a helpful assistant"},
{"role": "user", "content": "Hello"},
],
stream=False
)
print(response.choices[0].message.content)然后,讓DeepSeek模仿之前調用小牛機器翻譯niutrans.py的代碼,生成一個可以調用的模塊:deepseek_translator.py
# deepseek_translator.py
import os
from openai import OpenAI
class DeepSeekTranslator:
def __init__(self, api_key=None, base_url="https://api.deepseek.com", model="deepseek-chat"):
"""
初始化DeepSeek翻譯器
Args:
api_key: API密鑰,如果為None則從環(huán)境變量DEEPSEEK_API_KEY獲取
base_url: API基礎URL
model: 使用的模型
"""
self.api_key = api_key or os.environ.get('DEEPSEEK_API_KEY')
if not self.api_key:
raise ValueError("未提供API密鑰,請設置api_key參數(shù)或DEEPSEEK_API_KEY環(huán)境變量")
self.client = OpenAI(
api_key=self.api_key,
base_url=base_url
)
self.model = model
def translate(self, text, target_language="中文", source_language="自動檢測"):
"""
翻譯文本
Args:
text: 要翻譯的文本
target_language: 目標語言,默認為中文
source_language: 源語言,默認為自動檢測
Returns:
str: 翻譯結果
"""
system_prompt = f"""你是一名專業(yè)的翻譯助手。請將文本從{source_language}翻譯成{target_language}。
翻譯要求:
1. 準確傳達原文意思
2. 保持語言流暢自然
3. 符合目標語言的表達習慣
4. 保留專業(yè)術語和名稱
5. 不要添加額外解釋或評論
只需返回翻譯結果,不需要其他內(nèi)容。"""
try:
response = self.client.chat.completions.create(
model=self.model,
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": text},
],
stream=False,
temperature=0.3 # 較低的溫度使輸出更穩(wěn)定
)
return response.choices[0].message.content.strip()
except Exception as e:
print(f"翻譯錯誤: {e}")
return f"[翻譯失敗] {text}"
def batch_translate(self, texts, target_language="中文", source_language="自動檢測"):
"""
批量翻譯文本
Args:
texts: 文本列表
target_language: 目標語言
source_language: 源語言
Returns:
list: 翻譯結果列表
"""
results = []
for i, text in enumerate(texts):
print(f"翻譯進度: {i+1}/{len(texts)}")
result = self.translate(text, target_language, source_language)
results.append(result)
return results
# 便捷函數(shù)
def translate(text, target_language="中文", source_language="自動檢測", api_key=None):
"""便捷翻譯函數(shù)"""
translator = DeepSeekTranslator(api_key=api_key)
return translator.translate(text, target_language, source_language)
# 測試代碼
if __name__ == "__main__":
# 測試翻譯
try:
translator = DeepSeekTranslator()
# 單句翻譯測試
test_text = "Hello, how are you today? I hope you're doing well."
result = translator.translate(test_text, "中文", "英語")
print(f"原文: {test_text}")
print(f"翻譯: {result}")
print("-" * 50)
# 批量翻譯測試
test_texts = [
"Good morning!",
"What is your name?",
"I love programming and artificial intelligence."
]
results = translator.batch_translate(test_texts, "中文", "英語")
for original, translated in zip(test_texts, results):
print(f"原文: {original}")
print(f"翻譯: {translated}")
print()
except ValueError as e:
print(f"初始化錯誤: {e}")
print("請設置DEEPSEEK_API_KEY環(huán)境變量或提供api_key參數(shù)")
except Exception as e:
print(f"測試錯誤: {e}")其調用的方式如下:
# 方式1:使用環(huán)境變量中的API密鑰
from deepseek_translator import DeepSeekTranslator
translator = DeepSeekTranslator()
result = translator.translate("Hello, world!", "中文", "英語")
print(result)
# 方式2:直接傳遞API密鑰
from deepseek_translator import DeepSeekTranslator
translator = DeepSeekTranslator(api_key="your_api_key_here")
result = translator.translate("Hello, world!", "中文", "英語")
print(result)
# 方式3:使用便捷函數(shù)
from deepseek_translator import translate
result = translate("Hello, world!", "中文", "英語")
print(result)
# 方式4:批量翻譯
from deepseek_translator import DeepSeekTranslator
translator = DeepSeekTranslator()
texts = ["First sentence.", "Second sentence.", "Third sentence."]
results = translator.batch_translate(texts, "中文", "英語")
for original, translated in zip(texts, results):
print(f"{original} -> {translated}")將上面改造的DeepSeek翻譯函數(shù)融合到文檔翻譯當中就可以了:
# 在DocxSentenceProcessor中使用DeepSeek翻譯器
from deepseek_translator import DeepSeekTranslator
class DocxSentenceProcessor:
def __init__(self, language="en", clean=True, translator_type="deepseek"):
self.segmenter = pysbd.Segmenter(language=language, clean=clean)
if translator_type == "deepseek":
self.translator = DeepSeekTranslator()
else:
from niutrans import Translator
self.translator = Translator()
def translate_sentence(self, sentence, dest_language='中文'):
"""翻譯句子"""
try:
if hasattr(self.translator, 'translate'):
# DeepSeek翻譯器
translation = self.translator.translate(sentence, dest_language)
else:
# 小牛翻譯器
translation = self.translator.translate(sentence, "auto", dest_language)
return translation
except Exception as e:
print(f"翻譯錯誤: {e}")
return f"[翻譯失敗] {sentence}"
# 其它內(nèi)容不變。四、生成的文件展示
生成的processed_output.docx文件當中可以看出清楚地標明了段醫(yī)學,并進行了準確分句,每句句前都有序號標記,對于譯者進行譯后編輯也十分友好。

五、學后的總結
本案例基于Python開發(fā)了一套計算機輔助翻譯流程,實現(xiàn)了文檔導入、智能分句、機器翻譯/DeepSeek大模型調用及句級對齊的全自動化處理。該方案具有個性化程度高、靈活性強、成本低廉等突出優(yōu)勢,有效解決了傳統(tǒng)CAT工具無法調用大模型或使用成本過高的問題,使譯者無需依賴專業(yè)CAT軟件,在WPS或Word中即可直接進行譯后編輯。目前該方案的主要局限在于格式標簽保持方面存在一定難度,對復雜排版文檔的支持尚不完善,且暫不支持PDF格式文檔的處理。
后續(xù)還可以持續(xù)優(yōu)化,增加UI界面,提供批量翻譯,支持術語庫支持和質量檢測功能。
當前,人工智能技術日新月異,大模型輔助編程的能力日益強大。在掌握基礎語法和程序邏輯的前提下,我們能夠借助大模型實現(xiàn)文本處理與翻譯流程的自動化,從而充分發(fā)揮Python作為“編程瑞士軍刀”的強大功能,有效提升翻譯工作的效率與質量。
以上就是Python實現(xiàn)文檔精準分句并調用模型進行預翻譯的詳細內(nèi)容,更多關于Python文檔分句與翻譯的資料請關注腳本之家其它相關文章!
相關文章
python實現(xiàn)上傳文件到linux指定目錄的方法
這篇文章主要介紹了python實現(xiàn)上傳文件到linux指定目錄的方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-01-01
Keras實現(xiàn)Vision?Transformer?VIT模型示例詳解
這篇文章主要為大家介紹了Keras實現(xiàn)Vision?Transformer?VIT模型示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05
Python數(shù)據(jù)結構與算法之字典樹實現(xiàn)方法示例
這篇文章主要介紹了Python數(shù)據(jù)結構與算法之字典樹實現(xiàn)方法,可實現(xiàn)針對單詞出現(xiàn)次數(shù)的統(tǒng)計功能,涉及Python樹結構的定義、遍歷及統(tǒng)計等相關操作技巧,需要的朋友可以參考下2017-12-12

