在之前的课程中我们讲解过如何使用情感分析词典进行文本情感分析,今天我们再来学习下如何使用 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
调用情感倾向分析接口 然后就可以使用这个 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( ) )
为了更方便使用,我们可以编写一个函数:
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( "我爱祖国" ) bd_senti( "床前明月光,疑似地上霜,举头望明月,低头思故乡。" )
结果中的几个变量分别表示:
sentiment:表示情感极性分类结果,0:负向,1:中性,2:正向
confidence:表示分类的置信度,取值范围[0,1]
positive_prob:表示属于积极类别的概率 ,取值范围[0,1]
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
由于时间和费用关系(需要注意调用这个接口是需要付费的),所以这里我仅仅随机抽取 20 个句子处理:
df1 %>% slice_sample( n = 20 ) -> df1_sample df1_sample %>% mutate( res = map( sentences, bd_senti) ) -> df1_res df1_res %>% unnest( res)
如果要计算的量很大,还是创建个文件夹保存每次的结果,减少重复解析量:
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" ) ) } ) } ) -> tempreslapply( fs:: dir_ls( "sentires" ) , readr:: read_rds) %>% bind_rows( ) %>% unnest( res)
这样如果有出错的,只需要删除对应的结果文件、跳过已经运行成功的即可重新运行。
另外大家感兴趣的话,也可以自学其余的自然语言处理接口:
这里就不再一一讲解了,毕竟挺费钱的。
点击这里跳转到 RStata 短书平台获取附件:使用 R 语言调用百度大脑自然语言处理接口进行文本情感倾向分析
评论