https://boostlog.io/@anshulc95/twitter-sentiment-analysis-using-nodejs-5ad1331247018500491f3b6a
作者 | Anshul Chauhan
譯者 | 周家未 (BriFuture) ???共計翻譯:25 篇 貢獻時間:794 天
如果你想知道大家對某件事情的看法,Twitter 是最好的地方了。Twitter 是觀點持續不斷的湧現出來的地方,每秒鐘大概有 6000 條新 Twitter 發送出來。因特網上的發展很快,如果你想與時俱進或者跟上潮流,Twitter 就是你要去的地方。
現在,我們生活在一個資料為王的時代,很多公司都善於運用 Twitter 上的資料。根據測量到的他們新產品的人氣,嘗試預測之後的市場趨勢,分析 Twitter 上的資料有很多用處。透過資料,商人把產品賣給合適的使用者,收集關於他們品牌和改進的反饋,或者獲取他們產品或促銷活動失敗的原因。不僅僅是商人,很多政治和經濟上的決定是在觀察人們意見的基礎上所作的。今天,我會試著讓你感受下關於 Twitter 的簡單 情感分析[1],判斷這個 Twitter 是正能量、負能量還是中性的。這不會像專業人士所用的那麼複雜,但至少,它會讓你知道挖掘觀唸的想法。
我們將使用 NodeJs,因為 JavaScript 太常用了,而且它還是最容易入門的語言。
前置條件:
好了,就是這樣。開始吧。
開始
為了你的專案新建一個目錄,進入這個目錄下麵。開啟終端(或是命令列)。進入剛建立的目錄下麵,執行命令 npm init -y
。這會在這個目錄下建立一個 package.json
檔案。現在我們可以安裝需要的 npm 包了。只需要建立一個新檔案,命名為 index.js
然後我們就完成了初始的編碼。
獲取推文
好了,我們想要分析 Twitter ,為了實現這個目的,我們需要以程式設計的方式訪問 Twitter。為此,我們要用到 twit[2] 包。因此,先用 npm i wit
命令安裝它。我們還需要註冊一個 App,以透過我們的賬戶來訪問 Twitter 的 API。點選這個 連結[3],填寫所有專案,從 “Keys and Access Token” 標簽頁中複製 “Consumer Key”、“Consumer Secret”、“Access token” 和 “Access Token Secret” 這幾項到一個 .env
檔案中,就像這樣:
# .env
# replace the stars with values you copied
CONSUMER_KEY=************
CONSUMER_SECRET=************
ACCESS_TOKEN=************
ACCESS_TOKEN_SECRET=************
現在開始。
用你最喜歡的程式碼編輯器開啟 index.js
。我們需要用 npm i dotenv
命令安裝 dotenv
包來讀取 .env
檔案。好了,建立一個 API 實體。
const Twit = require('twit');
const dotenv = require('dotenv');
dotenv.config();
const { CONSUMER_KEY
, CONSUMER_SECRET
, ACCESS_TOKEN
, ACCESS_TOKEN_SECRET
} = process.env;
const config_twitter = {
consumer_key: CONSUMER_KEY,
consumer_secret: CONSUMER_SECRET,
access_token: ACCESS_TOKEN,
access_token_secret: ACCESS_TOKEN_SECRET,
timeout_ms: 60*1000
};
let api = new Twit(config_twitter);
這裡已經用所需的配置檔案建立了到 Twitter 上的連線。但我們什麼事情都沒做。先定義個獲取推文的函式:
async function get_tweets(q, count) {
let tweets = await api.get('search/tweets', {q, count, tweet_mode: 'extended'});
return tweets.data.statuses.map(tweet => tweet.full_text);
}
這是個 async 函式,因為 api.get
函式傳回一個 promise 物件,而不是 then
鏈,我想透過這種簡單的方式獲取推文。它接收兩個引數 q
和 count
,q
是查詢或者我們想要搜尋的關鍵字,count
是讓這個 api
傳回的推文數量。
目前為止我們擁有了一個從 Twitter 上獲取完整文字的簡單方法。不過這裡有個問題,現在我們要獲取的文字中可能包含某些連線或者由於轉推而被截斷了。所以我們會編寫另一個函式,拆解並傳回推文的文字,即便是轉發的推文,並且其中有連結的話就刪除。
function get_text(tweet) {
let txt = tweet.retweeted_status ? tweet.retweeted_status.full_text : tweet.full_text;
return txt.split(/ |\n/).filter(v => !v.startsWith('http')).join(' ');
}
async function get_tweets(q, count) {
let tweets = await api.get('search/tweets', {q, count, 'tweet_mode': 'extended'});
return tweets.data.statuses.map(get_text);
}
現在我們拿到了文字。下一步是從文字中獲取情感。為此我們會使用 npm
中的另一個包 —— sentiment
[4]。讓我們像安裝其他包那樣安裝 sentiment
,新增到指令碼中。
const sentiment = require('sentiment')
sentiment
用起來很簡單。我們只用把 sentiment
函式用在我們想要分析的文字上,它就能傳迴文字的相對分數。如果分數小於 0,它表達的就是消極情感,大於 0 的分數是積極情感,而 0,如你所料,表示中性的情感。基於此,我們將會把推文列印成不同的顏色 —— 綠色表示積極,紅色表示消極,藍色表示中性。為此,我們會用到 colors
[5] 包。先安裝這個包,然後新增到指令碼中。
const colors = require('colors/safe');
好了,現在把所有東西都整合到 main
函式中。
async function main() {
let keyword = \* define the keyword that you want to search for *\;
let count = \* define the count of tweets you want *\;
let tweets = await get_tweets(keyword, count);
for (tweet of tweets) {
let score = sentiment(tweet).comparative;
tweet = `${tweet}\n`;
if (score > 0) {
tweet = colors.green(tweet);
} else if (score < 0) {
tweet = colors.red(tweet);
} else {
tweet = colors.blue(tweet);
}
console.log(tweet);
}
}
最後,執行 main
函式。
main();
就是這樣,一個簡單的分析推文中的基本情感的指令碼。
\\ full script
const Twit = require('twit');
const dotenv = require('dotenv');
const sentiment = require('sentiment');
const colors = require('colors/safe');
dotenv.config();
const { CONSUMER_KEY
, CONSUMER_SECRET
, ACCESS_TOKEN
, ACCESS_TOKEN_SECRET
} = process.env;
const config_twitter = {
consumer_key: CONSUMER_KEY,
consumer_secret: CONSUMER_SECRET,
access_token: ACCESS_TOKEN,
access_token_secret: ACCESS_TOKEN_SECRET,
timeout_ms: 60*1000
};
let api = new Twit(config_twitter);
function get_text(tweet) {
let txt = tweet.retweeted_status ? tweet.retweeted_status.full_text : tweet.full_text;
return txt.split(/ |\n/).filter(v => !v.startsWith('http')).join(' ');
}
async function get_tweets(q, count) {
let tweets = await api.get('search/tweets', {q, count, 'tweet_mode': 'extended'});
return tweets.data.statuses.map(get_text);
}
async function main() {
let keyword = 'avengers';
let count = 100;
let tweets = await get_tweets(keyword, count);
for (tweet of tweets) {
let score = sentiment(tweet).comparative;
tweet = `${tweet}\n`;
if (score > 0) {
tweet = colors.green(tweet);
} else if (score < 0) {
tweet = colors.red(tweet);
} else {
tweet = colors.blue(tweet)
}
console.log(tweet)
}
}
main();
via: https://boostlog.io/@anshulc95/twitter-sentiment-analysis-using-nodejs-5ad1331247018500491f3b6a
作者:Anshul Chauhan[7] 譯者:BriFuture 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出