Hogyan készítsünk egy Twitter hangulatelemző eszközt

Ezen a hétvégén volt egy kis idő a kezemen, és úgy döntöttem, hogy létrehozok egy Twitter-hangulatelemző eszközt.

Az ötlet az, hogy beír egy keresési kifejezést, és az eszköz a legutóbbi tweetekben fog keresni. Ezután az érzelmek elemzésével meghatározza, hogy a Twitter mennyire pozitív vagy negatív a témával kapcsolatban.

Például kereshet a "Donald Trump" kifejezésre, hogy megkapja a Twitter érzelmét az elnökkel szemben.

Merüljünk be!

Twitter API kulcs beszerzése

A legelső dolog, amit meg kell tennünk, egy Twitter alkalmazás létrehozása az API kulcs megszerzéséhez.

Új alkalmazás létrehozásához lépjen a Twitter alkalmazások oldalára. Alkalmazás létrehozásához fejlesztői fiókkal kell rendelkeznie.

Ha nincs fejlesztői fiókja, akkor pályázhat rá. A legtöbb kérést azonnal teljesítik. ?

Másolja le a API Keyés API Key Secreta Twitter alkalmazásban található és.

NodeJS projekt létrehozása

A NodeJS segítségével fogom létrehozni ezt az alkalmazást.

Az általam futtatott új projekt létrehozása:

npm init npm install twitter-lite

Ez létrehoz egy új NodeJS projektet és telepíti a twitter-litecsomagot. Ez a csomag rendkívül megkönnyíti a Twitter API-val való interakciót.

Kéréseink hitelesítéséhez OAuth2.0 hordozó tokent fogunk használni. A twitter-litecsomag egyszerű módon képes kezelni a Twitter hitelesítést.

Hozzunk létre egy új index.jsfájlt, és adjuk hozzá a következő kódot:

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

Ennek futtatásakor a konzol a következőket adja ki:

Got the following Bearer token from Twitter: THE_TWITTER_BEARER_TOKEN

Félelmetes, eddig minden működik. ?

Legutóbbi tweetek

A következő rész a legutóbbi tweetek beolvasása a Twitter API-ból.

A Twitter dokumentációjában láthatja, hogy van egy végpont a legújabb tweetek keresésére.

Ennek megvalósításához a következő kódot adom hozzá a index.jsfájlhoz:

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

Ennek futtatásakor sok twitter-megjegyzést láthat Lionel Messiről, vagyis tökéletesen működik! ⚽

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

Hangulatelemzés elvégzése

A hangulatelemzés elvégzéséhez a Google Cloud Natural Language API-ját fogom használni. Ezzel az API-val egyszerű API-hívással megkaphatja a szöveg hangulatát.

Először lépjen a Google Cloud Console-ba, hogy hozzon létre egy új felhőprojektet.

Ezután lépjen a Natural Language API-ra, és engedélyezze a projekt számára.

Végül létre kell hoznunk egy szolgáltatási fiókot a hitelesítéshez. A szolgáltatásfiók létrehozásához lépjen a szolgáltatásfiók létrehozása oldalra.

Szolgáltatási fiók létrehozásakor le kell töltenie a jsonszolgáltatási fiók magánkulcsát tartalmazó fájlt. Tárolja ezt a fájlt a projekt mappában.

A Google rendelkezik egy NodeJS csomaggal, amely interakcióba lép a Natural Language API-val, ezért használjuk ezt. Telepítéséhez futtassa:

npm install @google-cloud/language

Ahhoz, hogy a nyelvi csomag működjön, tudnia kell, hol található a magánkulcsfájl.

A csomag megpróbál elolvasni egy GOOGLE_APPLICATION_CREDENTIALSkörnyezeti változót, amelynek erre a fájlra kell mutatnia.

Ennek a környezeti változónak a beállításához frissítem scripta package.jsonfájl kulcsát .

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

Vegye figyelembe, hogy ennek működéséhez futtatásával kell elindítania a szkriptet npm run start.

A beállított értékekkel végre elkezdhetjük a kódolást.

Új getSentimentfüggvényt adok a index.jsfájlhoz:

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

This function calls the Google Natural Language API and returns a sentiment score between -1 and 1.

Let's test it out with a few examples:

getSentiment("I HATE MESSI");

Returns the following.

The sentiment score is -0.40

Similarly:

getSentiment("I LOVE MESSI");

Returns a higher sentiment. ?

The sentiment score is 0.89

Bringing it all together

The final thing to do is calling the getSetiment function with the text from the tweets.

There is a catch though: only the first 5,000 API requests are free, after that Google will charge you for subsequent API requests.

To minimise the amount of API calls I'm going to combine all the tweets into one single string like so:

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

Now I only have to call the API once instead of 100 times.

The final question is of course: what does Twitter think about Lionel Messi? When running the program it gives the following output:

The sentiment about Lionel Messi is: 0.2

So, Twitter is lightly positive about Lionel Messi.

Conclusion

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.