Skip to main content

moregeek program

nlp实践!文本语法纠错模型实战,搭建你的贴身语法修改小助手 ⛵_showmeai的博客-多极客编程



💡 作者:韩信子@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 库来实现一个预训练的语法纠错模型,在一些错误的句子上对其进行测试,发现该模型的适用场景和局限性(需要提高的地方),最后我们构建了一个可视化界面把文本纠错产品化。


参考资料



推荐阅读




©著作权归作者所有:来自51CTO博客作者ShowMeAI的原创作品,请联系作者获取转载授权,否则将追究法律责任

megengine inference 卷积优化之 im2col 和 winograd 优化_旷视天元megengine的博客-多极客编程

作者:于雄雄 陈其友 | 旷视 MegEngine 架构师 背景 在 CV 领域中,卷积计算是扩充像素的感受野的有效方法,模型大多数的计算量都是卷积操作贡献的。因此在 CV 模型的推理性能优化中,最重要的一项工作是对卷积的优化。MegEngine 在长期的工业界实践和反馈的基础上总结得出卷积优化的基本方法有: 直接卷积计算优化 该方法的计算过程为逐通道进行卷积滑窗计算并累加,该优化方法对卷

信息论与编码:随参信道特性_wx62e40d60030b6的博客-多极客编程

随参信道的传输特性主要依赖于传输媒质特性,以电离层反射信道、对流层散射信道为主要代表。 随参信道是一种信道传输特性随时间随机快速变化的信道, 包括陆地移动信道,短波电离层反射信道、超短波微波对流层散射信道、超短波视距绕射信道。随参信道的传输媒介具有以下三个特点:对信号的衰耗(衰减)随时间而变;传输的时延随时间而变;会产生多径传播的效果。多径传播 :指由发射点出发的电波可能经过多条路径到达接收点。每

快为你的jupyter添加这7个扩展,效率upup! ⛵_showmeai的博客-多极客编程

💡 作者:韩信子@ShowMeAI 📘 Python3◉技能提升系列:https://www.showmeai.tech/tutorials/56 📘 本文地址:https://www.showmeai.tech/article-detail/341 📢 声明:版权所有,转载请联系平台与作者并注明出处 📢 收藏ShowMeAI查看更多精彩内容 兵欲善其事,必先利其器。对于数据科学家和数据开

图解来啦!机器学习工业部署最佳实践!10分钟上手机器学习部署与大规模扩展 ⛵_showmeai的博客-多极客编程

💡 作者:韩信子@ShowMeAI 📘 机器学习实战系列:https://www.showmeai.tech/tutorials/41 📘 深度学习实战系列:https://www.showmeai.tech/tutorials/42 📘 本文地址:https://www.showmeai.tech/article-detail/396 📢 声明:版权所有,转载请联系平台与作者并注明出处 📢

算法竞赛入门【码蹄集进阶塔335题】(mt2326-2330)_灵彧universe的博客-多极客编程

算法竞赛入门【码蹄集进阶塔335题】(MT2326-2330) (文章目录) 前言 为什么突然想学算法了? > 用较为“官方”的语言讲,是因为算法对计算机科学的所有分支都非常重要。 在绝大多数的计算机科学分支领域中,要想完成任何实质性的工作,理解算法的基础知识并掌握与算法密切相关的数据结构知识是必不可少的。 > 但从实际而言,是因为当下快到了考研和找工作的年纪(ಥ_ಥ),无论走哪

算法竞赛入门【码蹄集进阶塔335题】(mt3330-3335)_灵彧universe的博客-多极客编程

算法竞赛入门【码蹄集进阶塔335题】(MT3330-3335) (文章目录) 前言 为什么突然想学算法了? > 用较为“官方”的语言讲,是因为算法对计算机科学的所有分支都非常重要。 在绝大多数的计算机科学分支领域中,要想完成任何实质性的工作,理解算法的基础知识并掌握与算法密切相关的数据结构知识是必不可少的。 > 但从实际而言,是因为当下快到了考研和找工作的年纪(ಥ_ಥ),无论走哪

megengine inference 卷积优化之 im2col 和 winograd 优化_旷视天元megengine的博客-多极客编程

作者:于雄雄 陈其友 | 旷视 MegEngine 架构师 背景 在 CV 领域中,卷积计算是扩充像素的感受野的有效方法,模型大多数的计算量都是卷积操作贡献的。因此在 CV 模型的推理性能优化中,最重要的一项工作是对卷积的优化。MegEngine 在长期的工业界实践和反馈的基础上总结得出卷积优化的基本方法有: 直接卷积计算优化 该方法的计算过程为逐通道进行卷积滑窗计算并累加,该优化方法对卷

快为你的jupyter添加这7个扩展,效率upup! ⛵_showmeai的博客-多极客编程

💡 作者:韩信子@ShowMeAI 📘 Python3◉技能提升系列:https://www.showmeai.tech/tutorials/56 📘 本文地址:https://www.showmeai.tech/article-detail/341 📢 声明:版权所有,转载请联系平台与作者并注明出处 📢 收藏ShowMeAI查看更多精彩内容 兵欲善其事,必先利其器。对于数据科学家和数据开

详解支持向量机-roc曲线中的概率和阈值【菜菜的sklearn课堂笔记】_wx63088f6683f8f的博客-多极客编程

视频作者:[菜菜TsaiTsai] 链接:[【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibili] 基于混淆矩阵,我们学习了总共六个指标:准确率Accuracy,精确度Precision,召回率Recall,精确度和召回度的平衡指标F measure,特异度Specificity,以及假正率FPR。 其中,假正率有一个非常重要的应用:我们在追求较高的R

图解来啦!机器学习工业部署最佳实践!10分钟上手机器学习部署与大规模扩展 ⛵_showmeai的博客-多极客编程

💡 作者:韩信子@ShowMeAI 📘 机器学习实战系列:https://www.showmeai.tech/tutorials/41 📘 深度学习实战系列:https://www.showmeai.tech/tutorials/42 📘 本文地址:https://www.showmeai.tech/article-detail/396 📢 声明:版权所有,转载请联系平台与作者并注明出处 📢

算法竞赛入门【码蹄集进阶塔335题】(mt2326-2330)_灵彧universe的博客-多极客编程

算法竞赛入门【码蹄集进阶塔335题】(MT2326-2330) (文章目录) 前言 为什么突然想学算法了? > 用较为“官方”的语言讲,是因为算法对计算机科学的所有分支都非常重要。 在绝大多数的计算机科学分支领域中,要想完成任何实质性的工作,理解算法的基础知识并掌握与算法密切相关的数据结构知识是必不可少的。 > 但从实际而言,是因为当下快到了考研和找工作的年纪(ಥ_ಥ),无论走哪

算法竞赛入门【码蹄集进阶塔335题】(mt3330-3335)_灵彧universe的博客-多极客编程

算法竞赛入门【码蹄集进阶塔335题】(MT3330-3335) (文章目录) 前言 为什么突然想学算法了? > 用较为“官方”的语言讲,是因为算法对计算机科学的所有分支都非常重要。 在绝大多数的计算机科学分支领域中,要想完成任何实质性的工作,理解算法的基础知识并掌握与算法密切相关的数据结构知识是必不可少的。 > 但从实际而言,是因为当下快到了考研和找工作的年纪(ಥ_ಥ),无论走哪