【语言与知识主题月】文本纠错
让天涯 发布于2020-07 浏览:3411 回复:0
0
收藏

一、功能介绍

识别输入文本中有错误的片段,提示错误并给出正确的文本结果。支持短文本、长文本、语音等内容的错误识别,纠错是搜索引擎、语音识别、内容审查等功能更好运行的基础模块之一。

二、应用场景

在内容写作平台上内嵌纠错模块,可在作者写作时自动检查并提示错别字情况。从而降低因疏忽导致的错误表述,有效提升作者的文章写作质量,同时给用户更好的阅读体验。
用户经常在搜索时输入错误,通过分析搜索query的形式和特征,可自动纠正搜索query并提示用户,进而给出更符合用户需求的搜索结果,有效屏蔽错别字对用户真实需求的影响。
将文本纠错嵌入对话系统中,可自动修正语音识别转文本过程中的错别字,向对话理解系统传递纠错后的正确query,能明显提高语音识别准确率,使产品整体体验更佳。
三、使用攻略

说明:本文采用C# 语言,开发环境为.Net Core 3.1,采用在线API接口方式实现。

(1)平台接入
登陆 百度智能云-管理中心 创建 “自然语言处理”应用,获取 “API Key ”和 “Secret Key”:https://console.bce.baidu.com/ai/?_=1596204514960&fromai=1#/ai/nlp/overview/index

(2)接口文档

文档地址:https://ai.baidu.com/ai-doc/NLP/Ik6z52gp8

接口描述:识别输入文本中有错误的片段,提示错误并给出正确的文本结果。支持短文本、长文本、语音等内容的错误识别,纠错是搜索引擎、语音识别、内容审查等功能更好运行的基础模块之一。

请求说明

HTTP方法:POST
请求URL:https://aip.baidubce.com/rpc/2.0/nlp/v1/ecnet
URL参数:

参数 	             值
access_token 	通过API Key和Secret Key获取的access_token,参考“Access Token获取”

Header如下:

参数 	            值
Content-Type 	application/json

Body中放置请求参数,参数详情如下:
Body请求示例:

{
    "text": "百度是一家人工只能公司"
}

注意:要求使用JSON格式的结构体来描述一个请求的具体内容。

body整体文本内容可以支持GBK和UTF-8两种格式的编码。

1、GBK支持:默认按GBK进行编码,输入内容为GBK编码,输出内容为GBK编码,否则会接口报错编码错误

2、UTF-8支持:若文本需要使用UTF-8编码,请在url参数中添加charset=UTF-8 (大小写敏感) 例如 https://aip.baidubce.com/rpc/2.0/nlp/v1/lexer?charset=UTF-8&access_token=24.f9ba9c5241b67688bb4adbed8bc91dec.2592000.1485570332.282335-8574074

请求参数

参数 	类型 	描述 	                      是否必填
text 	string 	待纠错文本,输入限制511字节 	必填

返回说明
默认返回内容为GBK编码。

若用户指定输入为UTF-8编码(通过指定charset参数),则返回内容为UTF-8编码。

返回参数

参数 	         说明 	描述
log_id 	        uint64 	请求唯一标识码
+correct_query 	string 	纠错后的文本
+score 	        double 	模型置信度打分
item 	        object 	分析结果
+vec_fragment 	list 	替换候选片段信息
++ori_frag 	string 	原片段
++correct_frag 	double 	替换片段
++begin_pos 	int 	起始(长度单位)
++end_pos 	list 	结尾(长度单位)

返回示例:

{
    "log_id": 6770395607901559829,
    "item": {
        "vec_fragment": [
            {
                "ori_frag": "只能",
                "begin_pos": 21,
                "correct_frag": "智能",
                "end_pos": 27
            }
        ],
        "score": 0.875169,
        "correct_query": "百度是一家人工智能公司"
    },
    "text": "百度是一家人工只能公司"
}

(3)源码共享

(3-1)根据 API Key 和 Secret Key 获取 AccessToken

/// 
/// 获取百度access_token
/// 
/// API Key
/// Secret Key
/// 
public static string GetAccessToken(string clientId, string clientSecret)
{
    string authHost = "https://aip.baidubce.com/oauth/2.0/token";
    HttpClient client = new HttpClient();
    List> paraList = new List>();
    paraList.Add(new KeyValuePair("grant_type", "client_credentials"));
    paraList.Add(new KeyValuePair("client_id", clientId));
    paraList.Add(new KeyValuePair("client_secret", clientSecret));

    HttpResponseMessage response = client.PostAsync(authHost, new FormUrlEncodedContent(paraList)).Result;
    string result = response.Content.ReadAsStringAsync().Result;
    JObject jo = (JObject)JsonConvert.DeserializeObject(result);

    string token = jo["access_token"].ToString();
    return token;
}

