使用 Stata 调用本地部署的大语言模型进行文本主要内容提取——历年政府工作报告中的经济增长目标提取

news2024/11/28 5:28:27

因此今天给大家分享一个新的方法。也就是通过部署在本地的大模型进行文本内容提取。

安装 Ollama

通过 Ollama 可以快速在本地部署一些常用的大模型。可以根据自己的系统从这里安装下载:https://github.com/ollama/ollama

MacOS 下载 Ollama 链接: https://ollama.com/download/Ollama-darwin.zip

Windows 下载 Ollama 链接: https://ollama.com/download/OllamaSetup.exe

Windows 用户对安装有问题的可以参考这个推文:https://blog.csdn.net/scj0725/article/details/138087028

安装完之后就可以打开 DOS(Windows 用户)或 Terminal(Mac 用户)使用相应的模型了,这里使用的是 llama3.1 模型:

ollama run llama3.1  

第一次运行的时候是安装改模型,会需要等待较长时间,后续再运行就很快了。默认安装的是 8B 参数的模型,还有 70B 和 405B 两种,这两个我也都试了,70B 的在我的电脑上运行速度极其慢(散热风扇狂转),405B 的完全无法运行,大家就不用再尝试了。

然后就可以进行提问和对话了:

如果有兴趣继续探索的话,也可以安装个用户界面(现在这种是命令访问)。

Mac 用户可以安装 Enchanted APP:

Windows 用户可以参考这个:https://github.com/open-webui/open-webui 安装用户界面,较为复杂。不建议尝试。

使用 API 调用

Ollama 可以通过 API 进行调用,这也是我们可以在 Stata 中调用的原因。打开 Ollama 之后就可以使用类似下面的 curl 语句进行调用了(在 Stata 中可以使用 !curl 调用 curl):

!curl http://localhost:11434/api/generate -d '{"model": "llama3.1", "prompt": "介绍一下微信公众号RStata", "stream": false}' 

可以在结尾加上 -o temp.json 把输出的结果保存为 temp.json 文件:

!curl http://localhost:11434/api/generate -d '{"model": "llama3.1", "prompt": "介绍一下微信公众号RStata", "stream": false}' -o temp.json 

提取历年政府工作报告中的经济增长目标

由此我们便可以提取历年政府工作报告中的经济增长目标了。附件中的 78-24政府工作报告 存放了 1978~2024 年历年的政府工作报告 txt 文件。首先我们把这些 txt 文件读取到 Stata 中:

*- 读取政府工作报告文本  
clear all  
set maxvar 12000  
set obs 47  
gen year = 1977 + _n   
gen content = ""  
forval i = 1/`=_N' {  
 local temp = fileread("78-24政府工作报告/`=year[`i']'.txt")  
 replace content = `"`temp'"' in `i'  
}  
  
*- content 里面包含了换行符,我们可以把换行符替换成空白  
gen temp = ustrregexs(0) if ustrregexm(content, "\n")  
replace content = subinstr(content, temp, "", .)  
  
