Cómo construir una herramienta de análisis de sentimientos de Twitter

Este fin de semana tuve algo de tiempo en mis manos y decidí crear una herramienta de análisis de sentimientos de Twitter.

La idea es que ingrese un término de búsqueda y la herramienta buscará tweets recientes. Luego utilizará el análisis de sentimientos para determinar qué tan positivo o negativo es Twitter sobre el tema.

Por ejemplo, puede buscar "Donald Trump" para conocer la opinión de Twitter sobre el presidente.

¡Vamos a sumergirnos!

Obtener una clave API de Twitter

Lo primero que debemos hacer es crear una aplicación de Twitter para obtener una clave API.

Dirígete a la página de aplicaciones de Twitter para crear una nueva aplicación. Debe tener una cuenta de desarrollador para poder crear una aplicación.

Si no tiene una cuenta de desarrollador, puede solicitar una. La mayoría de las solicitudes se conceden al instante. ?

Copie el API Keyy API Key Secretque encuentre en su aplicación de Twitter.

Creando un proyecto NodeJS

Voy a usar NodeJS para crear esta aplicación.

Para crear un nuevo proyecto ejecuto:

npm init npm install twitter-lite

Esto creará un nuevo proyecto NodeJS e instalará el twitter-litepaquete. Este paquete hace que interactuar con la API de Twitter sea muy fácil.

Para autenticar nuestras solicitudes, usaremos un token de portador OAuth2.0. El twitter-litepaquete tiene una forma sencilla de manejar la autenticación de Twitter.

Creemos un nuevo index.jsarchivo y agreguemos el siguiente código:

const Twitter = require('twitter-lite'); const user = new Twitter({ consumer_key: "YOUR_API_KEY", consumer_secret: "YOUR_API_SECRET", }); // Wrap the following code in an async function that is called // immediately so that we can use "await" statements. (async function() { try { // Retrieve the bearer token from twitter. const response = await user.getBearerToken(); console.log(`Got the following Bearer token from Twitter: ${response.access_token}`); // Construct our API client with the bearer token. const app = new Twitter({ bearer_token: response.access_token, }); } catch(e) { console.log("There was an error calling the Twitter API."); console.dir(e); } })();

Al ejecutar esto, la consola genera lo siguiente:

Got the following Bearer token from Twitter: THE_TWITTER_BEARER_TOKEN

Impresionante, hasta ahora todo funciona. ?

Obtener tweets recientes

La siguiente parte es recuperar tweets recientes de la API de Twitter.

En la documentación de Twitter puede ver que hay un punto final para buscar tweets recientes.

Para implementar esto agrego el siguiente código al index.jsarchivo:

const Twitter = require('twitter-lite'); (async function() { const user = new Twitter({ consumer_key: "YOUR_API_KEY", consumer_secret: "YOUR_API_SECRET", }); try { let response = await user.getBearerToken(); const app = new Twitter({ bearer_token: response.access_token, }); // Search for recent tweets from the twitter API response = await app.get(`/search/tweets`, { q: "Lionel Messi", // The search term lang: "en", // Let's only get English tweets count: 100, // Limit the results to 100 tweets }); // Loop over all the tweets and print the text for (tweet of response.statuses) { console.dir(tweet.text); } } catch(e) { console.log("There was an error calling the Twitter API"); console.dir(e); } })();

Al ejecutar esto, puedes ver muchos comentarios de Twitter sobre Lionel Messi, lo que significa que funciona perfectamente. ⚽

"RT @TheFutbolPage: Some of Lionel Messi's best dribbles." "RT @MagufuliMugabe: Lionel Messi ? didn't just wake up one day and become the best player in the world no HE trained. So if your girl is…" ""RT @goal: The boy who would be King ? Is Ansu Fati the heir to Lionel Messi's throne?" and many more... 

Realizar análisis de sentimiento

Para realizar el análisis de sentimientos, utilizaré la API de lenguaje natural de Google Cloud. Con esta API, puede obtener la puntuación de opinión de un texto con una simple llamada a la API.

Primero, diríjase a Google Cloud Console para crear un nuevo proyecto en la nube.

A continuación, diríjase a la API de Natural Language y habilítela para el proyecto.

Finalmente, necesitamos crear una cuenta de servicio para autenticarnos. Dirígete a la página para crear una cuenta de servicio para crear una cuenta de servicio.

Al crear una cuenta de servicio, deberá descargar el jsonarchivo que contiene la clave privada de esa cuenta de servicio. Guarde este archivo en la carpeta del proyecto.

Google tiene un paquete NodeJS para interactuar con la API de Natural Language, así que usémoslo. Para instalarlo, ejecute:

npm install @google-cloud/language

Para que el paquete de idioma funcione, necesita saber dónde está el archivo de clave privada.

El paquete intentará leer una GOOGLE_APPLICATION_CREDENTIALSvariable de entorno que debería apuntar a este archivo.

Para configurar esta variable de entorno actualizo la scriptclave en el package.jsonarchivo.

"scripts": { "start": "GOOGLE_APPLICATION_CREDENTIALS='./gcloud-private-key.json' node index.js" }

Tenga en cuenta que para que esto funcione, debe iniciar el script ejecutando npm run start.

Con toda esa configuración, finalmente podemos comenzar a codificar.

Agrego una nueva getSentimentfunción al index.jsarchivo:

const language = require('@google-cloud/language'); const languageClient = new language.LanguageServiceClient(); async function getSentiment(text) { const document = { content: text, type: 'PLAIN_TEXT', }; // Detects the sentiment of the text const [result] = await languageClient.analyzeSentiment({document: document}); const sentiment = result.documentSentiment; return sentiment.score; }

Esta función llama a la API de Google Natural Language y devuelve una puntuación de opinión entre -1 y 1.

Probémoslo con algunos ejemplos:

getSentiment("I HATE MESSI");

Devuelve lo siguiente.

The sentiment score is -0.40

Similar:

getSentiment("I LOVE MESSI");

Devuelve un sentimiento más alto. ?

The sentiment score is 0.89

Reuniéndolo todo

Lo último que debe hacer es llamar a la getSetimentfunción con el texto de los tweets.

Sin embargo, hay un problema: solo las primeras 5,000 solicitudes de API son gratuitas, después de eso, Google le cobrará por las solicitudes de API posteriores.

Para minimizar la cantidad de llamadas a la API, voy a combinar todos los tweets en una sola cadena así:

let allTweets = ""; for (tweet of response.statuses) { allTweets += tweet.text + "\n"; } const sentimentScore = await getSentimentScore(allTweets); console.log(`The sentiment about ${query} is: ${sentimentScore}`);

Ahora solo tengo que llamar a la API una vez en lugar de 100 veces.

La pregunta final es, por supuesto: ¿qué piensa Twitter sobre Lionel Messi? Al ejecutar el programa, da el siguiente resultado:

The sentiment about Lionel Messi is: 0.2

Entonces, Twitter es ligeramente positivo sobre Lionel Messi.

Conclusión

We've created a NodeJS program that interacts with the Twitter API to get recent tweets. It then sends these tweets to the Google Cloud Natural Language API to perform a sentiment analysis.

You can find a live version of this sentiment analysis here.

You can also view the completed code here on Github.