返回Excel催化剂目录

产品文档 / 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供调用即可。