From 2f0330fc15bca8fe1dc36a81b296c39cb490d0ea Mon Sep 17 00:00:00 2001 From: PaddlePaddle-Gardener Date: Fri, 7 Jan 2022 12:57:03 +0800 Subject: [PATCH] mirgate_1738 --- .../text/text_correction/ernie-csc/README.md | 165 ++++++++++++++++++ .../text_correction/ernie-csc/__init__.py | 0 .../text/text_correction/ernie-csc/module.py | 67 +++++++ .../ernie-csc/requirements.txt | 1 + 4 files changed, 233 insertions(+) create mode 100644 modules/text/text_correction/ernie-csc/README.md create mode 100644 modules/text/text_correction/ernie-csc/__init__.py create mode 100644 modules/text/text_correction/ernie-csc/module.py create mode 100644 modules/text/text_correction/ernie-csc/requirements.txt diff --git a/modules/text/text_correction/ernie-csc/README.md b/modules/text/text_correction/ernie-csc/README.md new file mode 100644 index 00000000..a62e4637 --- /dev/null +++ b/modules/text/text_correction/ernie-csc/README.md @@ -0,0 +1,165 @@ +# ERNIE-CSC + +|模型名称|ERNIE-CSC| +| :--- | :---: | +|类别|文本-文本纠错| +|网络|ERNIE-CSC| +|数据集|SIGHAN| +|是否支持Fine-tuning|否| +|模型大小|436MB| +|最新更新日期|2021-12-10| +|数据指标|-| + + + +## 一、模型基本信息 + +- ### 模型介绍 + + - 中文文本纠错任务是一项NLP基础任务,其输入是一个可能含有语法错误的中文句子,输出是一个正确的中文句子。语法错误类型很多,有多字、少字、错别字等,目前最常见的错误类型是错别字。大部分研究工作围绕错别字这一类型进行研究。本文实现了百度在ACL 2021上提出结合拼音特征的Softmask策略的中文错别字纠错的下游任务网络,并提供预训练模型,模型结构如下: + +

+
+

