NLP实践!文本语法纠错模型实战,搭建你的贴身语法修改小助手 ⛵
  • 作者:韩信子@ShowMeAI
  • 深度学习实战系列:www.showmeai.tech/tutorials/4…
  • 自然言语处理实战系列:www.showmeai.tech/tutorials/4…
  • 本文地址:showmeai.tech/article-det…
  • 声明:版权所有,转载请联络平台与作者并注明出处
  • 收藏ShowMeAI检查更多精彩内容
NLP实践!文本语法纠错模型实战,搭建你的贴身语法修改小助手 ⛵

自然言语处理(NLP)技术能够完结文本数据上的剖析发掘,并运用到各种事务傍边。例如:

  • 机器翻译(Machine Translation),接纳一种言语的输入文本并返回目标言语的输出文本(包含相同的含义)。
  • 情感剖析(Sentiment Analysis),接纳文本数据,断定文本是正面的、负面的还是中性的等。
  • 文本摘要(Text Summarization),接纳文本输入并将它们总结为更精炼的文本言语输出。

输入文本的质量会很大程度影响这些事务场景的模型作用。因而,在这些文本数据到达机器翻译、情感剖析、文本摘要等下游使命之前,咱们要尽量保证输入文本数据的语法正确性。

NLP实践!文本语法纠错模型实战,搭建你的贴身语法修改小助手 ⛵

语法纠错(Grammatical Error Correction)是一个有十分广泛运用的运用场景,有2种典型的模型办法:

  • 序列到序列(seq2seq)模型:它最早被运用在机器翻译引擎中,将给定言语翻译成同一种言语,这种映射办法相同能够用来做语法纠错(例如Yuan 和 Briscoe,2014)。
  • 序列标示模型:输入文本被标示然后映射回更正的内容(例如Malmi 等人,2019)。

虽然 seq2seq 神经机器翻译办法已被证明能够完结最先进的性能(例如Vaswani 等人,2017 年),但它仍然存在某些缺点,例如:1)推理和生成输出需求很长时间;2)练习需求很多数据;3)与非神经架构比较,模型的神经架构使得对成果的解释具有挑战性(例如Omelianchuk 等人,2020 年)等。为了克服这些缺点,咱们在本文中评论并运用更新的办法:运用 Transformer 编码器的序列标示器

NLP实践!文本语法纠错模型实战,搭建你的贴身语法修改小助手 ⛵

Omelianchuk, et al., 2020 中提出的 GECToR 模型,是十分优秀的文本纠错模型。它对 Transformer seq2seq 进行微调,Transformer 的引进极大改进了 seq2seq 模型的推理时间问题,而且能够在较小的练习数据的状况下完结更好的作用。

在后续的内容中,ShowMeAI将演示运用这个库来完结纠正给定语句中语法错误的方案,咱们还会创立一个可视化用户界面来将这个AI运用产品化。

语法纠错代码全完结

整个语法纠错代码完结包含3个核心过程板块:

  • 准备工作:此过程包含东西库设定、下载预练习模型、环境装备。
  • 模型实践:完结并测验语法纠错模型。
  • 用户界面:创立用户界面以产品化和提高用户体会

准备工作

咱们先运用以下指令将 GitHub 中的代码复制到咱们本地,这是 GECToR 模型对应的完结:

git clone https://github.com/grammarly/gector.git
NLP实践!文本语法纠错模型实战,搭建你的贴身语法修改小助手 ⛵

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}")

成果:

NLP实践!文本语法纠错模型实战,搭建你的贴身语法修改小助手 ⛵

模型的纠错成果十分精确!有以下变化:

  • 句首将she大写为She
  • are更改为is,以使sheis主谓共同
  • 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}")

成果:

NLP实践!文本语法纠错模型实战,搭建你的贴身语法修改小助手 ⛵

在这个语句中咱们来看一下纠错模型做了什么:

  • 句首将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}")

成果:

NLP实践!文本语法纠错模型实战,搭建你的贴身语法修改小助手 ⛵

咱们发现了一种边缘状况,在这种状况下,模型无法识别正确的动词时态。更新后的语句是『She was looking at the sky later today while brushing her hair』,咱们读下来感觉这句是将来时(今日晚点),而模型纠正后的语句是曩昔时。

咱们想一想,为什么这句对模型比以前更具挑战性呢?答案是later today用两个词暗示时间,这需求模型具有更深层次的上下文意识。如果没有later这个词,咱们会有一个完全能够承受的语句,如下所示:

NLP实践!文本语法纠错模型实战,搭建你的贴身语法修改小助手 ⛵

在这种状况下,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)}")

成果:

NLP实践!文本语法纠错模型实战,搭建你的贴身语法修改小助手 ⛵

接下来咱们将增加一个可视化用户界面。咱们运用 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()

成果咱们得到如下的界面:

NLP实践!文本语法纠错模型实战,搭建你的贴身语法修改小助手 ⛵

咱们能够在 web 界面中再次测验咱们的语句啦!咱们只需在左侧的框中键入待纠错的语句,然后按 Submit(提交)。接错后的成果将显现在右侧的框中,如下所示:

NLP实践!文本语法纠错模型实战,搭建你的贴身语法修改小助手 ⛵

十分顺畅,你也快来测验一下吧!

总结

在这篇文章中,咱们实践了语法纠错模型。咱们运用揭露可用的 GECToR 库来完结一个预练习的语法纠错模型,在一些错误的语句上对其进行测验,发现该模型的适用场景和局限性(需求提高的当地),最终咱们构建了一个可视化界面把文本纠错产品化。

参考资料

  • Grammatical error correction using neural machine translation:aclanthology.org/N16-1042/
  • Encode, Tag, Realize: High-Precision Text Editing:aclanthology.org/D19-1510/
  • Attention Is All You Need:arxiv.org/abs/1706.03…
  • GECToR – Grammatical Error Correction: Tag, Not Rewrite:aclanthology.org/2020.bea-1.…
  • GECToR模型的GitHub页面:github.com/grammarly/g…
  • RoBERTa的GitHub页面:github.com/facebookres…
  • Gradio的GitHub页面:github.com/gradio-app/…

引荐阅读

  • 数据剖析实战系列 :www.showmeai.tech/tutorials/4…
  • 机器学习数据剖析实战系列:www.showmeai.tech/tutorials/4…
  • 深度学习数据剖析实战系列:www.showmeai.tech/tutorials/4…
  • TensorFlow数据剖析实战系列:www.showmeai.tech/tutorials/4…
  • PyTorch数据剖析实战系列:www.showmeai.tech/tutorials/4…
  • NLP实战数据剖析实战系列:www.showmeai.tech/tutorials/4…
  • CV实战数据剖析实战系列:www.showmeai.tech/tutorials/4…

NLP实践!文本语法纠错模型实战,搭建你的贴身语法修改小助手 ⛵

本文正在参与「金石方案 . 瓜分6万现金大奖」