(3-2)调用API接口获取识别结果

(3-2-1) 建立Index.cshtml文件

(3-2-1-1)前台代码:

    由于html代码无法原生显示,只能简单说明一下:

    主要是一个form表单,form表单里面有几个控件:

一个textarea:type="text",asp-for="Text" ,要纠错的文本;

一个Input:type="submit",asp-page-handler="Ecnet" ,提交请求。

最后显示后台 msg 字符串列表信息,如果需要输出原始Html代码,则需要使用@Html.Raw()函数。 

(3-2-1-2) 后台代码: 

主程序代码:

[BindProperty]
 public string Text { get; set; }
 public List msg = new List();

 string NLP_Ecnet="v1/ecnet";
 string NLP_API_KEY="你的自然语言处理API KEY";
 string NLP_SECRET_KEY="你的自然语言处理SECRET KEY";

 public NLPModel()
 {
 }

 public void OnGet()
 {
 }

public async Task OnPostEcnetAsync()
 {
     if (string.IsNullOrEmpty(Text))
     {
         ModelState.AddModelError(string.Empty, "请输入具体内容!");
     }
     if (!ModelState.IsValid)
     {
         return Page();
     }
     msg = new List();

     DateTime startTime = DateTime.Now;

     string result = GetNLPJson(NLP_Ecnet, Text, NLP_API_KEY, NLP_SECRET_KEY);

     DateTime endTime = DateTime.Now;
     TimeSpan ts = endTime - startTime;

     JObject jo = (JObject)JsonStringToObj(result);

     try
     {
         msg.Add("文本纠错结果(耗时" + ts.TotalSeconds + "秒):\n");
         msg.Add("原来的文本:" + jo["text"].ToString());
         List msgList = jo["item"]["vec_fragment"].ToList();
         if (msgList.Count > 0)
         {
             msg.Add("纠错后文本:" + jo["item"]["correct_query"].ToString());
             msg.Add("分析结果:");
             string curString = "";
             foreach (JToken ms in msgList)
             {
                 curString += ms["ori_frag"].ToString() + "(" + ms["correct_frag"].ToString() + ")  ";
             }
             msg.Add(curString);
         }
         else
         {
             msg.Add("文本无错!");
         }
     }
     catch (Exception e)
     {
         msg.Add(result);
     }
     return Page();
 }

其他相关函数:

/// 
/// 自然语言处理Json字符串
/// 
/// 自然语言处理类型
/// 内容
/// API Key
/// Secret Key
/// 
public static string GetNLPJson(string nlpType, string text, string clientId, string clientSecret)
{
    string token = GetAccessToken(clientId, clientSecret);
    string host = "https://aip.baidubce.com/rpc/2.0/nlp/" + nlpType + "?charset=UTF-8&access_token=" + token;
    Encoding encoding = Encoding.Default;
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
    request.Method = "post";
    request.ContentType = "application/json";
    request.KeepAlive = true;
    string str = "{\"text\":\"" + text;
    str += "\"}";
    byte[] buffer = encoding.GetBytes(str);
    request.ContentLength = buffer.Length;
    request.GetRequestStream().Write(buffer, 0, buffer.Length);
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
    string result = reader.ReadToEnd();
    return result;
}

/// 
/// 获取百度access_token
/// 
/// API Key
/// Secret Key
/// 
public static string GetAccessToken(string clientId, string clientSecret)
{
    string authHost = "https://aip.baidubce.com/oauth/2.0/token";
    HttpClient client = new HttpClient();
    List> paraList = new List>();
    paraList.Add(new KeyValuePair("grant_type", "client_credentials"));
    paraList.Add(new KeyValuePair("client_id", clientId));
    paraList.Add(new KeyValuePair("client_secret", clientSecret));

    HttpResponseMessage response = client.PostAsync(authHost, new FormUrlEncodedContent(paraList)).Result;
    string result = response.Content.ReadAsStringAsync().Result;
    JObject jo = (JObject)JsonConvert.DeserializeObject(result);

    string token = jo["access_token"].ToString();
    return token;
}

/// 
/// json转为对象
/// 
/// Json字符串
/// 
public static Object JsonStringToObj(string jsonString)
{
    Object s = JsonConvert.DeserializeObject(jsonString);
    return s;
}

四、效果测试

1、页面:

2.1

2.2

2.3

五、测试结果及建议

从测试结果可知,百度的文本纠错技术识别速度基本在0.5秒左右,识别准确率也不错,一般情况下也是基本够用了,不过还是会存在个别无法正确识别纠错(如图2.2中的“针是”,应该是“真是”才对),还需要进一步的优化。

 

 

收藏
点赞
0
个赞
TOP
切换版块