?? 作者:韓信子@ShowMeAI
?? 深度學習實戰系列:https://www.showmeai.tech/tutorials/42
?? 自然語言處理實戰系列:https://www.showmeai.tech/tutorials/45
?? 本文地址:https://showmeai.tech/article-detail/399
?? 宣告:著作權所有,轉載請聯系平臺與作者并注明出處
?? 收藏ShowMeAI查看更多精彩內容
自然語言處理(NLP)技術可以完成文本資料上的分析挖掘,并應用到各種業務當中,例如:
- 機器翻譯(Machine Translation),接收一種語言的輸入文本并回傳目標語言的輸出文本(包含同樣的含義),
- 情感分析(Sentiment Analysis),接收文本資料,判定文本是正面的、負面的還是中性的等,
- 文本摘要(Text Summarization),接收文本輸入并將它們總結為更精煉的文本語言輸出,
輸入文本的質量會很大程度影響這些業務場景的模型效果,因此,在這些文本資料到達機器翻譯、情感分析、文本摘要等下游任務之前,我們要盡量保證輸入文本資料的語法正確性,
語法糾錯(Grammatical Error Correction)是一個有非常廣泛使用的應用場景,有2種典型的模型方法:
- ① 序列到序列(seq2seq)模型:它最早被使用在機器翻譯引擎中,將給定語言翻譯成同一種語言,這種映射方法同樣可以用來做語法糾錯(例如??Yuan 和 Briscoe,2014),
- ② 序列標注模型:輸入文本被標注然后映射回更正的內容(例如??Malmi 等人,2019),
雖然 seq2seq 神經機器翻譯方法已被證明可以實作最先進的性能(例如??Vaswani 等人,2017 年),但它仍然存在某些缺點,例如:1)推理和生成輸出需要很長時間;2)訓練需要大量資料;3)與非神經架構相比,模型的神經架構使得對結果的解釋具有挑戰性(例如??Omelianchuk 等人,2020 年)等,為了克服這些缺點,我們在本文中討論并應用更新的方法:使用 Transformer 編碼器的序列標注器,
??Omelianchuk, et al., 2020 中提出的 ??GECToR 模型,是非常優秀的文本糾錯模型,它對 Transformer seq2seq 進行微調,Transformer 的引入極大改善了 seq2seq 模型的推理時間問題,并且可以在較小的訓練資料的情況下實作更好的效果,
在后續的內容中,ShowMeAI將演示使用這個庫來實作糾正給定句子中語法錯誤的方案,我們還會創建一個可視化用戶界面來將這個AI應用產品化,
?? 語法糾錯代碼全實作
整個語法糾錯代碼實作包含3個核心步驟板塊:
- 準備作業:此步驟包括工具庫設定、下載預訓練模型、環境配置,
- 模型實踐:實作并測驗語法糾錯模型,
- 用戶界面:創建用戶界面以產品化和提高用戶體驗
?? 準備作業
我們先使用以下命令將 GitHub 中的代碼復制到我們本地,這是 GECToR 模型對應的實作:
git clone https://github.com/grammarly/gector.git
GECToR 提供了3種預訓練模型,我們在這里使用 ??RoBERTa 作為預訓練編碼器的模型,它在現有模型中具有最高總分最好的表現,我們使用以下命令下載預訓練模型:
wget https://grammarly-nlp-data-public.s3.amazonaws.com/gector/roberta_1_gectorv2.th
下載完畢后,我們把下載的模型權重移動到gector目錄,以便后續使用:
mv roberta_1_gectorv2.th ./gector/gector
接下來,我們切換到gector檔案夾下:
cd ./gector
gector對其他工具庫有依賴,因此我們將使用以下命令安裝這些依賴:
pip install -r requirements.txt
?? 模型實踐
現在我們已經做好所有準備作業了,可以開始使用工具庫,總共有下述步驟:
- 匯入工具包
- 構建模型實體
- 在有語法錯誤的句子上測驗模型,以查看輸出
① she are looking at sky
為此,我們將使用以下句子『she are looking at sky』,
# 匯入工具庫
from gector.gec_model import GecBERTModel
# 構建模型實體
model = GecBERTModel(vocab_path = "./data/output_vocabulary", model_paths = ["./gector/roberta_1_gectorv2.th"])
# 需要糾錯的句子
sent = 'she are looking at sky'
# 存盤處理結果
batch = []
batch.append(sent.split())
final_batch, total_updates = model.handle_batch(batch)
updated_sent = " ".join(final_batch[0])
print(f"Original Sentence: {sent}\n")
print(f"Updated Sentence: {updated_sent}")
結果:
模型的糾錯結果非常準確!有以下變化:
- 句首將
she大寫為She - 將
are更改為is,以使she和is主謂一致 - 在
sky之前添加the - 在句子末尾加句號
.
② she looks at sky yesterday whil brushed her hair
剛才的句子語法比較簡單,讓我們看看復雜場景,比如混合時態下模型的表現如何,
# 添加復雜句子
sent = 'she looks at sky yesterday whil brushed her hair'
# 存盤糾錯后的句子
batch = []
batch.append(sent.split())
final_batch, total_updates = model.handle_batch(batch)
updated_sent = " ".join(final_batch[0])
print(f"Original Sentence: {sent}\n")
print(f"Updated Sentence: {updated_sent}")
結果:
在這個句子中我們來看一下糾錯模型做了什么:
- 句首將
she大寫為She - 將
looks改為looked,與yesterday一致 - 在
sky之前添加the - 將缺失的字母添加到
while - 將
brushed改為brushing,這是while之后的正確格式
不過這里有一點大家要注意,模型的另外一種糾錯方式是將yesterday更改為today,對應的時態就不需要用過去式,但這里模型決定使用過去時態,
③ she was looking at sky later today whil brushed her hair
現在讓我們再看一個例子:
# 添加復雜句子
sent = 'she was looking at sky later today whil brushed her hair'
# 糾錯及存盤
batch = []
batch.append(sent.split())
final_batch, total_updates = model.handle_batch(batch)
updated_sent = " ".join(final_batch[0])
print(f"Original Sentence: {sent}\n")
print(f"Updated Sentence: {updated_sent}")
結果:
我們發現了一種邊緣情況,在這種情況下,模型無法識別正確的動詞時態,更新后的句子是『She was looking at the sky later today while brushing her hair』,我們讀下來感覺這句是將來時(今天晚點),而模型糾正后的句子是過去時,
我們想一想,為什么這句對模型比以前更具挑戰性呢?答案是later today用兩個詞暗示時間,這需要模型具有更深層次的背景關系意識,如果沒有later這個詞,我們會有一個完全可以接受的句子,如下所示:
在這種情況下,today可能指的是今天早些時候(即過去),糾錯后的語法完全可以接受,但在原始示例中,模型未將later today識別為表示將來時態,
?? 用戶界面
在下一步,我們將制作一個web界面,通過用戶界面把它產品化并改善用戶體驗:
# 創建一個函式,對于輸入的句子進行語法糾錯并回傳結果
def correct_grammar(sent):
batch = []
batch.append(sent.split())
final_batch, total_updates = model.handle_batch(batch)
updated_sent = " ".join(final_batch[0])
return updated_sent
我們找一個句子測驗這個函式,確保它能正常作業和輸出結果,
sent = 'she looks at sky yesterday whil brushed her hair'
print(f"Original Sentence: {sent}\n")
print(f"Updated Sentence: {correct_grammar(sent = sent)}")
結果:
接下來我們將添加一個可視化用戶界面,我們使用 ??Gradio 來完成這個環節,它是一個開源 Python 工具庫,可以快捷創建 Web 應用程式,如下所示,
# 在命令列運行以安裝gradio
pip install gradio
安裝Gradio后,我們繼續匯入和創建用戶界面,如下所示:
# 匯入Gradio
import gradio as gr
# 構建一個demo實體
demo = gr.Interface(fn = correct_grammar, inputs = gr.Textbox(lines = 1, placeholder = 'Add your sentence here!'), outputs = 'text')
# 啟動demo
demo.launch()
結果我們得到如下的界面:
我們可以在 web 界面中再次測驗我們的句子啦!我們只需在左側的框中鍵入待糾錯的句子,然后按 Submit(提交),接錯后的結果將顯示在右側的框中,如下所示:
非常順利,你也快來測驗一下吧!
?? 總結
在這篇文章中,我們實踐了語法糾錯模型,我們使用公開可用的 GECToR 庫來實作一個預訓練的語法糾錯模型,在一些錯誤的句子上對其進行測驗,發現該模型的適用場景和局限性(需要提高的地方),最后我們構建了一個可視化界面把文本糾錯產品化,
參考資料
- ?? Grammatical error correction using neural machine translation:https://aclanthology.org/N16-1042/
- ?? Encode, Tag, Realize: High-Precision Text Editing:https://aclanthology.org/D19-1510/
- ?? Attention Is All You Need:https://arxiv.org/abs/1706.03762
- ?? GECToR – Grammatical Error Correction: Tag, Not Rewrite:https://aclanthology.org/2020.bea-1.16/
- ?? GECToR模型的GitHub頁面:https://github.com/grammarly/gector
- ?? RoBERTa的GitHub頁面:https://github.com/facebookresearch/fairseq/blob/main/examples/roberta/README.md
- ?? Gradio的GitHub頁面:https://github.com/gradio-app/gradio
推薦閱讀
- ?? 資料分析實戰系列 :https://www.showmeai.tech/tutorials/40
- ?? 機器學習資料分析實戰系列:https://www.showmeai.tech/tutorials/41
- ?? 深度學習資料分析實戰系列:https://www.showmeai.tech/tutorials/42
- ?? TensorFlow資料分析實戰系列:https://www.showmeai.tech/tutorials/43
- ?? PyTorch資料分析實戰系列:https://www.showmeai.tech/tutorials/44
- ?? NLP實戰資料分析實戰系列:https://www.showmeai.tech/tutorials/45
- ?? CV實戰資料分析實戰系列:https://www.showmeai.tech/tutorials/46
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/538839.html
標籤:其他
上一篇:AI繪畫提示詞創作指南:DALL·E 2、Midjourney和 Stable Diffusion最全大比拼 ?
下一篇:深度學習-第三章概率與資訊論
