În acest weekend am avut ceva timp pe mâini și am decis să construiesc un instrument de analiză a sentimentului Twitter.

Ideea este că introduceți un termen de căutare și instrumentul va căuta tweet-uri recente. Apoi va folosi analiza sentimentelor pentru a determina cât de pozitiv sau negativ este Twitter în legătură cu subiectul.

De exemplu, puteți căuta „Donald Trump” pentru a obține sentimentul Twitter asupra președintelui.

Hai să ne scufundăm!

Obținerea unei chei API Twitter

Primul lucru pe care trebuie să-l facem este să creăm o aplicație Twitter pentru a obține o cheie API.

Mergeți la Pagina de aplicații Twitter pentru a crea o nouă aplicație. Trebuie să aveți un cont de dezvoltator pentru a putea crea o aplicație.

Dacă nu aveți un cont de dezvoltator, puteți solicita unul. Majoritatea cererilor sunt acordate instantaneu. ?

Copiați fișierul API Key și API Key Secret pe care îl găsiți în aplicația dvs. Twitter.

Crearea unui proiect NodeJS

Voi folosi NodeJS pentru a crea această aplicație.

Pentru a crea un proiect nou, rulez:

npm init
npm install twitter-lite

Aceasta va crea un nou proiect NodeJS și va instala fișierul twitter-lite pachet. Acest pachet facilitează interacțiunea cu API-ul Twitter.

Pentru a autentifica solicitările noastre, vom folosi un simbol portator OAuth2.0. twitter-lite pachetul are o modalitate ușoară de a gestiona autentificarea Twitter.

Să creăm un nou index.js fișier și adăugați următorul cod:

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);
    }
})();

Când rulați acest lucru, consola produce următoarele:

Got the following Bearer token from Twitter: THE_TWITTER_BEARER_TOKEN

Minunat, până acum totul funcționează. ?

Se primesc tweet-uri recente

Următoarea parte este preluarea tweet-urilor recente din API-ul Twitter.

Pe Documentație Twitter puteți vedea că există un punct final pentru a căuta tweeturi recente.

Pentru a implementa acest lucru, adaug următorul cod la index.js fişier:

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);
    }
})();

Când rulați acest lucru, puteți vedea o mulțime de comentarii pe Twitter despre Lionel Messi, ceea ce înseamnă că funcționează perfect! ⚽

"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... 

Efectuarea analizei sentimentelor

Pentru a efectua analiza sentimentelor, voi folosi API-ul Natural Language din Google Cloud. Cu acest API puteți obține scorul de sentiment al unui text printr-un simplu apel API.

În primul rând, mergeți la Consola Google Cloud pentru a crea un nou proiect cloud.

Apoi, mergeți la API pentru limbaj natural și activați-l pentru proiect.

În cele din urmă, trebuie să creăm un cont de serviciu pentru a ne autentifica. Mergeți la creați o pagină de cont de serviciu pentru a crea un cont de serviciu.

Când creați un cont de serviciu, va trebui să descărcați fișierul json fișier care conține cheia privată a acelui cont de serviciu. Stocați acest fișier în folderul proiectului.

Google are un pachet NodeJS pentru a interacționa cu API-ul Natural Language, așa că hai să îl folosim. Pentru al instala, rulați:

npm install @google-cloud/language

Pentru ca pachetul de limbă să funcționeze, trebuie să știe unde este fișierul cu cheie privată.

Pachetul va încerca să citească un GOOGLE_APPLICATION_CREDENTIALS variabilă de mediu care ar trebui să indice acest fișier.

Pentru a seta această variabilă de mediu actualizez fișierul script cheie în package.json fişier.

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

Rețineți că, pentru ca acest lucru să funcționeze, trebuie să porniți scriptul rulând npm run start.

Cu toate aceste setări, putem începe în cele din urmă codarea.

Adaug un nou getSentiment funcție la index.js fişier:

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;
}

Această funcție apelează Google Natural Language API și returnează un scor de opinie între -1 și 1.

Să testăm cu câteva exemple:

getSentiment("I HATE MESSI");

Returnează următoarele.

The sentiment score is -0.40

În mod similar:

getSentiment("I LOVE MESSI");

Returnează un sentiment mai înalt. ?

The sentiment score is 0.89

Aducând totul împreună

Ultimul lucru de făcut este să chemați getSetiment funcționează cu textul din tweets.

Există însă o captură: doar primele 5.000 de cereri API sunt gratuite, după care Google vă va taxa pentru cererile API ulterioare.

Pentru a minimiza cantitatea de apeluri API, voi combina toate tweet-urile într-un singur șir astfel:

let allTweets = "";
for (tweet of response.statuses) {
	allTweets += tweet.text + "n";
}

const sentimentScore = await getSentimentScore(allTweets);
console.log(`The sentiment about ${query} is: ${sentimentScore}`);

Acum trebuie să apelez API-ul o singură dată în loc de 100 de ori.

Întrebarea finală este desigur: ce părere are Twitter despre Lionel Messi? Când rulați programul, acesta oferă următoarea ieșire:

The sentiment about Lionel Messi is: 0.2

Deci, Twitter este ușor pozitiv în legătură cu Lionel Messi.

Concluzie

Am creat un program NodeJS care interacționează cu API-ul Twitter pentru a obține tweet-uri recente. Apoi trimite aceste tweets către API-ul Google Cloud Natural Language pentru a efectua o analiză a sentimentului.

Puteți găsi o versiune live a acestui lucru analiza sentimentului aici.

De asemenea, puteți vizualiza codul completat aici pe Github.