Analyséiere vu WhatsApp Messagen mam Python (Deel 1)

Ech sinn ee vun dëse Leit déi all Gespréich hält déi se jeemools op WhatsApp haten. Ech hunn ni eng eenzeg zënter 2014 geläscht, wou ech mäin éischte Smartphone krut. Dat heescht, ech hunn a menger WhatsApp Geschicht iwwer 800k Messagen mat menge Frënn, Mataarbechter, Famill an och alen Frëndinnen.

Soubal ech NLP Techniken geléiert hunn, war meng éischt Zil kloer: gitt duerch meng ganz Whatsapp Geschicht fir ze verstoen wéi meng Texting sech iwwer d'Jore entwéckelt huet, wa meng Relatiounen vunenee ënnerscheede sinn, a firwat net fir de Spaass, kuckt wat soss ech konnt léiert iwwer mech selwer!

Dir kënnt mäi komplette Code an der leschter Presentatioun a mengem GitHub Repo fannen

An dësem éischten Deel, ech wäert goen andeems Dir Gespréicher importéiert, Emojis behandelt, an e puer allgemeng Analyse op Messagen.

An Deel 2 ginn ech direkt a meng WhatsApp Thema Analyse mat NLP Techniken ze sprangen.

Verzichterklärung

Fir d'Einfachheet hunn ech bei dëser éischter Approche decidéiert Mediendateien ze iwwersprangen.

Luede de Message Geschicht

WhatsApp's verschlësselte Messagerie mécht et ganz schwéier fir souguer eis eege Message Geschicht ze kréien. Als Léisung hunn ech beschloss all Gespréich manuell ze exportéieren an duerno mat Re-Syntax ze laden.

def read_history (Datei): f = opmaachen ('data / {}'. Format (Datei), 'r') # All Textmessage huet déiselwecht Format: Datum - Sender: Message. Messagen = re.findall ('(\ d + / \ d + / \ d +, \ d +: \ d + \ d +) - (. *): (. *)', f.read ()) f.close () #Convert Lëscht mat engem Dataframe an gitt der Spalten Geschicht = pd.DataFrame (Messagen, Kolonnen = ['Datum', 'Numm', 'msg']) Geschicht ['date'] = pd.to_datetime (Geschicht ['Datum'], format = "% m /% d /% y,% H:% M") Geschicht ['date1'] = Geschicht ['Datum'] .Uwendung (lambda x: x.date ()) # Datei ass am Format 'WhatsApp Gespréich mat XXX.txt' Geschicht ['conv_name'] = Datei [19: -4] Historique zréck

Ech hunn all meng Gespréicher an engem Datemapp gespäichert, fir datt ech se an eng Dataframe lëschten, laden a fusionéieren.

# Lëscht all Dateien an Verzeechnesdateien = os.listdir ('data') all = [] fir Datei an Dateien: history = read_history (Datei) all.append (history) history = pd.concat (all) .reset_index () # Media Messagen erschéngen als , also läschen ech hinnen history_clean = history [history ['msg']! = ' ']

Zum Schluss hunn ech e schéine Dataframe dee sou ausgesäit:

Als éischt e puer Statistiken

Wéi vill Messagen géift Dir soen, datt Dir an de leschten 5 Joer geschéckt hutt? Wéi vill Leit hutt Dir mat geschwat?

A mengem Fall hunn ech iwwer 350k Messagen geschéckt, mat iwwer 3000 verschiddene Leit geschwat (inklusiv Gruppechats) an hat 474 eenzegaarteg WhatsApp Gespréicher.

Basis Pandas Syntax ginn eis allen dräi einfach:

history_clean [history_clean ['name'] == 'Lai'] ['msg']. zielen () # Zuel vun de Messagen geschéckt history_clean ['name']. nunique () # Zuel vu Leit déi ech mat history_clean geschwat hunn ['conv_name '] .nunique () # Zuel vun eenzegaartege Gespréicher

Awer natierlech hunn ech d'Zuel an d'Längt vun de Messagen ugesinn déi ech iwwer d'Joren geschéckt hunn. Hei sinn e puer flott Saachen déi ech begéint hunn:

Als éischt d'Zuel vun de Messagen déi ech iwwer d'Joren geschéckt hunn:

# Erstellt en Ënnerdeel vun der Dataframe mat nëmme Messagen déi ech geschéckt hunn msg_lai = history_clean [history_clean ['name'] == 'Lai'] # Plot msg_lai.groupby (['date1']). Zielen () ['msg' ] .plot ()

