使用 R 语言调用百度大脑自然语言处理接口进行文本情感倾向分析

在之前的课程中我们讲解过如何使用情感分析词典进行文本情感分析,今天我们再来学习下如何使用 R 语言调用百度大脑自然语言处理接口进行文本情感分析。

百度文本情感倾向分析接口的介绍文档在这里:https://ai.baidu.com/ai-doc/NLP/zk6z52hds

创建应用

首先我们需要在控制台找到自然语言处理:https://console.bce.baidu.com/ai/#/ai/nlp/overview/index,点击开通:

然后创建一个应用,创建后就可以看到这个应用了:

API Key 和 Secret Key 就是我们需要在代码中调用的东西,大家需要替换成自己的。

获取 accsee_token

根据情感倾向分析接口的文档介绍,我们需要先根据 API Key 和 Secret Key 请求获取 access_token:

library(tidyverse)
library(jsonlite)
library(httr)

fromJSON("https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=ihMCIBjFFbM1BAVbE7ZEfzfS&client_secret=vFqK1tCbreAqxjGC5cSb1EVG85jwghq3") -> lst

lst$access_token

#> [1] "24.883680f7b5a1189c72e42a3a95167861.2592000.1708524795.282335-47744751"

调用情感倾向分析接口

然后就可以使用这个 access_token 调用情感倾向分析接口了:

POST(paste0("https://aip.baidubce.com/rpc/2.0/nlp/v1/sentiment_classify?charset=UTF-8&access_token=", lst$access_token),
httr::add_headers(.headers = c(
'Content-Type' = 'application/json',
'Accept' = 'application/json'
)),
body = '{"text":"我爱祖国"}') -> res

content(res) %>%
listviewer::jsonedit(mode = "code")

也可以把结果整理成数据框:

content(res) -> reslst
reslst$items %>%
transpose() %>%
as_tibble() %>%
unnest() %>%
mutate(text = reslst$text) %>%
select(text, everything())
#> # A tibble: 1 × 5
#> text confidence negative_prob positive_prob sentiment
#> <chr> <dbl> <dbl> <dbl> <int>
#> 1 我爱祖国 0.887 0.0507 0.949 2

为了更方便使用,我们可以编写一个函数:

bd_senti <- function(x, access_token = lst$access_token) {
httr::POST(paste0("https://aip.baidubce.com/rpc/2.0/nlp/v1/sentiment_classify?charset=UTF-8&access_token=", access_token),
httr::add_headers(.headers = c(
'Content-Type' = 'application/json',
'Accept' = 'application/json'
)),
body = paste0('{"text":"', x, '"}')) %>%
content() -> reslst
reslst$items %>%
transpose() %>%
as_tibble() %>%
unnest() %>%
mutate(text = reslst$text) %>%
select(text, everything())
}

bd_senti("我爱祖国")

#> # A tibble: 1 × 5
#> text confidence negative_prob positive_prob sentiment
#> <chr> <dbl> <dbl> <dbl> <int>
#> 1 我爱祖国 0.887 0.0507 0.949 2

bd_senti("床前明月光,疑似地上霜,举头望明月,低头思故乡。")

#> # A tibble: 1 × 5
#> text confidence negative_prob positive_prob sentiment
#> <chr> <dbl> <dbl> <dbl> <int>
#> 1 床前明月光,疑似地上霜,举头… 0.825 0.0786 0.921 2

结果中的几个变量分别表示:

  1. sentiment:表示情感极性分类结果,0:负向,1:中性,2:正向
  2. confidence:表示分类的置信度,取值范围[0,1]
  3. positive_prob:表示属于积极类别的概率 ,取值范围[0,1]
  4. negative_prob:表示属于消极类别的概率,取值范围[0,1]

使用示例

例如我们以 2022 年平安银行的年报文本为例进行分析。

首先提取文本,按照句子拆分:

library(pdftools)
library(tidytext)
pdf_text("2022.PDF") %>%
paste0(collapse = " ") %>%
as_tibble() %>%
unnest_tokens(sentences, value, token = stringr::str_split, pattern = "。") -> df1

df1 %>%
mutate(sentences = str_remove_all(sentences, "[\\s\\n\\t]")) -> df1

df1

