产品文档 / Excel催化剂
第25波-Excel调用百度AI,返回AI结果
在专业程序猿世界中,调用现成的WebAPI接口,实现一些别人提供的能力,是很常见的事情,其实在VBA开发者中,也不乏有这样的应用,例如调用某个网页API,返回一个二维码,实现二维码生成功能(在.Net中,直接有现成的这些轮子,无需调用网页,直接本地离线即可生成)。 当然在AI时代,少不了各种AI接口
在专业程序猿世界中,调用现成的WebAPI接口,实现一些别人提供的能力,是很常见的事情,其实在VBA开发者中,也不乏有这样的应用,例如调用某个网页API,返回一个二维码,实现二维码生成功能(在.Net中,直接有现成的这些轮子,无需调用网页,直接本地离线即可生成)。
当然在AI时代,少不了各种AI接口的使用场景,普通开发者只需聚焦在自己的业务场景上,这些AI底层技术,只需类似水煤电一般去BAT这些大厂那里去消费即可,作一个AI接口的消费者,将AI的能力接入到自己的应用中,这也是一个不错的创新之举。
当然Excel催化剂专注于数据分析领域,当然少不了AI的能力,将文本世界中的非结构化数据进行结构化分析,是数据分析的一个很大的应用场景。
具体实现功能
在注流的程序语言中,其实各大厂商会给予封装好现在的SDK,类似我们日常调用Excel功能一样,只需简单传入几个参数,即可实现某些特定功能,无需从头开始,调用网页接口,再解释网页内容,获取自己想要的内容这么繁琐。
百度AI的SDK获取,可由百度官方AI后台获取。具体可自行进入后台获取,并进行相应的简单学习。

其实SDK就是供给我们引用的dll文件而已。

Excel催化剂实现的AI是自然语言处理和翻译两大类(翻译好像不在这个AI当中,而分词的话,为了实现离线版和灵活自定义词库管理,用了结巴的库,而没有用百度的接口),现以其中的评论分析讲解一下。
首先是入口,用窗体和用户交互
private void btnCommentAnalyze_Click(object sender, RibbonControlEventArgs e)
{
FormCommentAnalyze form = new FormCommentAnalyze();
form.StartPosition = FormStartPosition.CenterScreen;
form.Show();
}

用户配置好之后,向百度AI发出请求,并返回结构内容到Excel工作表中。
private void btnQueryExistTable_Click(object sender, EventArgs e)
{
try
{
if (Common.IsContineToRunQuery())
{
Excel.Range listObjectRange = Common.ExcelApp.InputBox(Prompt: "请选择需覆盖的现有智能表的任一单元格", Title: "智能表格区域确认", Type: 8) as Excel.Range;
if (listObjectRange != null)
{
if (listObjectRange.ListObject != null)
{
Common.ExcelApp.ScreenUpdating = false;
ListObject listObject = Globals.Factory.GetVstoObject(listObjectRange.ListObject);
OutputDataToWorksheet(listObject);
Excel.Worksheet sht = (Excel.Worksheet)listObject.Parent;
sht.Activate();
this.Close();
}
else
{
MessageBox.Show("当前选择的区域未包含智能表格,请重新选择或点击按钮【观点提取-新建智能表】把数据导出到新建工作表中");
}
}
else
{
MessageBox.Show("未检测到有选择选区的动作,请重新按提示进行操作");
}
}
}
catch (Exception ex)
{
Common.OutMsgError(ex);
}
finally
{
Common.ExcelApp.ScreenUpdating = true;
}
}
核心代码段,向百度发出AI访问
private DataTable GetDstTable(DataTable srcTable)
{
//创建目标表
var dstTable = srcTable.Clone();
dstTable.Columns.Add("原文关键词", typeof(string));
dstTable.Columns.Add("观点属性词", typeof(string));
dstTable.Columns.Add("观点描述词", typeof(string));
dstTable.Columns.Add("情感极性", typeof(string));
var client = new Baidu.Aip.Nlp.Nlp(API_KEY, SECRET_KEY);
string type = this.cmbCommentType.Text.Split('-')[0];
var options = new Dictionary<string, object> { { "type", type } };
foreach (var srcRow in srcTable.AsEnumerable())
{
try
{
// 带参数调用评论观点抽取
var result = client.CommentTag(srcRow.Field<string>(contentName), options);
Entity.CommentTagInfo commentTagInfo = JsonConvert.DeserializeObject<Entity.CommentTagInfo>(result.ToString());//.Replace("\"abstract\"", "\"_abstract\"")
if (commentTagInfo.items != null)
{
foreach (var item in commentTagInfo.items)
{
DataRow dstDataRow = dstTable.NewRow();
dstDataRow[pkColName] = srcRow.Field<string>(pkColName);
dstDataRow[contentName] = srcRow.Field<string>(contentName);
dstDataRow["原文关键词"] = Regex.Match(item.@abstract, "<span>(.+)</span>").Groups[1].Value;
dstDataRow["观点属性词"] = item.prop;
dstDataRow["观点描述词"] = item.adj;
dstDataRow["情感极性"] = item.sentiment == 0 ? "消极" : item.sentiment == 1 ? "中性" : "积极";
dstTable.Rows.Add(dstDataRow);
}
}
}
catch (Exception)
{
//可能网络访问有出错
}
}
return dstTable;
}
真正有用的代码,就是百度AI封装好的SDK的几个属性赋值和方法调用返回结构即可。
var client = new Baidu.Aip.Nlp.Nlp(API_KEY, SECRET_KEY);
string type = this.cmbCommentType.Text.Split('-')[0];
// 带参数调用评论观点抽取
var result = client.CommentTag(srcRow.Field<string>(contentName), options);
结语
从此篇的Excel借助VSTO代码,能够顺利和百度AI进行交互可知,在.Net的世界中,不一定需要多么高级的开发技术,亦能实现一些复杂的技术应用,只需要这些复杂应用,它们愿意为.Net语言写一些SDK供调用即可。