Tweet analitika NLP használatával

Prajwal Shreyas
Prajwal Shreyas

követés

Jul 23, 2019 * 9 perc olvasás

Bevezetés

az elmúlt napokban a nagy adatok robbanásával nagy az igény a szervezetek és az adatkutatók számára, hogy nem hagyományos adatforrások felhasználásával végezzenek információkivonást. Kutatások kimutatták, hogy az adatok közel 80% – a strukturálatlan szöveges adatként létezik, ezért a szövegelemzés alapvető fontosságú a csevegési átiratokban, a közösségi média bejegyzéseiben, véleményeiben, hírcsatornáiban stb.

mi a szövegelemzés?

a szövegelemzés a strukturálatlan adatok szintetizálásának folyamata, amely segít a minták felfedezésében és a döntéshozatalban. Az utóbbi évekig a szövegelemzést a régimódi módon kellett elvégezni, azaz a szöveg szemgolyózását és kézi kategorizálását, ami nem hatékony és időigényes. Ez sem gyakorlati megoldás, ha több millió dokumentummal, például twitter-adatokkal foglalkozik.

a Twitter adatai (más néven tweetek) gazdag információforrás számos témában. Ezek az adatok felhasználhatók egy adott kulcsszóhoz kapcsolódó trendek keresésére, a márka hangulatának mérésére vagy az új termékekkel és szolgáltatásokkal kapcsolatos visszajelzések gyűjtésére. Ez a bejegyzés lépésről lépésre nyújt útmutatást a twitter-adatok szövegelemzéséhez.

hogyan lehet szöveges elemzést végezni a twitter adatain?

a szövegelemzés lépései a következők:

1. lépés: tweetek gyűjtése

2. lépés: Feldolgozás előtti tweetek

3.lépés: hangulatelemzés alkalmazása

4. lépés: elnevezett entitásfelismerés alkalmazása

5. lépés: klaszter tweetek

6. lépés: elemzés megjelenítése

csatoltam egy jupyter jegyzetfüzetet, amely itt hajtja végre a fenti lépéseket a twitter-adatok mintáján.

1.lépés: tweetek gyűjtése

a tweet adatok programozottan kétféleképpen érhetők el, azaz Twitter Rest API vagy Streaming API.

a Rest API lehetővé teszi, hogy összegyűjtse az összes tweet vagy követő listáját egy adott felhasználó számára. Lekérdezheti a Felhasználó Fiókját, sőt módosíthatja is, feltéve, hogy rendelkezik a szükséges engedélyekkel. Ahol a Streaming API lehetővé teszi a tweetek valós idejű gyűjtését keresési kifejezések, felhasználói azonosítók vagy helyek alapján.

az API eléréséhez 4 információra van szüksége a Twitterből, azaz API kulcs, API titok, hozzáférési token és hozzáférési token titkos. A fiók létrehozásának és a Twitter API szolgáltatásokhoz python csomagok használatával történő csatlakozásának részletes lépéseit itt a blog tartalmazza.

elemzésünk során a twitter streaming API szolgáltatást használtam, és húsz FTSE 100 vállalat tweetjeit gyűjtöttem egy hét alatt az 1st október 2016-tól. Ez összesen 37 313 tweetet eredményezett. A streaming API kimenetét bármilyen elemzés előtt megfelelő formátumba kell elemezni. A következő részben a tweetek előzetes feldolgozásának lépéseit ismertetjük.

2.lépés: feldolgozás előtti tweetek

itt elemezzük a twitter API válaszát egy strukturált táblába. A twitter streaming API-k válasza az alábbi formátumban van:

a twitter API kimenetének elemzésére szolgáló részletes kód az alábbiakban található. A kimenet olyan kulcsmezőkre van felépítve, mint a “doc_id”, “felhasználónév”, “szöveg” stb. Az elemzett válasz tárolható adatbázisban vagy JSON fájlban.

import simplejson as json
def get_tweet(doc):
tweetItem = {}
#Available tweet data
tweetItem = doc
#hashtags are identified and provided as a field in the tweet
tweetItem = map(lambda x: x,doc)
# user_mentiones are identified and provided as a field
tweetItem = map(lambda x: x,doc
) # symbols e.g. $APPL are identified and provided as a field
tweetItem = map(lambda x: x,doc)
tweetItem = doc
tweetItem = doc
tweetItem = doc try: tweetItem = doc
except KeyError as e:
tweetItem = 0
pass
return tweetItem

3.lépés: Hangulatelemzés

az emberek tweeteken keresztül fejezik ki véleményüket, és ezeknek általában pozitív, negatív vagy semleges hangulata van. Ennek az érzésnek az elemzése hasznos betekintést eredményezhet a tárgyalt témában vagy társaságban. Ezért javasoljuk a hangulatelemzési algoritmusok ennek az elemzésnek a végrehajtásához. Létrehoztam egy külön blogot, amely részletesen ismerteti a hangulatelemzés elvégzését a mély tanulási algoritmus segítségével.

a hangulatjel hasznos mutató, azonban a tweetek további információkat tartalmaznak, például emberek, helyek és szervezetek nevét. A kinyert adatok nagyon hasznos betekintést nyújthatnak a termékébe vagy vállalatába. Tehát a következő lépésben a named entity recognition algoritmusok használatát ismertetjük, amelynek célja ezen információk kinyerése.

4. lépés: Elnevezett entitás felismerés

a megnevezett entitás felismerési algoritmus azonosítja a kulcscímkéket, például a tweetekben szereplő személyeket, helyeket vagy szervezeteket. Például, ha van egy említés a “London” a tweet az algoritmus lenne tag, hogy a “hely”. Mivel azonban a tweetek általában nem követik a szokásos angol szintaxist, a címkék pontossága 60-70% körül van.