Ech war ganz iwwerrascht wann ech dëst gesinn hunn, well all Kéier wann meng Textdropfung erofgeet, geschitt ech mat engem ze begéinen: see_no_evil: (Dat ass, während 2014, an tëscht 2016 an Mëtt 2017).

Ech hunn et och zimmlech witzeg fonnt d'Längt vu menge Messagen ze kucken:

history_clean.groupby (['date1']) ['msg_len']. heescht (). Komplott ()

Also natierlech hunn ech dee komeschen Outlier ausgesinn an dës fonnt:

history_clean [history_clean ['msg_len'] == history_clean ['msg_len']. max ()] ['msg']. Wäerter

Et stellt sech eraus datt et e Message vun engem Frënd ass, dee mir e gudde Gebuertsdag wënscht ('feliz cumple' op spuenesch), den 19. Mäerz, mäi Gebuertsdag geschéckt: liicht_smiling_face:

Elo awer dee lëschtegsten Deel:

Loosst eis d'Emoji kucken!

Et stellt sech eraus datt ech am Ganzen 369 verschidden Emoijs benotzt hunn (ech wousst net emol datt vill Emoji och bestanen hunn!): Gejäiz:

Dëst ass wéi ech se kréien: mat der Emoji Bibliothéik erstellen ech eng Funktioun fir Emojis aus Text ze extrahieren, se op d'Kollum "msg" ëmzesetzen an déi eenzegaarteg Wäerter zielen.

def extract_emojis (str): return '' .join (c fir c in str if c in emoji.UNICODE_EMOJI) # msg_lai ass eng Ënnergrupp vun history_clean mat nëmme verschéckt Messagen len (set (msg_lai ['msg']) .applicéieren (lambda x : extract_emojis (x)). Zomm ()))

Awer loosst eis kucken wéi meng Benotzung vun Emojis iwwer Zäit geännert huet.

Ech definéieren eng Funktioun fir d'Zuel vun den Emojis ze zielen, awer ech kucken nëmmen op déi 50 allgemengst Emojis fir ze verhënneren datt d'Dataframe ze grouss ass (et gi méi wéi 500 Emojis!).

def Count_Emojis (df): all_words = df ['msg'] .wend (lambda x: extract_emojis (x)). sum () word_count = Konter (all_words) bestallt = {} bestallt ['msg'] = [] # Erstelle d'Saile vun der neier Dataframe mat den 50 Emojis fir Schlëssel, Nummer am Wort_count.most_common () [: 50]: bestallt [Schlëssel] = [] # Fëllt d'Wäerter mat der Unzuel vun den Emojis an all Saz fir de Saz an der Serie : meaning_count = Counter (extract_emojis (Saz)) fir Wuert an der Uerdnung: count = meaning_count [word] wann Saz_count [word] soss 0 bestallt [word] + = [count] # Füügt just e puer kategoresch Variabelen déi ech géif halen fir Filteren Zwecker bestallt ['msg'] = Lëscht (Serie) bestallt ['Datum'] = Lëscht (df ['Datum']) bestallt ['Numm'] = Lëscht (df ['Numm']) bestallt ['conv_name '] = Lëscht (df [' conv_name ']) zréck pd.DataFrame (bestallt)

Nodeems ech eng Zäit mat verschiddene Python Visualiséierungsinstrumenter kämpfen, déi net sou kompatibel mat Emojis sinn wéi ech et erwaart hunn, hunn ech fonnt datt den Tableau zimmlech einfach war wann et ëm Emojis geet, also hunn ech d'Dataframe an eng CSV exportéiert an en Tableau Dashboard erstallt deen Dir kënnt eroflueden.

Ech war frou ze gesinn datt anscheinend mäi Liewen voller Léift, Gléck an Iwwerraschung ass!

An ech hu sech amuséiert ze gesinn, wéi gutt mäi Gebrauch vun Emojis verschidde Momenter vu mengem Liewen duerstellt:

Fillt Iech e Bléck kucken a mäi Public Tableau Dashboard eroflueden, fëllt et mat Ären eegenen Daten a spillt ronderëm wéi ech!

All de Code hei benotzt ass komplett a mengem Github verfügbar, fille mech frei mat all Froen op [email protected] ze kommen oder e Kommentar hannerloossen!

Kuckt och am Deel 2 fir e puer WhatsApp Thema Modeller ze maachen!

Ursprénglech op sprejerlaila.github.io publizéiert.