Hallo, das ist Sunfish. ** "Twtter x Corona" ** Dies ist das zweite Mal in der Serie. Letztes Mal hat versucht, die Anzahl der Tweets zu zählen, es war ein Level, aber dieses Mal werde ich mein Bestes geben. Insbesondere wenn Sie von der Verarbeitung natürlicher Sprache wie der Installation von MeCab oder dem Erstellen einer Umgebung erschöpft sind, werfen Sie bitte einen Blick darauf.
Mehr als ein halbes Jahr ist vergangen, seit das Koronavirus zu einem sozialen Problem wurde. Folgen wir dem Tweet, was in den Menschen aufsteigt und was vergessen wird. Im ersten Teil werden wir eine morphologische Analyse durchführen und die zu analysierenden Wörter auswählen.
Verwenden Sie die Daten nach Letzte Vorverarbeitung. Mit anderen Worten, es sind die Daten des Tweet-Datums und des Tweet-Inhalts.
Tatsächlich tritt in diesen Daten derselbe Tweet-Inhalt über mehrere Datensätze und mehrere Tage auf. (Weil es Retweet enthält) Dieses Mal werden wir mit 1 Tweet-Inhalt 1 Datensatz analysieren, ohne die Retweet-Tendenz.
from collections import Counter
from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd
import statsmodels.api as sm
import re
import MeCab
import dask.dataframe as dd
from multiprocessing import cpu_count
#Die meisten wurden für jeden Tweet erstellt_At dauert einen jungen Tag und macht 1 Tweet 1 Rekord
port_13['Created_At'] = pd.to_datetime(port_12['Created_At'])
port_13 = port_12.groupby(['Text']).apply(lambda grp: getattr(
grp, 'nsmallest')(n=1, columns='Created_At', keep='first'))
port_13['Created_At'] = port_12['Created_At'].map(lambda x: x.date())
Ich werde den Schlüssel zur Sprachverarbeitung tun. Da es schwer zu verstehen ist, ob alle Teile angegeben sind, wird diesmal nur die ** "allgemeine Nomenklatur" ** analysiert.
def tokenizer(text, pos, only_surface):
def _extract():
if only_surface:
return re.sub(r'[\s ]+', '_', feature[0])
else:
return re.sub(r'[\s ]+', '_', feature[2])
_tagger = MeCab.Tagger(
'-Ochasen -d {}'.format("/var/lib/mecab/dic/mecab-ipadic-neologd"))
try:
result = []
for feature in _tagger.parse(text).split('\n')[:-2]:
feature = feature.split('\t')
if pos:
if feature[3] in pos:
result.append(_extract())
else:
result.append(_extract())
return ' '.join(result)
except UnicodeEncodeError:
return ''
except NotImplementedError:
return ''
port2 = port1.copy()
port2['Text_Morphem'] = port2['Text'].fillna('')
ddf = dd.from_pandas(port2, npartitions=cpu_count()-1)
target_cols = ['Text_Morphem']
pos = ['Substantiv-Allgemeines']
for target_col in target_cols:
ddf[target_col] = ddf[target_col].apply(
tokenizer, pos=pos, only_surface=True, meta=(f'{target_col}', 'object'))
port2 = ddf.compute(scheduler='processes')
↓ nehans morphologische Analyse kombiniert durch Leerzeichen getrennte morphologische Elemente und fügt sie in eine Spalte ein.
Beachten Sie, dass Tweets, die keine allgemeine Nomenklatur enthalten, die Ergebnisse der morphologischen Analyse verlieren. Löschen Sie sie daher. Verwenden Sie die Verarbeitung fehlender Werte.
port_15 = port_14.copy()
port_15 = port_15.dropna(subset=None, how='any')
Da es unvermeidlich ist, Wörter anzuvisieren, die selten vorkommen, haben wir diejenigen analysiert, die im gesamten Zeitraum mehr als 1.500 Wörter enthielten.
#Aggregation der Worthäufigkeit
port_18 = port_15.copy()
flat_words = list(chain.from_iterable(port_18['Text_Morphem'].str.split(' ')))
c = Counter(flat_words)
res = pd.DataFrame.from_dict(c, orient='index').reset_index()
res.columns = ['Wort', 'Anzahl']
port_18 = res
#Zeilenfilter nach Bedingung
port_20 = port_18[(port_18['Anzahl'] >= 1500.0)]
#Spaltenauswahl
port_21 = port_20[['Wort']]
↓ Die Anzahl der Erscheinungen der ausgewählten 27 Wörter sieht folgendermaßen aus
↓ Als Bonus ist es eine Wortwolke vor der Auswahl.
Da die Zielwörter im vorherigen Schritt eingegrenzt wurden, besteht der nächste Schritt darin, tägliche Daten zu erstellen. Aggregieren Sie die Worthäufigkeit mit "Created_At" als Schlüsselspalte.
port_16 = port_15.copy()
target_col = 'Text_Morphem'
groupby_cols = ['Created_At']
tmp = port_16[groupby_cols+[target_col]]
tmp = tmp.groupby(groupby_cols)[target_col].apply(lambda x: ' '.join(x))
vec_counter = CountVectorizer(tokenizer=lambda x: x.split(' '))
X = vec_counter.fit_transform(tmp)
res = pd.DataFrame(X.toarray(), columns=vec_counter.get_feature_names(), index=tmp.index
).reset_index().melt(id_vars=groupby_cols, var_name='Wort', value_name='Anzahl')
port_16 = res.sort_values(groupby_cols).reset_index(drop=True)
Kombinieren Sie hier die * Daten, beschränken Sie die täglichen Daten auf die zu analysierenden Wörter, und die Arbeit des ersten Teils ist abgeschlossen.
port_22 = pd.merge(port_21, port_16, how='inner',
left_on=['Wort'], right_on=['Wort'])
↓ Filtern Sie als Test die erhaltenen Daten und visualisieren Sie die Anzahl der Wortauftritte pro Tag. Ein Lächeln ist besser als ein weinendes Gesicht.
Es ist lange her, aber ich habe versucht, die Anzahl der häufigen Wörter zu ermitteln, die jeden Tag erscheinen. Wir legen Wert auf Einfachheit gegenüber Strenge. Bei dem Versuch, eine komplizierte Analyse durchzuführen, ist der Code in der Regel lang und schwierig, aber nehan tut dies mit 10 Knoten (der Anzahl der grünen Kreise). Natürlich habe ich keine Programme geschrieben. Ich hoffe, Sie werden sich auch nur ein wenig für nehan interessieren.
Recommended Posts