a Stanford NER tagger segítségével megszerezheti a tweetek entitásfelismerését. Az alábbi példában Donald Trump tweetjét használtam.

# -*- coding: utf-8 -*-
from nltk.tag import StanfordNERTagger
from nltk.tokenize import word_tokenize
st = StanfordNERTagger('/stanford-ner/classifiers/english.all.3class.distsim.crf.ser.gz',
'/usr/share/stanford-ner/stanford-ner.jar',
encoding='utf-8')#a tweet by Donald Trump
text = 'Just had a very good call with @SwedishPM Stefan Löfven who assured me that American citizen A$AP Rocky will be treated fairly. Likewise, I assured him that A$AP was not a flight risk and offered to personally vouch for his bail, or an alternative....'
tokenized_text = word_tokenize(text)
classified_text = st.tag(tokenized_text)
print(classified_text)

5. lépés: Hasonló tweetek csoportosítása

számos tweet nagyon hasonlít egymásra, ennek oka lehet, hogy az emberek ugyanazt a témát tweetelik, ez sok zajt okoz az adatokban. Ezért a zaj csökkentése érdekében hasznos lenne a tweeteket csoportokba csoportosítani hasonlóságuk alapján. Ezt a fürtözési algoritmus segítségével lehet elvégezni.

az algoritmusok belső működése a TF-idf (term frequency — Inverse document frequency) mátrix néven ismert gépi tanulási koncepción alapul. Itt az egyes tweeteket dokumentumként (d), a tweetben lévő szavakat pedig kifejezésként (t) kezeljük.

Term Frequency-inverz dokumentum frekvencia egy numerikus statisztika, amely megmutatja, hogy egy szó mennyire fontos a korpusz számára.

a kifejezés gyakorisága csak az aktuális szó számának aránya a dokumentumban/karakterláncban/stb.

Term frekvencia képlet

a t_i kifejezés gyakorisága, ahol n_t-a t_i száma az aktuális dokumentumban/karakterláncban, az n_k összege az aktuális dokumentum / karakterlánc összes kifejezésének száma.

az inverz Dokumentumfrekvencia a korpuszban lévő összes dokumentum/karakterlánc számának a t_i kifejezéssel rendelkező dokumentumok számához viszonyított arányának naplója.

inverz dokumentum frekvencia képlet

tf-idf(t, d, D) A termék tf(t, d) idf(t, D). További részletek a TF-idf elérhető a blog itt.

TF-IDF képlet

az alábbi kódban a fürtözés megszerzéséhez a szövegbevitelen kívül az egyetlen kiegészítő paraméter, amelyet meg kell adni a bemenetben, a hasonlósági küszöb. A küszöbértéket a “get_clusters(processedTweets, similarity_threshold)”függvényben állíthatja be. Ezért az összes tweet, amelyek 80% – ban hasonlóak, a koszinusz hasonlóság néven ismert hasonlósági intézkedés alapján csoportosulnak.

def cluster_text(dist_text,processedTweets,dist_threshold_txt):
cluster_id = 1
for i in range(dist_text.shape):
try:
doc_dist_array_txt = dist_text
# identify document ids where the tweets are similar
similarDocs = np.where(doc_dist_array_txt <= dist_threshold_txt)
processedTweets.ix.isin(), 'cluster_ref'] = cluster_id
cluster_id = cluster_id + 1
except ValueError:
continue
return processedTweets
# %%%%%%%%% Calculate Cosine distance of documents %%%%%%%%%%%%%%
def tokenize_only(text):
# first tokenize by sentence, then by word to ensure that punctuation is caught as it's own token
tokens =
filtered_tokens =
# filter out any tokens not containing letters (e.g., numeric tokens, raw punctuation)
for token in tokens:
if re.search('', token):
filtered_tokens.append(token)
return filtered_tokens
def get_clusters(processedTweets, similarity_threshold):
tweets = processedTweets.tolist()
#Define count vectorizer parameters
vectorizer = CountVectorizer(max_df=1.0, min_df=1, stop_words=stopwords, tokenizer=tokenize_only)
# Get document term frequency matix
dtf_matrix = vectorizer.fit_transform(tweets) #fit the vectorizer to tweets which does not contain'htttp' and 'RT'
dist_text = np.around(abs(1 - cosine_similarity(dtf_matrix)),2)
# --------1D clustering based on distance measure
# Pre clustering setup
processedTweets = None # Tweets that are 1-similarithy% similar, as defined by dist_threshold
# Clustering of tweets based on text
processedTweets = cluster_text(dist_text,processedTweets,dist_threshold_txt = (1-similarity_threshold))
return processedTweets

az eredmények egy további “cluster_ref”oszlopot tartalmaznak. A cluster_ref az összes hasonló dokumentumot egyetlen csoportba sorolja, például ha az 1.és a 2. dokumentum hasonló, ezért mindkettőnek 1-es cluster_ref értéke van.

6. lépés: Az eredmények vizualizálása

a fenti eredmények vizualizálása elősegítené a termékről vagy vállalatról alkotott fogyasztói vélemény megismerését. Az alábbi részben fogom használni Tableau vizualizációs célokra. Kérjük, olvassa el az irányítópultra mutató linket itt.

az alábbi első grafikon az egyes vállalatok pozitív, negatív és átlagos hangulata (kék vonal). A sávok a vállalat átlagos hangulatát képviselik, és nem súlyozzák a tweetek számát. Ez a súlyozatlan hangulat nem nyújt pontos összehasonlítást a vállalatok között, mivel nem veszi figyelembe a tweetek számát.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.