+ + - 更多详情请[参考论文](https://aclanthology.org/2021.findings-acl.198.pdf) + + - 注:论文中暂未开源融合字音特征的预训练模型参数(即MLM-phonetics),所以本文提供的纠错模型是在ERNIE-1.0的参数上进行Finetune,纠错模型结构与论文保持一致。 + +## 二、安装 + +- ### 1、环境依赖 + + - paddlepaddle >= 2.1.0 + + - paddlenlp >= 2.2.0 + + - paddlehub >= 2.1.0 | [如何安装PaddleHub](../../../../docs/docs_ch/get_start/installation.rst) + +- ### 2、安装 + + - ```shell + $ hub install ernie-csc + ``` + - 如您安装时遇到问题,可参考:[零基础windows安装](../../../../docs/docs_ch/get_start/windows_quickstart.md) + | [零基础Linux安装](../../../../docs/docs_ch/get_start/linux_quickstart.md) | [零基础MacOS安装](../../../../docs/docs_ch/get_start/mac_quickstart.md) + +## 三、模型API预测 + +- ### 1、命令行预测 + + - ```shell + $ hub run ernie-csc --input_text="遇到逆竟时,我们必须勇于面对,而且要愈挫愈勇,这样我们才能朝著成功之路前进。" + ``` + - 通过命令行方式实现文本纠错ernie-csc模型的调用,更多请见 [PaddleHub命令行指令](../../../../docs/docs_ch/tutorial/cmd_usage.rst) + +- ### 2、预测代码示例 + + - ```python + import paddlehub as hub + + # Load ernie-csc + module = hub.Module(name="ernie-csc") + + # String input + results = module.predict("遇到逆竟时,我们必须勇于面对,而且要愈挫愈勇,这样我们才能朝著成功之路前进。") + print(results) + # [{'source': '遇到逆竟时,我们必须勇于面对,而且要愈挫愈勇,这样我们才能朝著成功之路前进。', 'target': '遇到逆境时,我们必须勇于面对,而且要愈挫愈勇,这样我们才能朝著成功之路前进。', 'errors': [{'position': 3, 'correction': {'竟': '境'}}]}] + + # List input + results = module.predict(['遇到逆竟时,我们必须勇于面对,而且要愈挫愈勇,这样我们才能朝著成功之路前进。', '人生就是如此,经过磨练才能让自己更加拙壮,才能使自己更加乐观。']) + print(results) + # [{'source': '遇到逆竟时,我们必须勇于面对,而且要愈挫愈勇,这样我们才能朝著成功之路前进。', 'target': '遇到逆境时,我们必须勇于面对,而且要愈挫愈勇,这样我们才能朝著成功之路前进。', 'errors': [{'position': 3, 'correction': {'竟': '境'}}]}, {'source': '人生就是如此,经过磨练才能让自己更加拙壮,才能使自己更加乐观。', 'target': '人生就是如此,经过磨练才能让自己更加茁壮,才能使自己更加乐观。', 'errors': [{'position': 18, 'correction': {'拙': '茁'}}]}] + ``` + +- ### 3、API + + - ```python + def __init__(batch_size=32) + ``` + + - **参数** + + - batch_size(int): 每个预测批次的样本数目,默认为32。 + + - ```python + def predict(texts) + ``` + - 预测接口,输入文本,输出文本纠错结果。 + + - **参数** + + - texts(str or list\[str\]): 待预测数据。 + + - **返回** + + - results(list\[dict\]): 输出结果。每个元素都是dict类型,包含以下信息: + + { + 'source': str, 输入文本。 + 'target': str, 模型预测结果。 + 'errors': list[dict], 错误字符的详细信息,包含如下信息: + { + 'position': int, 错误字符的位置。 + 'correction': dict, 错误字符及其对应的校正结果。 + } + } + + +## 四、服务部署 + +- PaddleHub Serving可以部署一个在线文本纠错服务,可以将此接口用于在线web应用。 + +- ## 第一步:启动PaddleHub Serving + + - 运行启动命令: + ```shell + $ hub serving start -m ernie-csc + ``` + + - 这样就完成了服务化API的部署,默认端口号为8866。 + + - **NOTE:** 如使用GPU预测,则需要在启动服务之前,请设置CUDA\_VISIBLE\_DEVICES环境变量,否则不用设置。 + +- ## 第二步:发送预测请求 + + - 配置好服务端,以下数行代码即可实现发送预测请求,获取预测结果 + + ```python + import requests + import json + + # 待预测数据(input string) + text = ["遇到逆竟时,我们必须勇于面对,而且要愈挫愈勇,这样我们才能朝著成功之路前进。"] + + # 设置运行配置 + data = {"texts": text} + + # 指定预测方法为ernie-csc并发送post请求,content-type类型应指定json方式 + url = "http://127.0.0.1:8866/predict/ernie-csc" + headers = {"Content-Type": "application/json"} + r = requests.post(url=url, headers=headers, data=json.dumps(data)) + print(r.json()) + + # 待预测数据(input list) + text = ['遇到逆竟时,我们必须勇于面对,而且要愈挫愈勇,这样我们才能朝著成功之路前进。', '人生就是如此,经过磨练才能让自己更加拙壮,才能使自己更加乐观。'] + + # 设置运行配置 + data = {"texts": text} + + r = requests.post(url=url, headers=headers, data=json.dumps(data)) + print(r.json()) + ``` + + - 关于PaddleHub Serving更多信息参考:[服务部署](../../../../docs/docs_ch/tutorial/serving.md) + + +## 五、更新历史 + +* 1.0.0 + + 初始发布 + + - ```shell + $ hub install ernie-csc==1.0.0 + ``` diff --git a/modules/text/text_correction/ernie-csc/__init__.py b/modules/text/text_correction/ernie-csc/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/modules/text/text_correction/ernie-csc/module.py b/modules/text/text_correction/ernie-csc/module.py new file mode 100644 index 00000000..5d6454f4 --- /dev/null +++ b/modules/text/text_correction/ernie-csc/module.py @@ -0,0 +1,67 @@ +# -*- coding:utf-8 -*- +import os +import argparse + +import paddle +import paddlehub as hub +from paddlehub.module.module import serving, moduleinfo, runnable +from paddlenlp import Taskflow + + +@moduleinfo( + name="ernie-csc", + version="1.0.0", + summary="", + author="Baidu", + author_email="", + type="nlp/text_correction", + meta=hub.NLPPredictionModule) +class Ernie_CSC(paddle.nn.Layer): + def __init__(self, + batch_size=32): + self.corrector = Taskflow("text_correction", batch_size=batch_size) + + @serving + def predict(self, texts): + """ + The prediction interface for ernie-csc. + + Args: + texts(str or list[str]): the input texts to be predict. + + Returns: + results(list[dict]): inference results. The element is a dictionary consists of: + { + 'source': str, the input texts. + 'target': str, the predicted correct texts. + 'errors': list[dict], detail information of errors, the element is a dictionary consists of: + { + 'position': int, index of wrong charactor. + 'correction': int, the origin charactor and the predicted correct charactor. + } + } + """ + return self.corrector(texts) + + @runnable + def run_cmd(self, argvs): + """ + Run as a command + """ + self.parser = argparse.ArgumentParser( + description='Run the %s module.' % self.name, + prog='hub run %s' % self.name, + usage='%(prog)s', + add_help=True) + + self.arg_input_group = self.parser.add_argument_group(title="Input options", description="Input data. Required") + + self.add_module_input_arg() + + args = self.parser.parse_args(argvs) + + input_data = self.check_input_data(args) + + results = self.predict(texts=input_data) + + return results diff --git a/modules/text/text_correction/ernie-csc/requirements.txt b/modules/text/text_correction/ernie-csc/requirements.txt new file mode 100644 index 00000000..7a8a87b3 --- /dev/null +++ b/modules/text/text_correction/ernie-csc/requirements.txt @@ -0,0 +1 @@ +paddlenlp>=2.2.0 -- Gitee