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

news2024/11/27 0:24:16

💡 作者:韩信子@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,以使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}")

结果:

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/42408.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI智能机器人的测评以及部署

作为业内人士,今天给大家测评下电销机器人。究竟是什么样的电销机器人才是让客户满意的? 咱们先来说说电销机器人到底是什么? 相信很多人都对电销机器人没有过多的了解。甚至还有人会问;“什么?机器人?啥样…

两万字详细解读AQS,你真的了解它吗?

1、JUC的由来 synchronized 关键字是JDK官方人员用C代码写的,在JDK6以前是重量级锁。Java大牛 Doug Lea对 synchronized 在并发编程条件下的性能表现不满意就自己写了个JUC,以此来提升并发性能,本文要讲的就是JUC并发包下的AbstractQueuedSy…

Listen、Attention、Spell模型

LAS是一个做语音识别的经典seq2seq模型,主要分为三个部分Listen、Attention、Spell Listen Listen部分就是一个encoder。 输入声学特征向量,提取信息、消除噪声,输出向量。 encoder可以是RNN 也可以是CNN。比较常见的是先用CNN&#xff0…

第三章变量

第三章变量 查看javaAPI文档的网址: https://www.matools.com/ 3.1程序中号的使用 1)当左右两边都是数值型时,则做加法运算 2)当左右两边有一方为字符串,则做拼接运算 3)运算顺序从左到右 System,out.prin…

Springboot+vue校园新闻网站idea

将系统需求进行分析总结,系统需求如下: 系统可以运行在Windows操作系统平台上,并通过友好的界面进行管理 系统用户分为游客,登录用户,管理员 游客可以浏览新闻 游客可以浏览评论 管理员具有用户所有的权限 管理员还可以…

别再把Tableau、PowerBI吹上天了,在中国根本用不起来,看看为啥

工作业务相关,这几年接触BI较多,借此浅聊下我对BI工具以及市场的看法,原创禁止转载。 1、BI并不玄乎,本质就是实现简单数据分析和可视化的工具 很多人觉得BI玄乎,其实很大程度是因为BI厂家给造的名词太多了&#xff…

Ajax学习:如何在Chrome网络控制台查看通信报文(请求报文/响应报文)

第一步:F12开启控制台, 第二步骤:打开网络标签 然后刷新页面 在网络标签位置处,这时候会出现所有发送的请求 点击第一个:会出现内容 预览部分:是解析 观察解析结果处 标头headers:主要观察请求头和请求体部分 GET请…

saltstack 企业级实战

一、自动化运维工具对比 使用所需软件配置单个服务器是一项相当简单的任务。 但是,如果许多服务器需要安装相同或相似的软件和配置,则该过程将需要大量的工时才能完成,这会耗尽您本已紧张的资源。如果没有某种形式的自动化,这项任务几乎无法完成。考虑到这一任务,开发了新…

【SpringCloud】06 链路跟踪 Sleuth+zipkin

链路追踪 在大型系统的微服务化构建中,一个系统被拆分成了许多微服务。这些模块负责不同的功能,组合成系统,最终可以提供丰富的功能。在这种架构中,一次请求往往需要涉及到多个服务。互联网应用构建在不同的软件模块集上&#xf…

【附源码】计算机毕业设计JAVA智慧养老院管理系统

【附源码】计算机毕业设计JAVA智慧养老院管理系统 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JAVA …

Assignment写作抄袭常见形式怎么了解?

直接照抄他人的想法并且当做自己的Assignment上交,这是最简单的Assignment抄袭行为。实际上,形式更微妙的Assignment抄袭形式更为常见。今天我们为大家介绍英国Assignment抄袭常见的形式,帮助大家做好英国Assignment查重,避免Assi…

React源码分析(一)Fiber

前言 本次React源码参考版本为17.0.3。 React架构前世今生 查阅文档了解到, React16.x是个分水岭。 React15及之前 在16之前,React架构大致可以分为两层: Reconciler: 主要职责是对比查找更新前后的变化的组件;R…

TMS Logging提供了短日志输出

TMS Logging提供了短日志输出 TMS Logging Compact跨平台框架以最小的代码量为各种目标提供了短日志输出。 TMS记录惊人属性: 登录到一个或多个输出处理程序,如控制台、HTML、文本、文本、CSV文件、TCP/IP、浏览器、Windows事件日志等,。。。…

代码质量与安全 | 使用Incredibuild加速Klocwork静态代码分析

Klocwork是一款优秀的静态代码分析和SAST工具,适用于 C、C、C#、Java、JavaScript、Python和Kotlin,可识别软件安全性、质量和可靠性问题,帮助强制遵守标准。 Incredibuild是一款加速编译工具,为C代码编译和分析提供强大的分布式处…

IMX6ULL学习记录——持续更新中......

环境搭建小记 问题集锦 1、nfs无法挂载的问题 原因:ubuntu16之后nfs默认使用nfs的版本为3,4 解决:原子用户手册中/【正点原子】I.MX6U网络环境TFTP&NFS搭建手册V1.3.1/第四章 4.3 NFS挂载文件系统 具体: sudo vim /etc/default/nfs…

CISAW信息安全保障人员认证考试难吗?

CISAW信息安全保障人员认证,作为信息安全行业相当热门的证书之一,其持证人数已超50%,在信息安全行业内占有一席之地,很多报考人都比较关心CISAW考试难不难?能通过吗?那接下来说一说CISAW证书考不好考&#…

《WEB前端框架开发技术》HTML5响应式旅游景区网站设计与实现——榆林子州HTML+CSS+JavaScript

👨‍🎓学生HTML静态网页基础水平制作👩‍🎓,页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码,这是一个不错的旅游网页制作,画面精明,排版整洁,内容…

面向OLAP的列式存储DBMS-12-[ClickHouse]的管理与运维

ClickHouse 的管理与运维 ClickHouse 管理和运维相关的知识,该部分可以让 ClickHouse 变得更加安全与健壮。在前面演示的案例中,为了方便,我们一直使用默认的 default 用户,并且没有配置密码,这显然不符合生产环境的要…

怎么看电脑配置?电脑配置好不好?详细教程来了!

小伙伴出去买电脑,最关心的就是电脑配置问题。买回电脑后,首先应该是查看自己的电脑配置,看看是否跟商家宣传的一样,有没有出现被更换的问题。那么怎么看电脑配置呢?怎么看电脑配置和型号?接下来小编就跟大…

算法设计与分析 SCAU19184 传球游戏

19184 传球游戏 时间限制:1000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G;GCC;VC;JAVA Description n个同学站成一个圆圈,其中的一个同学手里拿着一个球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意…