Analysera chattlogg med python
Hej, det här är ett litet projekt jag kom på själv. Jag ska analysera en chattlogg, den är .txt och prydlig redan vid export. Ser ut såhär:
2019-11-17 12:34 - Klas: hej, vilket fint väder!
2019-11-17 12:34 - Tosa: Gillar du regn eller?
...
Jag har tänkt att göra en meddelandeklass med fyra attribut: datum, tid, person och meddelande. Sen ska jag göra en lista med alla meddelanden. Sen skriver jag mina analysfunktioner, tex som räknar genomsnittlig längd.
Låter det som en bra början?
EDIT: men en ännu viktigare fråga är hur jag ska spara all data, det är alltså 40 000 meddelanden. Jag tänkte bara spara allt i en vanlig lista [], men blir det problem?
Jag ser direkt att du behöver någonting mer, eftersom de båda meddelandena du har i exemplet har samma tid, så du behöver se till att du sparar ordningen de kommer i på något sätt.
40000 i en lista får säkert plats i minnet och går rätt fort att analysera och läsa in och spara. Om du tänker göra nån sorts analys som kräver jämförelse alla med alla när listan är allt man har kan det bli dags med en annan struktur.
(Typ "hur ofta svarar Tosa direkt på Klas".)
Föreslår eftersom du gör en meddelandeklass så gör en sökfunktion. Söka på meddelanden som innehåller vissa ord till exempel. Kul projekt att läsa igenom chattlogg tycker jag. Har gjort något liknande för länge sedan.
Laguna: chattloggen är kronologisk!
Aerius: nej det vill jag inte, det är inte så intressant eftersom det går att göra ctrl+F
Eventuellt kommer jag utöka till 300 000 meddelanden, när jag hittar ett sätt att dekryptera backupfilerna (och om den är lika prydlig som loggfilen jag har nu).
Jag får frågetecken här direkt. Jag vill använda split(), men den splittar vid mellanslag, alltså splittar den sönder hela meddelandet, jag vill bara ha en lista: [datum, tid, vem, meddelande], dessutom kommer bindestrecket innan namnet upp.
Edit: frågan inte aktuell
Utan att veta vilka "analysfunktioner" som ska implementeras så säger jag att någon form av sökfunktion är lämplig. Att söka igenom chat-loggen efter det som analysfunktionen behöver tar knappast längre tid än att läsa in hela chat-loggen till objekten. Om man har flera analysfunktioner som ska köras så bör man dock söka efter supermängden av vad analysfunktionerna behöver så att man undviker att söka igenom hela chat-filen flera gånger. Vilket börjar lukta behov av reguljära uttryck...
Ett alternativ kan vara att kontinuerligt läsa nya rader i chat-loggen, hämta de rådata/nyckelord som analysfunktionen/erna behöver, köra analysfunktionen/erna och lagra resultat/en i en separat resultatfil som är relativt liten. När nästa rad dyker upp i chat-loggen så används den tillsammans med tidigare sparad resultatfil. Och så fortsätter det... Vid en eventuell omstart av analysprogrammet så behöver det veta var i chat-loggen det avbröts så att det då börjar läsa från rätt ställe så även den positionen behöver sparas i resultatfilen.
Det kan verka lockande att läsa in data till objekt eftersom primärminnet är snabbare än sekundärminnet. Men det är också begränsat i storlek vilket många programmerare verkar glömma eller vara omedvetna om. Att lägga beslag på stora mängder primärminne riskerar att slöa ned datorn rejält om den börjar använda swap/page file. Det är onödigt att skapa objekt i primärminnet för att lagra samma data som redan ligger i chat-loggen.
För att dela upp raden i de fyra delarna skulle jag föreslå re.match(), så får man samtidigt en koll på att raden faktiskt följer det tänkta formatet.
Visa spoiler
python -c "__import__('pprint').pprint((lambda r=__import__('re').compile('^([0-9-]{10}) ([0-9:]{5}) - ([^:]*): (.*)$'),f=(lambda o,da,ti,ni,te:(o.__dict__.update(dict(datum=da,tid=ti,nick=ni,text=te)) or o)),T=type('Meddelande',(),{'__repr__':lambda s:'<%s(%s)>'%(s.__class__.__name__,', '.join('%s=%s'%kv for kv in s.__dict__.iteritems()))}):[f(T(), *r.match(i).groups()) for i in file('meddelandelog.txt')])())" # detta är inte ett tips eller en lösning, det är bara ett expriment :-)
Om programmeringskurserna nån gång tar upp databaser kan det vara bra/kul att öva på det redan nu.
Laguna skrev:Om programmeringskurserna nån gång tar upp databaser kan det vara bra/kul att öva på det redan nu.
Ja, det kan komma till bra användning för denna uppgift. Eller så kan man använda pickling (serialisering) för att datat. Det har lägre inlärningströskel men är inte lika lämpligt som databaser för att hantera större mängder data.
Min lärare föreslog pandas, jag har kollat lite och det verkar nice.
Jag har en orelaterad fråga, är bibliotek (som pandas) som gigantiska samlingar klasser och metoder på klasser och funktioner?
Qetsiyah skrev:Min lärare föreslog pandas, jag har kollat lite och det verkar nice.
Det är många som använder pandas, framförallt för numerisk analys, och det sägs vara snabbt och bra. Pandas läser in datat i primärminnnet för att kunna arbeta snabbare (vilket kan innebära problem vilket jag tidigare skrev). Man kan dock kombinera pandas med dask för att arbeta med stora filer.
Jag har en orelaterad fråga, är bibliotek (som pandas) som gigantiska samlingar klasser och metoder på klasser och funktioner?
Ja, även om inte alla bibliotek är "gigantiska".
Jga har en json fil som är 20 mb, det är väl inte så stort?
Qetsiyah skrev:Jga har en json fil som är 20 mb, det är väl inte så stort?
Nej, det är pyttelitet i sammanhanget. Och för EDIT: json xml passar pandas utmärkt.
Jag ser inte var xml nämns, men jag kanske har missat det. Mitt råd är att inte ha med xml att göra om man inte måste.