🚀 句子修復模型(Sentence-Doctor)
句子修復模型(Sentence-Doctor)是一個基於T5架構的模型,旨在糾正句子中存在的錯誤。該模型可處理英文、德文和法文文本。
🚀 快速開始
問題描述
許多自然語言處理(NLP)模型依賴於諸如“文本提取庫”、“光學字符識別(OCR)”、“語音轉文本庫”以及“句子邊界檢測”等任務。因此,NLP流程中這些任務產生的錯誤會影響應用中模型的質量,尤其是因為模型通常是在“乾淨”的輸入數據上進行訓練的。
解決方案
我們提供了一個模型,該模型嘗試根據句子的上下文(周圍文本)來重構句子。任務非常直接:
給定一個“有錯誤”的句子及其上下文,重構出“預期”的句子
。
使用場景
- 嘗試修復通過OCR軟件或文本提取器提取的有噪聲的句子。
- 嘗試修復句子邊界。
- 示例(德文):輸入:"und ich bin im"
- 前綴上下文:"Hallo! Mein Name ist John",後綴上下文:"Januar 1990 geboren."
- 輸出:"John und ich bin im Jahr 1990 geboren"
- 可能用於句子級別的拼寫糾正 —— 儘管這並非該模型的主要用途。
- 輸入:"I went to church las yesteday" => 輸出:"I went to church last Sunday"
免責聲明
請注意,我們一直強調“嘗試”這個詞。當前版本的模型僅在來自Tatoeba數據集(https://tatoeba.org/eng )的150K個句子上進行了訓練(每種語言50K個句子,包括英文、法文和德文)。因此,我們強烈建議你在自己的數據集上對該模型進行微調。我們可能會發佈一個在更多數據上訓練的版本。
數據集
我們從Tatoeba數據集(https://tatoeba.org/eng )生成了合成數據,基於一定的概率對單詞和字符隨機應用不同的變換。數據集可在data
文件夾中找到,其中sentence_doctor_dataset_300K是一個更大的數據集,每種語言包含100K個句子。
使用方法
預處理
假設我們有以下文本(注意文本中沒有標點符號):
text = "That is my job I am a medical doctor I save lives"
你決定提取句子,由於某些原因,你得到了以下句子:
sentences = ["That is my job I a", "m a medical doct", "I save lives"]
現在你希望糾正句子**"m a medical doct"**。
模型的單個預處理步驟如下:
input_text = "repair_sentence: " + sentences[1] + " context: {" + sentences[0] + "}{" + sentences[2] + "} </s>"
解釋:
- 我們通過前綴 "repair_sentence: " 告訴模型要修復句子。
- 然後添加我們要修復的句子sentence[1],即 "m a medical doct"。
- 接下來,我們為模型提供一些上下文。在這種情況下,上下文是原始文本中句子之前和之後出現的一些文本。
- 為此,我們添加關鍵字 "context :"。
- 添加**{sentence[0]}** "{That is my job I a}"(注意它被花括號包圍)。
- 添加**{sentence[2]}** "{I save lives}"。
- 最後,我們用 告訴模型這是輸入的結束。
print(input_text)
上下文是可選的,因此輸入也可以是 repair_sentence: m a medical doct context: {}{} </s>
推理
from transformers import AutoTokenizer, AutoModelWithLMHead
tokenizer = AutoTokenizer.from_pretrained("flexudy/t5-base-multi-sentence-doctor")
model = AutoModelWithLMHead.from_pretrained("flexudy/t5-base-multi-sentence-doctor")
input_text = "repair_sentence: m a medical doct context: {That is my job I a}{or I save lives} </s>"
input_ids = tokenizer.encode(input_text, return_tensors="pt")
outputs = model.generate(input_ids, max_length=32, num_beams=1)
sentence = tokenizer.decode(outputs[0], skip_special_tokens=True, clean_up_tokenization_spaces=True)
assert sentence == "I am a medical doctor."
微調
我們還提供了一個腳本 train_any_t5_task.py
,它可以幫助你使用T5模型對任何文本到文本的任務進行微調。我們在代碼中添加了 "#TODO" 註釋,以幫助你輕鬆進行訓練。例如:
config.TRAIN_EPOCHS = 3
如果你不想閱讀 "#TODO" 註釋,只需像這樣傳入你的數據:
trainer.start("data/sentence_doctor_dataset_300.csv")
就這麼簡單!請隨時糾正代碼中的任何錯誤並提交拉取請求。
📄 致謝
- 感謝 Huggingface 的Transformer庫,讓這個項目成為可能。
- 感謝Abhishek Kumar Mishra關於文本摘要的Transformer 教程。我們的訓練代碼只是他們代碼的修改版本,非常感謝。
- 我們從Hugging Face Hub上的WikinewsSum/t5-base-multi-combine-wiki-news模型進行微調。感謝 作者。
- 我們還參考了 Suraj Patil 的許多工作。
- 希望沒有遺漏任何人😊