语言处理应用技术是百度推出的一项以多场景技术应用为导向,提供可直接应用于产品策略的NLP技术能力,让您的产品更好地理解语言、理解用户。其主要产品技术包括文本纠错、情感倾向分析,评论观点抽取、对话情绪识别、文章标签、文章分类、新闻摘要、地址识别等。
语言处理应用技术在进行智能文章分类、文章摘要形成等方面可以给用户提供很好的参考价值:对于创作者而言,可以大大简化新闻稿件的标签、分类、摘要等信息的填写,专注于文章本身的撰写;对于文章提供平台而言,可以更加精确地进行文章分类,让用户搜索到自己想要阅读地文章,并进行个性化推荐。
下面来看看如何使用百度语言处理应用技术来处理文章,获取文章标签、分类、新闻摘要等关键信息。
一、功能介绍
运用百度的文章标签、文章分类、新闻摘要等语言处理应用技术,对文章进行分析处理,获取文章核心关键词,自动分类、聚类,形成新闻摘要。
二、应用场景
根据文章计算的标签、主题分类,结合用户画像,精准的对用户进行个性化推荐。
可以聚合相同标签的文章,便于用户对同一话题的文章进行全方位的信息阅读;对新闻资源进行主题划分,支持垂类资源建设,满足各类应用需求。
对新闻文本的内容进行分析,快速抽取核心内容摘要并展示或推送给用户,吸引用户点击并提升用户阅读效率。
通过对大量的新闻文本进行语义分析和快速摘要,可以快速形成热点汇总类、新闻聚合类、事件盘点类的新闻稿件,进行自动写作和辅助写作,提升新闻生产效率。
语音播报场景往往有严格的字数要求,新闻摘要能够自动生成符合字数规范且表达通顺的信息,在提升用户体验的同时,也提升了播报效率。
三、使用攻略
说明:本文采用C# 语言,开发环境为.Net Core 3.1,采用在线API接口方式实现。
(1)接口文档
(1-1) 文章标签
文档地址:https://ai.baidu.com/ai-doc/NLP/7k6z52ggx
接口描述:文本标签服务对文章的标题和内容进行深度分析,输出能够反映文章关键信息的主题、话题、实体等多维度标签以及对应的置信度,该技术在个性化推荐、文章聚合、内容检索等场景具有广泛的应用价值。
请求示例:
HTTP方法: POST
请求URL: https://aip.baidubce.com/rpc/2.0/nlp/v1/keyword
Body请求示例:
{
"title":"iphone手机出现“白苹果”原因及解决办法,用苹果手机的可以看下",
"content": "如果下面的方法还是没有解决你的问题建议来我们门店看下成都市锦江区红星路三段99号银石广场24层01室。在通电的情况下掉进清水,这种情况一不需要拆机处理。尽快断电。用力甩干,但别把机器甩掉,主意要把屏幕内的水甩出来。如果屏幕残留有水滴,干后会有痕迹。^H3 放在台灯,射灯等轻微热源下让水分慢慢散去。"
}
返回示例:
{
"log_id": 4457308639853058292,
"items": [
{
"score": 0.997762,
"tag": "iphone"
},
{
"score": 0.861775,
"tag": "手机"
},
{
"score": 0.845657,
"tag": "苹果"
},
{
"score": 0.83649,
"tag": "苹果公司"
},
{
"score": 0.797243,
"tag": "数码"
}
]
}
(1-2)文章分类
文档地址:https://ai.baidu.com/ai-doc/NLP/wk6z52gxe
接口描述:对文章按照内容类型进行自动分类,首批支持娱乐、体育、科技等26个主流内容类型,为文章聚类、文本内容分析等应用提供基础技术支持。 目前支持的一级粗粒度分类类目如下:1、国际 2、体育 3、娱乐 4、社会 5、财经 6、时事 7、科技 8、情感 9、汽车 10、教育 11、时尚 12、游戏 13、军事 14、旅游 15、美食 16、文化 17、健康养生 18、搞笑 19、家居 20、动漫 21、宠物 22、母婴育儿 23、星座运势 24、历史 25、音乐 26、综合
请求示例:
HTTP方法: POST
请求URL: https://aip.baidubce.com/rpc/2.0/nlp/v1/topic
Body请求示例:
{
"title":"欧洲冠军联赛",
"content": "欧洲冠军联赛是欧洲足球协会联盟主办的年度足球比赛,代表欧洲俱乐部足球最高荣誉和水平,被认为是全世界最高素质、最具影响力以及最高水平的俱乐部赛事,亦是世界上奖金最高的足球赛事和体育赛事之一。"
}
返回示例:
{
"log_id": 3591049593939822907,
"item": {
"lv2_tag_list": [
{
"score": 0.877436,
"tag": "足球"
},
{
"score": 0.793682,
"tag": "国际足球"
},
{
"score": 0.775911,
"tag": "英超"
}
],
"lv1_tag_list": [
{
"score": 0.824329,
"tag": "体育"
}
]
}
}
(1-3)新闻摘要
文档地址:https://ai.baidu.com/ai-doc/NLP/Gk6z52hu3
接口描述:自动抽取新闻文本中的关键信息,进而生成指定长度的新闻摘要
请求示例:
HTTP方法: POST
请求URL: https://aip.baidubce.com/rpc/2.0/nlp/v1/news_summary
Body请求示例:
{
"title": "麻省理工学院为无人机配备RFID技术,进行仓库货物管理",
"content": "麻省理工学院的研究团队为无人机在仓库中使用RFID技术进行库存查找等工作,创造了一种聪明的新方式。它允许公司使用更小,更安全的无人机在巨型建筑物中找到之前无法找到的东西。使用RFID标签更换仓库中的条形码,将帮助提升自动化并提高库存管理的准确性。与条形码不同,RFID标签不需要对准扫描,标签上包含的信息可以更广泛和更容易地更改。它们也可以很便宜,尽管有优点,但是它具有局限性,对于跟踪商品没有设定RFID标准,“标签冲突”可能会阻止读卡器同时从多个标签上拾取信号。扫描RFID标签的方式也会在大型仓库内引起尴尬的问题。固定的RFID阅读器和阅读器天线只能扫描通过设定阈值的标签,手持式读取器需要人员出去手动扫描物品。几家公司已经解决了无人机读取RFID的技术问题。配有RFID读卡器的无人机可以代替库存盘点的人物,并以更少的麻烦更快地完成工作。一个人需要梯子或电梯进入的高箱,可以通过无人机很容易地达到,无人机可以被编程为独立地导航空间,并且他们比执行大规模的重复任务的准确性和效率要比人类更好。目前市场上的RFID无人机需要庞大的读卡器才能连接到无人机的本身。这意味着它们必须足够大,以支持附加硬件的尺寸和重量,使其存在坠机风险。麻省理工学院的新解决方案,名为Rfly,允许无人机阅读RFID标签,而不用捆绑巨型读卡器。相反,无人机配备了一个微小的继电器,它像Wi-Fi中继器一样。无人机接收从远程RFID读取器发送的信号,然后转发它读取附近的标签。由于继电器很小,这意味着可以使用更小巧的无人机,可以使用塑料零件,可以适应较窄的空间,不会造成人身伤害的危险。麻省理工学院的Rfly系统本质上是对现有技术的一个聪明的补充,它不仅消除了额外的RFID读取器,而且由于它是一个更轻的解决方案,允许小型无人机与大型无人机做同样的工作。研究团队正在马萨诸塞州的零售商测试该系统。",
"max_summary_len":200
}
返回示例:
{
"log_id": 7310552510652020090,
"summary": "麻省理工学院的研究团队为无人机在仓库中使用RFID技术进行库存查找等工作,创造了一种聪明的新方式。使用RFID标签更换仓库中的条形码,将帮助提升自动化并提高库存管理的准确性。几家公司已经解决了无人机读取RFID的技术问题。麻省理工学院的新解决方案,名为Rfly,允许无人机阅读RFID标签,而不用捆绑巨型读卡器。无人机接收从远程RFID读取器发送的信号,然后转发它读取附近的标签。"
}
注意:文章标签、文章分类,可以使用GBK,或UTF-8编码输入/返回内容,但是新闻摘要只能使用GBK编码输入。
默认输入/返回内容为GBK编码,若用户指定输入为UTF-8编码(通过指定charset参数),则返回内容为UTF-8编码,例如:
https://aip.baidubce.com/rpc/2.0/nlp/v1/lexer?charset=UTF-8&access_token=24.f9ba9c5241b67688bb4adbed8bc91dec.2592000.1485570332.282335-8574074
具体关于输入参数、输出参数、错误码等说明,请参考开发文档,这里不再罗列。
(2)源码共享
(2-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;
}
(2-2)调用API接口获取识别结果
(2-2-1) 建立Index.cshtml文件
(2-2-1-1)前台代码:
由于html代码无法原生显示,只能简单说明一下:
主要是一个form表单;
form表单里面有几个控件:
一个Input:type="text",asp-for="Title" ,输入标题;
一个Input:type="text",asp-for="Text" ,输入内容;
一个Input:type="submit",asp-page-handler="NewsInfo" ,提交请求。
最后显示后台 msg 字符串列表信息,如果需要输出原始Html代码,则需要使用@Html.Raw()函数。
(2-2-1-2) 后台代码:
主程序代码:
[BindProperty]
public string Title { get; set; }
[BindProperty]
public string Text { get; set; }
public List msg = new List();
string NLP_Keyword="v1/keyword";
string NLP_Topic="v1/topic";
string NLP_NewsSummary="v1/news_summary";
string NLP_API_KEY="你的自然语言处理SECRET_KEY";
string NLP_SECRET_KEY="你的自然语言处理SECRET_KEY";
public NLPModel()
{
}
public void OnGet()
{
}
public async Task OnPostNewsInfoAsync()
{
if (string.IsNullOrEmpty(Title) || string.IsNullOrEmpty(Text))
{
ModelState.AddModelError(string.Empty, "请输入标题和具体内容!");
}
if (!ModelState.IsValid)
{
return Page();
}
msg = new List();
try
{
string curString = "";
DateTime startTime = DateTime.Now;
string result = GetNLPJson(NLP_Keyword, Title, Text, NLP_API_KEY, NLP_SECRET_KEY);
DateTime endTime = DateTime.Now;
TimeSpan ts = endTime - startTime;
JObject jo = (JObject)JsonStringToObj(result);
List msgList = jo["items"].ToList();
curString += "文章标签(耗时" + ts.TotalSeconds + "秒):";
foreach (JToken ms in msgList)
{
curString += "" + ms["tag"].ToString() + "(" + ms["score"].ToString() + ") ";
}
msg.Add(curString);
startTime = DateTime.Now;
result = GetNLPJson(NLP_Topic, Title, Text, NLP_API_KEY, NLP_SECRET_KEY);
endTime = DateTime.Now;
ts = endTime - startTime;
curString = "";
jo = (JObject)JsonStringToObj(result);
msgList = jo["item"]["lv2_tag_list"].ToList();
msg.Add("文章分类(耗时" + ts.TotalSeconds + "秒):\n");
msg.Add("一级分类:" + jo["item"]["lv1_tag_list"].ToList()[0]["tag"].ToString() + "(" + jo["item"]["lv1_tag_list"].ToList()[0]["score"].ToString() + ")");
if (msgList.Count > 0)
{
curString += "二级分类:";
foreach (JToken ms in msgList)
{
curString += "" + ms["tag"].ToString() + "(" + ms["score"].ToString() + ") ";
}
}
else
{
curString += "二级分类:无";
}
msg.Add(curString);
startTime = DateTime.Now;
result = GetNLPJson(NLP_NewsSummary, Title, Text, NLP_API_KEY, NLP_SECRET_KEY, 200);
endTime = DateTime.Now;
ts = endTime - startTime;
curString = "";
jo = (JObject)JsonStringToObj(result);
msg.Add("新闻摘要(耗时" + ts.TotalSeconds + "秒):\n");
msg.Add("" + jo["summary"].ToString());
}
catch (Exception e)
{
msg.Add(e.Message.ToString());
}
return Page();
}
其他相关函数:
///
/// 自然语言处理Json字符串
///
/// 自然语言处理类型
/// 标题
/// 内容
/// API Key
/// Secret Key
/// 摘要结果的最大长度(推荐最优区间:200-500字)
///
public static string GetNLPJson(string nlpType, string title, string content, string clientId, string clientSecret, int maxSummaryLen = 0)
{
string token = GetAccessToken(clientId, clientSecret);
string host = "https://aip.baidubce.com/rpc/2.0/nlp/" + nlpType + "?access_token=" + token;
Encoding encoding = Encoding.GetEncoding("GBK");
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
request.Method = "post";
request.ContentType = "application/json";
request.KeepAlive = true;
string str = "{\"content\":\"" + content;
if (!string.IsNullOrEmpty(title))
{
str += "\",\"title\":\"" + title;
}
if (maxSummaryLen > 0)
{
str += "\",\"max_summary_len\":" + maxSummaryLen + "}";
}
else
{
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.GetEncoding("GBK"));
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、识别结果:
2.1
文章来源:https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_9036243601458957429%22%7D&n_type=1&p_from=3
2.2
文章来源:https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_10201878218274485407%22%7D&n_type=0&p_from=1
2.3
文章来源:https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_10540753603190033731%22%7D&n_type=0&p_from=1
五、测试结果及建议
从上述测试可知,百度的文章标签、文章分类、新闻摘要等语言处理应用技术总体来说识别速度还是相当快的,文章标签和文章分类都比较准确,新闻摘要总体上语句通顺流畅,概括简洁准确,基本上可以直接拿来结合业务使用了。