*Sí, este es un nombre generado por AI.
Esta es una biblioteca experimental para usar GPT / CHATGPT para ayudar con las tareas difíciles de automatizar, como analizar el texto no estructurado en datos estructurados.
ChatGPT es nuevo y tiende a alucinar, por lo que devolverá datos que están mal o que ni siquiera existen.
También tenga en cuenta que CHATGPT puede responder con una salida diferente o incluso un formato diferente, incluso si envía exactamente la misma solicitud dos veces. Por ejemplo, puede optar al azar mostrar los valores faltantes como un espacio, o como guión o como NA.
Esto significa que no puede incorporarlo de manera confiable a un flujo de trabajo más grande y esperar que produzca el mismo resultado de manera consistente.
Por el momento, la biblioteca es una colección de guiones exploratorios que fallarán a menudo y sin previo aviso. Las cosas cambiarán y se establecerán salvaguardas a medida que la biblioteca madure.
El nuevo GPT-4 de Openai tiene un límite de token más alto (que significa indicaciones más largas) y se supone que es mejor que GPT-3.5 en los datos de análisis. Sin embargo, aún no tengo acceso a GPT-4, por lo que todos estos ejemplos están escritos con GPT-3.5 en mente.
Use bajo su propio riesgo.
Puede instalar la biblioteca desde GitHub.
remotes :: install_github( " nicucalcea/RAISE " )
library( RAISE )Necesitarás una tecla API de OpenAI. La forma más fácil de aumentar para acceder a la clave es guardarla en su entorno R.
Ejecute usethis::edit_r_environ() para abrir su archivo de entorno R y agregar una nueva línea que contiene su clave API. Debería verse algo así.
OPENAI_API_KEY = "API_KEY_HERE"
Guárdelo y reinicie.
Si usa chatgpt, gptstudio o gpttools, ya debería estar configurado.
Raise puede ayudarlo a enviar un aviso a ChatGPT y obtener una respuesta como tabla.
Digamos que quieres una mesa de los edificios más grandes del mundo y su altura.
buildings <- create_ai( " Top 10 tallest buildings in the world " ,
cols = c( " Building " , " Country " , " Developer " , " Year built " , " Height in metres " ))Como se mencionó anteriormente, GPT es un modelo de idioma, no un motor de búsqueda objetivo. Si bien los datos pueden ser correctos, existe la posibilidad de que no lo sea y necesita verificar manualmente.
Supongamos que tiene una lista de direcciones de correo electrónico, y desea extraer el primer y apellido de ellas. ¿O una lista de nombres y estás tratando de estimar su género más probable?
Puede usar GPT para aumentar sus datos existentes. Aquí hay un ejemplo.
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 , " : " )))En este caso, la función llamará a la API para cada una de sus filas, y guardará las respuestas a una nueva columna.
GPT parece bastante bueno para analizar los datos del texto no estructurado.
Tomemos el registro de intereses financieros de los miembros, una base de datos notoriamente torpe para analizar, lo que dificulta realizar un seguimiento de los cambios con el tiempo.
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 " ))Otro ejemplo:
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 " ))En ambos casos, GPT-3.5 ha extraído y completado las columnas que pedimos.
Como antes, el proceso no está exento de fallas y los resultados deberán verificarse, pero puede ahorrar muchas horas de trabajo manual y darnos información rápida incluso si los datos no son definitivos.
La API tiene algunas limitaciones en términos de cuán grande puede ser un aviso y una respuesta, por lo que estamos dividiendo la consulta en trozos y reincorporando a las partes después.
Esto puede arrojar algunos errores en el futuro, por lo que es un trabajo en progreso.
El análisis de datos no estructurados también se aplica a las páginas web. Veamos un ejemplo.
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'] " )Aquí, estamos obteniendo un artículo de CNN que enumera a todos los ganadores de los Oscar 2023 y le dice a GPT qué raspar la página. Devuelve una tabla con las columnas que especificamos.
Hay dos parámetros adicionales que estamos alimentando en la función:
El clean = "text" elimina todo nuestro contenido de etiquetas HTML, que es útil en nuestro caso, ya que no nos importa el formato. Se puede configurar para clean = "html" para raspar solo html innecesario, o para clean = FALSE para mantener todo.
El selector CSS se dirige a una parte específica de la página, lo que significa que no enviamos la página completa con menús de navegación, barras laterales, etc. Alternativamente, puede usar un selector XPath.
Ambos son opcionales y están diseñados para reducir el tamaño del mensaje que estamos enviando, y posteriormente reducir el costo de una consulta.
Por ahora, el raspador web no puede lidiar con indicaciones más grandes que el límite de token.