*是的,这是一个AI生成的名称。
这是一个实验库,用于使用GPT / CHATGPT来帮助难以自动化任务,例如将非结构化的文本解析到结构化数据中。
Chatgpt是新的,并且倾向于幻觉,因此它将返回错误甚至不存在的数据。
另请注意,即使您两次提交完全相同的提示,ChatGpt也可能会以不同的输出甚至不同的格式做出响应。例如,它可以随机选择显示缺失值作为一个空间,或作为连字符或Na。
这意味着您无法可靠地将其纳入更大的工作流程中,并期望它始终如一地产生相同的结果。
目前,图书馆是探索性脚本的集合,这些脚本会经常失败并且没有警告。情况将发生变化,随着图书馆的成熟,将进行保障措施。
OpenAI的新GPT-4具有更高的令牌限制(意味着更长的提示),并且在解析数据中应该比GPT-3.5更好。但是,我尚未访问GPT-4,因此所有这些示例都用GPT-3.5编写。
自行使用。
您可以从Github安装库。
remotes :: install_github( " nicucalcea/RAISE " )
library( RAISE )您需要一个OpenAI API键。加薪访问密钥的最简单方法是将其保存到R环境中。
运行usethis::edit_r_environ()打开R环境文件,并添加一个包含API密钥的新行。它应该看起来像这样。
OPENAI_API_KEY = "API_KEY_HERE"
保存并重新启动。
如果您使用chatgpt,gptstudio或gpttools,则应该已经设置了。
加薪可以帮助您发送提示来chatgpt并获得响应作为表。
假设您想要一张世界上最大的建筑物及其高度的桌子。
buildings <- create_ai( " Top 10 tallest buildings in the world " ,
cols = c( " Building " , " Country " , " Developer " , " Year built " , " Height in metres " ))如上所述,GPT是一种语言模型,而不是事实搜索引擎。虽然数据可以正确,但它没有机会,需要手动检查。
假设您有电子邮件地址的列表,您想从中提取名字和姓氏。还是名称列表,您正在尝试估算他们最有可能的性别?
您可以使用GPT来增加现有数据。这是一个例子。
top_banks <- tribble( ~ bank , " HSBC Holdings " , " Lloyds Banking Group " , " Royal Bank of Scotland Group " , " Barclays " , " Standard Chartered " , " Santander UK " , " Nationwide Building Society " , " Schroders " ) | >
mutate( website = answer_ai(paste0( " Official website of " , bank , " : " )),
phone_nr = answer_ai(paste0( " Customer service number of " , bank , " : " )))在这种情况下,该函数将为您的每个行调用API,并将其保存对新列的响应。
GPT似乎擅长从非结构化文本中解析数据。
让我们以会员的财务利益的注册,这是一个臭名昭著的笨拙数据库,使得很难跟踪随着时间的推移的变化。
library( tidyverse )
mps <- read_csv( " https://raw.githubusercontent.com/sparkd/mp-financial-interests/master/data/financial-interests-2010-18.csv " ) | >
filter( type_code == 1 ) | >
head( 100 )
mps_structured <- extract_ai( mps $ description ,
cols = c( " date " , " sum " , " donor " , " donor_address " , " purpose " , " hours " , " date_registered " ))另一个例子:
addresses <- c( " Majestic Distribution, Halesfield 2, Telford TF7 4QH " , " 1 Reeves Drive, Petersfield GU31 4FN " , " 9 Hawthorn Cottages, Hook Lane, Welling DA16 2LD " , " 4 Silvester Road, Castor PE5 7BA " , " 11 St Georges Close, London SE28 8QE " , " 510 Castle Wharf, East Tucker Street, Bristol BS1 6JU " , " 19 Brookside Close, Wombourne WV5 8JU " , " 384 Hough Fold Way, Bolton BL2 3QA " , " 3 Hadley Croft, Smethwick B66 1DP " , " 5 Field Drive, Crawley Down RH10 4AE " , " Flat 21, Beadnall House, 5 Lingwood Court, Thornaby TS17 0BF " , " 29 St Leonards Close, Bridgnorth WV16 4EJ " , " 3 Colville Road, Bournemouth BH5 2AG " , " Fferm Ganol, Llaithddu LD1 6YS " , " 129 Scott Road, Sheffield S4 7BH " , " R A O B Club, The Exchange Building, Chapel Street, Goole DN14 5RJ " , " Flat 1, Lawrence Court, 15 Highfield South, Birkenhead CH42 4NA " , " 37 Lower Noon Sun, Birch Vale SK22 1AQ " , " 1 Church Mews, Exmouth EX8 2SJ " , " 17 Windsor Drive, Kidderminster DY10 2NA " )
addressses_parsed <- extract_ai( addresses ,
cols = c( " city " , " postcode " , " street name " , " street number " , " flat or unit number " ))在这两种情况下,GPT-3.5都提取并填充了我们要的列。
和以前一样,该过程并非没有故障,结果将需要验证,但是即使数据不是最终的,它也可以节省许多小时的体力劳动,并为我们提供快速的见解。
API在提示和答案的大小方面存在一些局限性,因此我们将查询分为块,然后重新加入零件。
这可能会在将来引发一些错误,因此这是一项正在进行的工作。
解析非结构化数据也适用于网页。让我们看一个例子。
oscar_winners <- scrape_ai( " https://edition.cnn.com/2023/03/12/entertainment/oscar-winners-2023/index.html " ,
cols = c( " category " , " winner " , " nominees " ),
clean = " text " ,
css = " div[itemprop='articleBody'] " )在这里,我们正在收到一篇CNN文章,列出了所有2023个奥斯卡奖得主,并告诉gpt可以划掉页面上的内容。它返回带有我们指定的列的表。
我们要介绍两个其他参数:
clean = "text"将我们所有的HTML标签内容剥离,这在我们的情况下很有用,因为我们不在乎格式。可以将其设置为clean = "html" ,以仅刮掉不必要的HTML,或者clean = FALSE以保留整个过程。
CSS选择器针对页面的特定部分,这意味着我们不会将整个页面带有导航菜单,侧栏等。或者,您可以使用XPath选择器。
两者都是可选的,旨在减少我们发送的提示的大小,然后降低查询的成本。
目前,网络刮板无法处理比令牌限制更大的提示。