今年年初给大家分享过一份 银保监本级、分局本级、机关行政处罚信息数据(截止 2023 年 2 月 13 日)(https://rstata.duanshu.com/#/brief/course/d9f672e0087c4f3bbe3c99fdb8c864d2) 数据。实际上这些行政处罚信息包含多种形式的,大体上是处罚决定书和处罚信息公开表,由于处罚决定书的内容比较混乱,难以整理成表格数据,所以就没有整理。
百度文心一言最近开放了 API 接口,于是我就想是不是可以调用文心一言的 API 接口自动处理这些处罚决定书文本来提取主要信息。
申请文心千帆大模型内测
首先我们需要申请文心千帆大模型内测的资格,网址是这个:https://cloud.baidu.com/product/wenxinworkshop?track=ae35a3396ecb3afe68e19773b574a198b11ace12bfeed89c
然后在文心千帆控制台创建应用:https://console.bce.baidu.com/qianfan/ais/console/applicationConsole/application

由于本课程讲解的 ERNIE-Bot 模型的调用是需要付费的,所以可以先给自己的账户充点钱,10 块钱即可。
价格如下,调用一次的价格差不多 1 分钱左右:

创建应用后可以应用列表中可以看到自己的 API Key 和 Secret Key:https://console.bce.baidu.com/qianfan/ais/console/applicationConsole/application ,注意保存好。

大家注意把课程代码中的 API key 和 Secret Key 替换成自己的。
最后再阅读 API 使用文档即可使用了:https://cloud.baidu.com/doc/WENXINWORKSHOP/s/jlil56u11 。本课程中将以 ERNIE-Bot 的使用为例进行讲解。
银保监处罚决定书关键信息提取
附件中我准备了一些 doc 格式的 word 文档,是银保监处罚决定书,例如 1091075.doc 文件:

我们的目标是从中提取如下变量:
- 年份
- 标题
- 处罚决定书文号
- 主要违法违规事实或案由
- 处罚依据
- 处罚决定
- 作出处罚决定的机关名称
- 作出处罚决定的日期
- 被处罚个人姓名
- 被处罚单位名称
- 被处罚单位的法定代表人或主要负责人姓名
- 发布时间
提供的示例数据是 doc 文件,可以使用 R 语言的 textreadr 包进行读取转换:
library(textreadr) library(tidyverse) read_dir("doc") -> docdf
docdf
docdf %>% as_tibble() %>% mutate(content = str_squish(content), length = str_length(content)) %>% arrange(desc(length)) -> docdf
docdf
|
不过有些 doc 文件似乎有问题,无法处理。我们把这些文件筛选出来:
dir.create("errordoc")
fs::dir_ls("doc") %>% as.character() %>% as_tibble() -> alldocuments
docdf %>% select(value = document) %>% mutate(value = paste0("doc/", value, ".doc")) -> successdf
alldocuments %>% anti_join(successdf) -> faildf
map(faildf$value, function(x){ file.copy(x, str_replace(x, "doc/", "errordoc/")) }) -> res
|
这些文件可以使用 word 打开,另存为 doc 文件再放回到 doc 文件夹中。然后再重复最初的 R 代码即可。这里因为时间关系,我就不再手动一个个操作了。
docdf %>% filter(length <= 1800) %>% slice(1:10) -> usedocdf
usedocdf
dir.create("usedoc") map(usedocdf$document, function(x){ file.copy(paste0("doc/", x, ".doc"), paste0("usedoc/", x, ".doc")) }) -> res
|
ERNIE-Bot 模型接口的使用
按照 API 文档的介绍,ERNIE-Bot 的使用分两步:
# 步骤一,获取access_token,替换下列示例中的API Key与Secret Key curl 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=[API Key]&client_secret=[Secret Key]'
# 步骤二,调用本文API,使用步骤一获取的access_token,替换下列示例中的”调用接口获取的access_token“ curl -XPOST 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions?access_token=[步骤一调用接口获取的access_token]' -d '{ "messages": [ {"role":"user","content":"介绍一下你自己"} ] }' | iconv -f utf-8 -t utf-8
|
curl 是一个 DOS/Shell 命令,Win10 之后的系统或者 Mac 系统都可以直接使用,旧版本的 Windows 系统需要自行安装,具体可以百度搜索下教程。在 R 语言中可以使用 httr 进行 curl 请求:
这里的代码也可以使用 https://curlconverter.com/r/ 生成。
首先创建一个对话:
library(httr) params = list( `grant_type` = "client_credentials", `client_id` = "z9kmWfmopgL6xXicRjFMzkG9", `client_secret` = "rIbhETrv7n5bVFH7octw6aM9Hd594h1v" )
GET(url = "https://aip.baidubce.com/oauth/2.0/token", query = params) %>% content() -> lst lst$session_secret -> access_token access_token
|
然后就可以循环提问了:
为了便于处理,所有的提问我都采取这种格式:
阅读这段话:“……”,提取年份、标题、处罚决定书文号、主要违法违规事实或案由、处罚依据、处罚决定、作出处罚决定的机关名称、作出处罚决定的日期、被处罚个人姓名、被处罚单位名称、被处罚单位的法定代表人或主要负责人姓名 、发布时间、罚款金额信息。结果使用文本表示,用数字对结果进行编号。
dir.create("rds") lapply(1:nrow(usedocdf), function(x){ if (!file.exists(paste0("rds/", usedocdf$document[x], ".rds"))) { POST(url = paste0("https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions?access_token=", access_token), body = paste0('{"messages":[{"role":"user","content":"阅读这段话:“', usedocdf$content[x], '”,提取年份、标题、处罚决定书文号、主要违法违规事实或案由、处罚依据、处罚决定、作出处罚决定的机关名称、作出处罚决定的日期、被处罚个人姓名、被处罚单位名称、被处罚单位的法定代表人或主要负责人姓名、发布时间、罚款金额信息。结果使用文本表示,用数字对结果进行编号"}]}')) %>% content() %>% write_rds(paste0("rds/", usedocdf$document[x], ".rds")) } }) -> res
read_rds("rds/1057466.rds") -> lst lst$result
|
等所有的文档都处理好了再合并结果:
usedocdf %>% mutate(result = map_chr(document, function(x){ read_rds(paste0("rds/", x, ".rds")) -> lst lst$result })) -> usedocdf2
usedocdf2
|
然后就可以提取所需要的信息了:
usedocdf2 %>% select(-content, -length) %>% mutate(result = str_replace_all(result, "\\n", " "), result = str_replace_all(result, ":", ":")) %>% tidyr::extract( col = "result", into = c("年份", "标题", "处罚决定书文号", "主要违法违规事实或案由", "处罚依据", "处罚决定", "作出处罚决定的机关名称", "作出处罚决定的日期", "被处罚个人姓名", "被处罚单位名称", "被处罚单位的法定代表人或主要负责人姓名", "发布时间", "罚款金额"), regex = "1\\. 年份:(.*) 2\\. 标题:(.*) 3\\. 处罚决定书文号:(.*) 4\\. 主要违法违规事实或案由:(.*) 5\\. 处罚依据:(.*) 6\\. 处罚决定:(.*) 7\\. 作出处罚决定的机关名称:(.*) 8\\. 作出处罚决定的日期:(.*) 9\\. 被处罚个人姓名:(.*) 10\\. 被处罚单位名称:(.*) 11\\. 被处罚单位的法定代表人或主要负责人姓名:(.*) 12\\. 发布时间:(.*) 13\\. 罚款金额:(.*)", remove = F ) %>% mutate(年份 = str_remove_all(年份, "年")) %>% type_convert() -> usedocdf2
usedocdf2
usedocdf2 %>% writexl::write_xlsx("处理结果.xlsx")
|
看起来效果还挺不错!
应用这个技术就可以快速处理文本数据并提取关键变量了!
点击这里跳转到 RStata 短书平台获取附件:R 语言:调用百度文心千帆大模型进行文本分析与文本主要内容提取
评论