*- 去除空格和双引号  
replace content = subinstr(content, " ", "", .)  
replace content = subinstr(content, `"""', "", .)  
drop temp   
  
save mydata, replace 

读取到的结果是这样的:

测试一个年份的

我们先随便找一个年份的报告文本测试下效果:

local temp = substr("`=content[20]'", 1, 3000)  
!curl http://localhost:11434/api/generate -d '{"model": "llama3.1", "prompt": "提取下面文本中的经济增长预期目标并以一个两列的markdown表格展示,一列是目标类型,一列是目标的值,不要显示无用信息:“`temp'”", "stream": false}' -o temp.json  

虽然这里没有输入文本长度的限制,但是输入太长的文本会返回无意义的结果,所以每次我只处理 1000 个字(由于每个汉字在 Stata 中的长度是 3,所以这里是 3000)。再读取处理得到的结果:

insheetjson using "temp.json", showr flatten   
clear all   
gen str1000 response = ""  
insheetjson response using "temp.json", columns("response") 

更多关于 json 文件处理的内容可以学习这个课程:

Stata 网络数据爬取:JSON篇:https://rstata.duanshu.com/#/brief/course/c6de9fae65df4eeb814d2275545e224d

然后我们循环处理该年的整篇报告文档:

use mydata, clear   
di strlen("`=content[20]'")  
*> 46776   
cap mkdir "res20"  
  
forval i = 1(3000)`=strlen("`=content[20]'")' {  
 if !fileexists("res20/`i'.json") {  
  local temp = substr("`=content[20]'", `i', 3000)  
  !curl http://localhost:11434/api/generate -d '{"model": "llama3.1", "prompt": "提取下面文本中的经济增长预期目标并以一个两列的markdown表格展示,一列是目标类型,一列是目标的值,不要显示无用信息:“`temp'”", "stream": false}' -o res20/`i'.json  
 }  
}  

这样所有的结果就都存放到 res20 文件夹里面了,再读取合并:

clear all   
gen str1000 response = ""  
local files: dir "res20" files "*.json"  
local j = 0   
foreach i in `files' {  
 insheetjson response using "res20/`i'", columns("response") offset(`j')  
 local j = `j' + 1   
}  
gen file = _n   
order file 

然后再稍加处理:

split response, parse("\n")  
drop response  
gather response*  
drop if mi(value)  
drop if !index(value, "|")  
drop var   
split value, parse("|")  
drop value   
drop value1   
foreach i of varlist _all {  
 cap format `i' %10s   
}  
  
drop if index(value2, "---")  
replace value2 = subinstr(value2, "*", "", .)   
replace value2 = subinstr(value2, " ", "", .)   
replace value3 = subinstr(value3, " ", "", .)   
  
drop if value2 == "目标类型" | value2 == "类型"  
drop if mi(value3) | value3 == "?"  
ren value2 variable   
ren value3 value   
drop file   
gen year = 1997   
order year   
save 1997提取结果, replace   
  
list in 1/10  
  
*>     +----------------------------------------------------------------------------------------+  
*>     | year                   variable                                                  value |  
*>     |----------------------------------------------------------------------------------------|  
*>  1. | 1997                 提高就业率                                   开辟多种渠道扩大就业 |  
*>  2. | 1997         加快城镇住房商品化                                       改善居民住房条件 |  
*>  3. | 1997           完善出口退税制度                                     大力推行外贸代理制 |  
*>  4. | 1997       维护国内市场竞争秩序                   加强对外商投资企业的服务、管理和监督 |  
*>  5. | 1997       稳步增长城乡人民收入                               解决群众生活中的突出问题 |  
*>     |----------------------------------------------------------------------------------------|  
*>  6. | 1997           提高对外开放水平                 增加对外贸易持续增长保持进出口基本平衡 |  
*>  7. | 1997           努力开拓新的市场           强化企业财务管理逐步建立会计师事务所审核制度 |  
*>  8. | 1997   加强农村卫生基础设施建设   改善农村卫生基础设施建设防治地方病扩大广播电视覆盖面 |  
*>  9. | 1997               解决温饱问题                               助力发展生产解决温饱问题 |  
*> 10. | 1997               新建住房面积                                             11亿平方米 |  
*>     +----------------------------------------------------------------------------------------+  

这样就提取到了所有的相关结果。

循环所有年份的

在此基础上再循环所有年份:

use mydata.dta, clear   
cap mkdir "res"  
forval z = 1/`=_N' {  
 forval i = 1(3000)`=strlen("`=content[`z']'")' {  
  if !fileexists("res/`i'_`=year[`z']'.json") {  
   local temp = substr("`=content[`z']'", `i', 3000)  
   !curl http://localhost:11434/api/generate -d '{"model": "llama3.1", "prompt": "提取下面文本中的经济增长预期目标并以一个两列的markdown表格展示,一列是目标类型,一列是目标的值,不要显示无用信息:“`temp'”", "stream": false}' -o res/`i'_`=year[`z']'.json  
  }  
 }  
}  

这个过程可能会非常耗时,我用了一整夜才运行完。

然后合并所有的 json 文件:

clear all   
gen str2000 response = ""  
local files: dir "res" files "*.json"  
local j = 0   
gen file = ""  
foreach i in `files' {  
 insheetjson response using "res/`i'", columns("response") offset(`j')  
 replace file = "`i'" in `=_N'  
 local j = `j' + 1   
}  
order file   
save rawjsondata, replace 

再整理下:

use rawjsondata, clear   
split response, parse("\n")  
drop response  
gather response*  
drop if mi(value)  
drop if !index(value, "|")  
drop var   
gen v1 = ustrregexs(1) if ustrregexm(value, "(.+)\|(.+)")  
gen v2 = ustrregexs(2) if ustrregexm(value, "(.+)\|(.+)")  
drop value   
foreach i of varlist _all {  
 cap format `i' %10s   
 replace `i' = subinstr(`i', "|", "", .)  
 replace `i' = subinstr(`i', "|", "", .)  
 replace `i' = subinstr(`i', "*", "", .)  
 replace `i' = subinstr(`i', "#", "", .)  
}  
  
drop if index(v1, "---")  
  
drop if v1 == "目标类型" | v1 == "类型"  
drop if mi(v2) | inlist(v2, "不明确", "不详")  
ren file year   
replace year = ustrregexs(1) if ustrregexm(year, "_(.*)\.")  
destring year, replace   
compress   
foreach i of varlist _all {  
 cap format `i' %10s   
}  
save tidydata, replace   
  
list in 1/10   
  
*>     +------------------------------------------------------------------------------------------+  
*>     | year                                                                 v1               v2 |  
*>     |------------------------------------------------------------------------------------------|  
*>  1. | 1978                                                          目标类型           目标值  |  
*>  2. | 1978                                    促进全国的安定团结达到天下大治             实现  |  
*>  3. | 1978                                抓纲治国战略决策一年初见成效的要求         成功实现  |  
*>  4. | 1978    把我国建设成为农业工业国防和科学技术现代化的伟大的社会主义强国     本世纪内完成  |  
*>  5. | 1978          在一个不太长久的时间内改变我国社会经济技术方面的落后状态     几十年内完成  |  
*>     |------------------------------------------------------------------------------------------|  
*>  6. | 1978                                把揭批“四人帮”这场伟大斗争进行到底             完成  |  
*>  7. | 1978                                      恢复和发扬党的优良传统和作风             实现  |  
*>  8. | 1978                                  巩固无产阶级专政的任务落实到基层             完成  |  
*>  9. | 1978                                                提高我国的国际威望         空前提高  |  
*> 10. | 1979                                                          目标类型         目标的值  |  
*>     +------------------------------------------------------------------------------------------+  

这样得到的是所有相关的结果,如果只想要经济增长率的目标,可以筛选下:

use tidydata, clear   
keep if index(v1, "增长") & ustrregexm(v1, "(国民)|(经济)|(生产)|(GDP)")  
keep if ustrregexm(v2, "%")  
gsort year   
drop if ustrregexm(v1, "(能源)|(工业)|(农业)|(播种)")  
save 待手动筛选, replace 

不过看起来还需要后续的手动筛选。不过相信到这里也能节省不少工作量了。特别是要处理的文档特别多的时候。

如何学习AI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2201318.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机的错误计算(一百一十八)

摘要 探讨一个不动点的计算精度问题。 不动点是一类特殊的循环迭代。它有形式 例1. 已知迭代[1] 计算 显然&#xff0c;每个 均为 0.5 . 不妨在Visual Studio 2010 下用下列C语言代码计算&#xff1a; #include <stdio.h> #include <math.h>int main() {do…

Mac上功能全面,免费好用的解压缩工具

在日常使用Mac的过程中&#xff0c;相信不少朋友都有解压缩需求&#xff0c;目前存在的解压缩软件可以说各种各样&#xff0c;但是有的收费&#xff0c;有的解压速度慢&#xff0c;有的解压类型不全&#xff0c;各有优缺点&#xff0c;挑选起来眼花缭乱&#xff0c;挑来挑去也没…

西安凭借入驻企业展示科技“硬”实力的数字媒体产业园

在古城西安的怀抱中&#xff0c;一座以科技“硬”实力为核心竞争力的数字媒体产业园——西安国际数字影像产业园&#xff0c;正以其独特的魅力和无限的潜力&#xff0c;吸引着全球的目光。这里&#xff0c;不仅是数字创意的孵化场&#xff0c;更是科技创新的策源地。 西安国际数…

STM32 HAL库

1. 相关概念 1.1. 回调函数 Callback()回调函数与普通函数的本质区别在于调用者不同&#xff1a;普通函数由用户代码调用&#xff0c;而回调函数则是由系统在适当的条件下调用。回调函数用于对各种事件的响应和处理&#xff0c;如当指定的EXTI线上发生中断或事件时&#xff0…

windows基于MediaPipe 和 TensorFlow.js的3D手势检测

目录 流程总结 第一步&#xff1a;安装 Node.js 和 Yarn 1.安装 Node.js&#xff1a; 1.1 如果安装了其他版本不合适&#xff0c;可以安装调整nvm-setup.exe来调整 2.安装 Yarn&#xff1a; 第二步&#xff1a;克隆项目仓库 第三步&#xff1a;替换共享文件 1.删除旧的…

Java基本数据类型和String类型的转换

1.基本介绍 在程序开发中&#xff0c;我们经常需要将基本数据类型转换成String类型。或者将String类型转为基本数据类型。 2.基本类型转String类型 语法&#xff1a;将 基本数据类型的值 “” 即可 3.String类型转基本数据类型 语法&#xff1a;通过基本类型的包装类调用…

Web3与传统互联网的比较:机遇与挑战

随着科技的不断进步&#xff0c;Web3作为新一代互联网的概念逐渐浮出水面&#xff0c;改变了我们对网络的认知。相较于传统互联网&#xff0c;Web3在许多方面展现出不同的特征与潜力。本文将对Web3与传统互联网进行比较&#xff0c;探讨其带来的机遇与挑战。 一、核心概念的差异…

MySQL启动失败解决方案

目录 引言 一、查看/启动mysql服务的两种方式 方法一&#xff1a; 方法二&#xff1a; 二、修改mysql服务启动路径的地址 三、"my.ini"文件的使用 设置my.ini文件的路径 给出一个使用my.ini文件的小例子 引言 造成启动闪退\失败的原因我仅仅以个人查询的一下博…

Note24100901_Portal_V18_Advanced5_Modscan的Modbus仿真

Note24100901_Portal_V18_Advanced5_Modscan 的Modbus TCP/IP仿真 具体过程详见如下图片&#xff1a;![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/8d85098268484044b2816d8a78c031f4.png#pic_center 以上~

搭建企业域名服务器案例

任务要求&#xff1a; 某企业要建立一台应用于以下情况的主域名服务器 拥有一个C类网段地址&#xff0c;为202.101.55.0。企业域名注册为company.com。域名服务器的IP地址定位为202.101.55.55&#xff0c;主机名为dns.company.com。企业网通过路由器与Internet连接。要解析的…

Ultralytics YOLO V11 初体验—训练COCO数据集—全流程记录

Utralytics YOLO V11&#x1f680; 之后做项目要用到YOLO&#xff0c;然后也是趁着这个机会捡一下YOLO的相关的知识&#xff0c;这篇博客记录一下&#xff0c;配置Utralytics建立一个训练YOLO的环境&#xff0c;然后使用官方提供的COCO.yaml文件进行自动下载和训练的完整过程&a…

springboot简单案例

必答[简答题]从页面输入年龄&#xff0c;输入的年龄在1-200之间为正常&#xff0c;其余定义为异常&#xff0c;并把年龄结果显示在页面上&#xff0c;同时给出判断(正常输出“年龄是XX岁“;若年龄大于200或小于0&#xff0c;输出自定义异常”年龄输入不正确“;其他显示异常情况…

从0到1:多服务厅预约小程序开发笔记(上)

需求调研 多服务厅预约小程序&#xff1a;随着信息技术的快速发展和移动互联网的普及&#xff0c;越来越多的服务行业开始向线上转型, 传统的预约方式往往效率低下&#xff0c;用户需耗费大量时间进行电话预约或现场排队&#xff0c;服务厅预约小程序集多种服务于一体&#xf…

嵌入式学习-线性表-Day04-队列

嵌入式学习-线性表-Day04-队列 队列 循环队列&#xff08;顺序队列&#xff09; 1&#xff09;创建一个空的队列 2&#xff09;入列 3&#xff09;求长度 链式队列 (1)创建一个空的队列 (2)入列 (3)出列 队列 1 什么是队列&#xff1f; 只允许在两端进行插入和删除操作的线性表…

深度学习——线性神经网络(二、线性回归的从零开始实现)

目录 2.1 生成数据集2.2 读取数据集2.3 初始化模型参数2.4 定义模型2.5 定义损失函数2.6 定义优化算法2.7 训练 2.1 生成数据集 为简单展示&#xff0c;将根据带有噪声的线性模型构造一个数据集。生成一个包含1000个样本的数据集。每个样本包含从标准正态分布中的抽样的两个特征…

RocketMq-秒杀应用场景

1、介绍mq 2、秒杀介绍 -----redis配置 3、生产者-消费者搭建 1、介绍mq 消息存储架构图中主要有下面三个跟消息存储相关的文件构成。 (1) CommitLog&#xff1a;消息主体以及元数据的存储主体&#xff0c;存储Producer端写入的消息主体内容,消息内容不是定长的。单个文件大…

微服务实战——登录(普通登录、社交登录、SSO单点登录)

登录 1.1. 用户密码 PostMapping("/login")public String login(UserLoginVo vo, RedirectAttributes redirectAttributes, HttpSession session){R r memberFeignService.login(vo);if(r.getCode() 0){MemberRespVo data r.getData("data", new Type…

价值5000元完整版GOD引擎手机客户端三端引擎源码 编译完整版

5000元完整版GOD引擎手机客户端三端引擎源码 支持三端互通&#xff1a;电脑端&#xff0c;安卓端&#xff0c;苹果端 GOD引擎全套源码及手游客户端源码&#xff08;苍穹引擎源码及修改教程&#xff09; 服务端代码为Delphir&#xff0c;手游客户端代码为cocos2dx的&#xff08;…

DAMA数据管理知识体系(第14章 大数据和数据科学)

课本内容 14.1 引言 概要 从数据中探究、研发预测模型、机器学习模型、规范性模型和分析方法并将研发结果进行部署供相关方分析的人&#xff0c;被称为数据科学家业务驱动 期望抓住从多种流程生成的数据集中发现的商机&#xff0c;是提升一个组织大数据和数据科学能力的最大业务…

论文阅读(十二):Attention is All You Need

文章目录 一、循环神经网络1.1RNN模型1.1.1RNN模型简介1.1.2RNN基本结构1.1.3权重共享机制1.1.4RNN局限性&#xff1a;长期依赖问题与梯度消失 1.2LSTM模型1.2.1LSTM核心思想1.2.2遗忘门1.2.3输入门1.2.4更新细胞状态1.2.5输出门1.2.6参数更新 二、Seq2Seq机制2.1RNN结构的局限…