#> # A tibble: 1,862 × 1
#> sentences
#> <chr>
#> 1 平安银行股份有限公司2022年年度报告平安银行股份有限公司重要提示2022年年度报告…
#> 2 2、本行董事长谢永林、行长胡跃飞、副行长兼首席财务官项有志、会计机构负责人朱…
#> 3 3、本行第十二届董事会第六次会议审议了2022年年度报告正文及摘要
#> 4 本次董事会会议应出席董事13人,实到董事12人
#> 5 独立董事蔡洪滨因事未出席会议,委托独立董事杨如生行使表决权
#> 6 会议一致同意本报告
#> 7 4、安永华明会计师事务所(特殊普通合伙)根据国内审计准则对本行编制的2022年度…
#> 8 5、本报告涉及未来计划等前瞻性陈述不构成本行对投资者的实质承诺,投资者及相关…
#> 9 6、本行请投资者认真阅读本年度报告全文,并特别注意下列风险因素:本行经营中面…
#> 10 7、本行经本次董事会审议通过的普通股利润分配预案为:以本行2022年12月31日的总…
#> # ℹ 1,852 more rows

由于时间和费用关系(需要注意调用这个接口是需要付费的),所以这里我仅仅随机抽取 20 个句子处理:

# 情感分析
df1 %>%
slice_sample(n = 20) -> df1_sample

df1_sample %>%
mutate(res = map(sentences, bd_senti)) -> df1_res

df1_res %>%
unnest(res)

#> # A tibble: 20 × 6
#> sentences text confidence negative_prob positive_prob sentiment
#> <chr> <chr> <dbl> <dbl> <dbl> <int>
#> 1 "本行宣派和支付优先股… 本行… 0.352 0.292 0.708 2
#> 2 "本集团及本行建立了完… 本集… 0.873 0.0570 0.943 2
#> 3 "非零售业务风险分组为… 非零… 0.486 0.769 0.231 0
#> 4 "78平安银行股份有限公… 78平… 0.733 0.120 0.880 2
#> 5 "如果拥有以净额结算当… 如果… 0.941 0.973 0.0267 0
#> 6 "坚持以客户为中心,持… 坚持… 0.999 0.000636 0.999 2
#> 7 "2.关键控制的设计和执… 2.关… 0.944 0.0254 0.975 2
#> 8 "2022年,本行启动打造… 2022… 0.813 0.0841 0.916 2
#> 9 "持续精进电子化交易技… 持续… 0.934 0.0297 0.970 2
#> 10 "管理层认为,因本集团… 管理… 0.993 0.997 0.00310 0
#> 11 "第二,用专业能力深入… 第二… 0.994 0.00249 0.998 2
#> 12 "过去由于信用体系不完… 过去… 0.997 0.999 0.00118 0
#> 13 "一是58平安银行股份有… 一是… 0.947 0.0237 0.976 2
#> 14 "(3)外币净头寸为相关… (3)… 0.809 0.0862 0.914 2
#> 15 "有关资本管理的更详细… 有关… 0.869 0.0591 0.941 2
#> 16 "基于良好的公司治理要… 基于… 0.604 0.178 0.822 2
#> 17 "4.5.3公司董事、监事… 4.5.… 0.263 0.332 0.668 2
#> 18 "依托平安集团强大科技… 依托… 0.995 0.00214 0.998 2
#> 19 "从分类看:关注贷款占… 从分… 0.785 0.0966 0.903 2
#> 20 "本行持续通过深层次的… 本行… 0.977 0.0105 0.990 2

如果要计算的量很大,还是创建个文件夹保存每次的结果,减少重复解析量:

dir.create("sentires")

df1_sample %>%
mutate(id = row_number()) -> df1_sample
lapply(1:nrow(df1_sample), function(x){
try({
df1_sample %>%
slice(x) %>%
mutate(res = map(sentences, bd_senti)) %>%
write_rds(paste0("sentires/", x, ".rds"))
})
}) -> tempres

# 合并结果
lapply(fs::dir_ls("sentires"), readr::read_rds) %>%
bind_rows() %>%
unnest(res)

这样如果有出错的,只需要删除对应的结果文件、跳过已经运行成功的即可重新运行。

另外大家感兴趣的话,也可以自学其余的自然语言处理接口:

这里就不再一一讲解了,毕竟挺费钱的。

点击这里跳转到 RStata 短书平台获取附件:使用 R 语言调用百度大脑自然语言处理接口进行文本情感倾向分析

评论