Hvordan man opbygger et Twitter-sentimentanalyseværktøj

Denne weekend havde jeg lidt tid på hænderne og besluttede at bygge et Twitter-sentimentanalyseværktøj.

Ideen er, at du indtaster et søgeudtryk, og værktøjet søger i de seneste tweets. Det vil derefter bruge sentimentanalyse til at bestemme, hvor positiv eller negativ Twitter er omkring emnet.

For eksempel kan du søge i "Donald Trump" for at få Twitters stemning over præsidenten.

Lad os dykke ind!

Få en Twitter API-nøgle

Den allerførste ting, vi skal gøre, er at oprette en Twitter-applikation for at få en API-nøgle.

Gå over til Twitter-appsiden for at oprette en ny applikation. Du skal have en udviklerkonto for at kunne oprette en applikation.

Hvis du ikke har en udviklerkonto, kan du ansøge om en. De fleste anmodninger imødekommes øjeblikkeligt. ?

Kopiér det API Keyog API Key Secretdu finder i din Twitter-applikation.

Oprettelse af et NodeJS-projekt

Jeg vil bruge NodeJS til at oprette denne applikation.

For at oprette et nyt projekt, jeg kører:

npm init npm install twitter-lite

Dette opretter et nyt NodeJS-projekt og installerer twitter-litepakken. Denne pakke gør det nemt at interagere med Twitter API.

For at godkende vores anmodninger skal vi bruge et OAuth2.0-bærertoken. Den twitter-litepakke har en nem måde at håndtere den Twitter-godkendelse.

Lad os oprette en ny index.jsfil og tilføje følgende kode til den:

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

Når du kører dette, sender konsollen følgende:

Got the following Bearer token from Twitter: THE_TWITTER_BEARER_TOKEN

Fantastisk, indtil videre fungerer alt. ?

Få nylige tweets

Den næste del er at hente nylige tweets fra Twitter API.

På Twitter-dokumentationen kan du se, at der er et slutpunkt til at søge efter nylige tweets.

For at implementere dette tilføjer jeg følgende kode til index.jsfilen:

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

Når du kører dette, kan du se mange Twitter-kommentarer om Lionel Messi, hvilket betyder at det fungerer perfekt! ⚽

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

Udfører sentimentanalyse

For at udføre sentimentanalysen skal jeg bruge Google Clouds Natural Language API. Med denne API kan du få sentiment score på en tekst med et simpelt API-opkald.

Gå først til Google Cloud Console for at oprette et nyt cloud-projekt.

Gå derefter over til Natural Language API og aktiver det til projektet.

Endelig er vi nødt til at oprette en servicekonto for at godkende os selv. Gå over til siden Opret en servicekonto for at oprette en servicekonto.

Når du opretter en servicekonto, skal du downloade jsonfilen med den private nøgle til den pågældende servicekonto. Gem denne fil i projektmappen.

Google har en NodeJS-pakke til at interagere med Natural Language API, så lad os bruge det. For at installere det køres:

npm install @google-cloud/language

For at sprogpakken skal fungere, skal den vide, hvor den private nøglefil er.

Pakken forsøger at læse en GOOGLE_APPLICATION_CREDENTIALSmiljøvariabel, der skal pege på denne fil.

For at indstille denne miljøvariabel opdaterer jeg scriptnøglen i package.jsonfilen.

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

Bemærk, at for at dette skal fungere, skal du starte scriptet ved at køre npm run start.

Med alt dette opsat kan vi endelig begynde at kode.

Jeg tilføjer en ny getSentimentfunktion til index.jsfilen:

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

Denne funktion kalder Google Natural Language API og returnerer en sentiment score mellem -1 og 1.

Lad os teste det med et par eksempler:

getSentiment("I HATE MESSI");

Returnerer følgende.

The sentiment score is -0.40

Tilsvarende:

getSentiment("I LOVE MESSI");

Returnerer et højere sentiment. ?

The sentiment score is 0.89

At bringe det hele sammen

Den sidste ting at gøre er at ringe til getSetimentfunktionen med teksten fra tweets.

Der er dog en fangst: kun de første 5.000 API-anmodninger er gratis, derefter opkræver Google dig for efterfølgende API-anmodninger.

For at minimere antallet af API-opkald vil jeg kombinere alle tweets i en enkelt streng sådan:

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

Nu skal jeg kun ringe til API én gang i stedet for 100 gange.

Det sidste spørgsmål er selvfølgelig: hvad synes Twitter om Lionel Messi? Når programmet køres, giver det følgende output:

The sentiment about Lionel Messi is: 0.2

Så Twitter er let positiv over for Lionel Messi.

Konklusion

Vi har oprettet et NodeJS-program, der interagerer med Twitter API for at få nylige tweets. Derefter sender de disse tweets til Google Cloud Natural Language API for at udføre en sentimentanalyse.

Du kan finde en live version af denne sentimentanalyse her.

Du kan også se den færdige kode her på Github.