Programmering: Textanalys - reda ut vilken sport en text handlar om

Permalänk
Medlem

Programmering: Textanalys - reda ut vilken sport en text handlar om

Hej!

Jag funderar på hur man skulle gå tillväga för att analysera om en text (en nyhetsartikel) är en artikel om sport, och sedan reda ut vilken sport det rör sig om.

Låt oss säga att vi laddar hem fem artiklar från DN eller SvD. Två av dessa är artiklar som handlar om sport, tre om någonting annat. Den ena sportartikeln handlar om fotboll och den andra om ishockey. Hur skulle man skriva ett program som listar ut att två av tre är sportartiklar, och vilka sporter det rör sig om?

Det enda jag kan tänka mig på rak arm är att "väga" artiklarna. Det vill säga räkna hur många gånger ord som "sport", "resultat", "mål", "boll", "hockey" nämns i artikeln, och sedan ha ett gränsvärde som när detta passeras indikerar att en artikel antagligen är en sportartikel. Och sedan göra likadant för att få reda på vilken sport det handlar om. För fotboll räkna "gräs", "fot", "boll", etc. För ishockey räkna "is", "hockey", "klubba", "puck", etc.

Kan någon tänka sig ett elegantare och smidigare sätt att göra detta på?

Permalänk
Medlem

Hej,
Jag skulle nog gör ungefär som du, frågan hur stor mängd "sökord" man har.
Dvs man skulle kunna ta namn på spelare, lag, fordon etc. Och på så vis få en träff snabbare och förmodligen sporten samtidigt.

Typ "Zlatan Ibrahimovic", då är ju sannolikheten stor att det rör sig om sport och fotboll.

Det är väl inte elegantare, men kanske smidigare och framförallt snabbare.
Sen vilken typ av struktur man skulle använda sig av är väl en annan fråga.

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Medlem

Snabbhet är i sig inte speciellt viktigt, det viktigaste är att säkerheten i bedömningen av artiklarna. Programmet är endast tänkt att köras en gång om dagen (cron-jobb vid 00:00 eller något) så om det tar en kvart eller till och med en timma att köra gör det inte så mycket.

Permalänk
Medlem

Okej, du menar säkerhet att det blir en korrekt analys? (Hittar om det är en sport, och vilken sport det är?)

Tror fortfarande på att köra med namn och annat till att börja med för att utesluta annat.
Sen göra en kombination av det du sa i början av tråden för att bekräfta att det verkligen rör sig om fotboll.

Det kan ju vara så att det är en artikel om Zlatan som har festat på krogen och blivit misshandlad av vakten.
Då bör man ju ha andra "Sökord" som går mer ner på djupet för att bekräfta.

Dvs man har olika nivåer på "sökorden" så att man kan filtrera bort annat.

Får man träff på Zlatan kan man ju sen börja söka på lag, tuneringar, cuper, arenor etc etc.
Sen kan man börja söka på fotboll, bol, mål, gräs, etc etc som du skrev.

Det är trots allt antal "sökord" och val av sökord som avgör hur pass bra analysen blir i slutändan.
Och har man tillgång till en jäkla massa, så vill man förmodligen ha en bra struktor och annat, annars kan det rulla iväg och ta lång tid
för att göra analysen per artikel.

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Medlem

Precis, korrekt analys av vad artikeln handlar om, som sedan kan beskrivas i en databas. Även annan information är tänkt att hittas, så geografisk plats, etc.

Programmet är inte endast tänkt att användas för sport, dock. Det var mest ett exempel. För sport fungerar namn utmärkt, det håller jag med om, men när det kommer till andra områden blir det mer problematiskt. Om man till exempel skulle vilja analysera olika våldsbrott som beskrivs i nyhetsartiklar, till exempel, och reda ut vilken sorts attack det var (knivhuggning, skottlossning, bilbomb, ...) så fungerar det ju inte. Då känns det som att en vägning/ordräkning av artikeln är att föredra?

Hur skulle man göra i detta fallet? Om det inte finns personnamn man kan gå på (som exemplet med våldsbrott)? Någon idé?

Det här är ett ganska spännande problem tycker jag.

Permalänk
Medlem

Hitta inte själv på att "klubba", "puck", o.s.v. ska vara med. Gör i stället ett program som man kan öva genom att ge det artiklar och säga "det här är hockey", o.s.v. Det blir nog mycket mer flexibelt. Det du måste göra är att välja vad för du ska spara för nån information om artiklarna. Det första man tänker på är kanske ord och deras frekvenser, men man kan tänka sig annat. I alla fall: Använd data för att lära progammet i stället för att hitta på regler för hand.

Edit: För att sedan testa vad en ny artikel handlar om kan man göra nån typ av klassificerare, med support vector machines, eller neuronnät kanske. Om datan får för många dimensioner kan man använda principal component analysis. Hmm... har inte riktigt hunnit fundera.

Får jag fråga vad det ska användas till, det här programmet?

Permalänk
Medlem
Skrivet av tufflax:

Hitta inte själv på att "klubba", "puck", o.s.v. ska vara med. Gör i stället ett program som man kan öva genom att ge det artiklar och säga "det här är hockey", o.s.v. Det blir nog mycket mer flexibelt. Det du måste göra är att välja vad för du ska spara för nån information om artiklarna. Det första man tänker på är kanske ord och deras frekvenser, men man kan tänka sig annat. I alla fall: Använd data för att lära progammet i stället för att hitta på regler för hand.

Edit: För att sedan testa vad en ny artikel handlar om kan man göra nån typ av klassificerare, med support vector machines, eller neuronnät kanske. Om datan får för många dimensioner kan man använda principal component analysis. Hmm... har inte riktigt hunnit fundera.

Får jag fråga vad det ska användas till, det här programmet?

En av förutsättningarna för att skriva ett program som "lär sig" är att man har (extremt?) mycket material som man kan lära med. Alltså en mängd artiklar som man kan säga är "fotboll", "hockey", etc (eller "rån", "mord"). Och otroligt många fler artiklar för att lära programmet att det här är fotbollslaget "Arsenal", "Livorno", "AIK" (eller mordtyp "skjutning", "knivhuggning", etc).

Att ha ett program som lär sig är väl något man kan utveckla programmet till på ett senare stadie, när man har samlat på sig en ordentlig mängd källmaterial. Tror fortfarande en "artikelvåg" av något slag (+ mänsklig bearbetning i efterhand vid behov) kan vara okej som ett första stadium i alla fall?

Programmet ska användas för skapandet av databaser från vilka man kan dra slutsater om tendenser i nyhetsrapportering, i syfte att (i långa loppet, i alla fall) kunna bistå till samhällsvetenskaplig och humanistisk forskning och liknande. Låter kanske lite ambitiösare än vad det faktiskt är.

Permalänk
Medlem

Vektorklassicficiering. Men det kräver en viss träning.
Man sållar bort "stopwords" (ord som inte tillför klassificeringen som typ "att","kom","senare" osv).
Sen låter man varje ord vara en kordinat i ett multidimensionellt system där antal dimensioner är antal ord.
För att sedan ranka hur lika två dokument är så tar man "dotprodukten" mellan de vektorerna man skapat från de två dokumenten. Destå mindre vinkel dessa har destå mer har dessa gemensamt.
Om man då har kört igenom X antal dokument och efter hand klassificerat dessa så kan man sen automatiskt klassificera nya.
När jag jobbade på Webhallen så *experimenterade* jag med att skapa en sådan snurra för att automatiskt kunna ge rekommendationer på produkter från loggar. Den fungerade ganska bra och det var klart givande att leka med det.

Permalänk
Medlem

Vektorklassificering verkar vara ungefär det jag vill göra. Problemet är ju att jag inte har några artiklar att lära programmet med. Dessa måste jag ju på något sätt samla in (någon form av "ursprunglig ackumulation").

Antingen kan jag göra det för hand, vilket skulle ta år och dagar, eller så kan jag låta ett program göra hyfsade gissningar till dess att jag har samlat på mig tillräckligt med artiklar i alla olika kategorier för att kunna lära programmet hur det ska tolka framtida artiklar.

Edit: Det känns som att jag kanske missförstår eller är helt ute och cyklar. Rätta mig mer än gärna.

Permalänk

Hade gjort som du tänkt med ord som träffar i texterna om det inte vore för att det med allra största sannolikhet finns genvägar.

Förutsatt att du har mer än texten så kommer du att kunna ta ut att det är sport ur URLen till exempel. Det skulle utan tvekan vara det snabbaste och mest pricksäkra sättet. Är det å andra sidan mer för att lära sig eller rent utav en skoluppgift där meningen är att du ska processa texter och kategorisera övergripande i sport, vilken sport och övrigt så är nog det iXam skriver något att spinna vidare på.

Permalänk
Medlem

Som sagt, sport var bara ett exempel, kanske ett dåligt eftersom det är lite av ett specialfall då det går att använda egennamn, URL och så vidare för att lista ut att det är sport. Våldsbrott är nog ett bättre exempel (som hämtas ur en inrikes- eller utrikes-feed eller liknande).

Det är inget skolarbete, utan ett personligt projekt jag håller på med. Lutar fortfarande åt att räkna ord. I alla fall för tillfället.

Permalänk
Medlem

Namnet på den som har skrivit artikeln och när den har publicerats, och vart, det vill säga ligger den på tidning x sport avdelning.
Kan tänka mig att man gör någon webcrawler som kan leta lite grovt senan får man sortera ut avdelningar och journalister.
Så att den kan hitta artiklarna på ett snabbare sätt.

Privata bloggar kan tänkas falla bort, men om detta bara är för att bygga upp en artikel data bas så borde det fungera.

Kan man göra en lite mer avancerad analys kan man kanske se om artikeln refererar till en match som spelades under dagen.
Kolla namn på spelare i olika sporter, sport termer mm.

Permalänk
Medlem
Skrivet av Tunguska:

Namnet på den som har skrivit artikeln och när den har publicerats, och vart, det vill säga ligger den på tidning x sport avdelning.
Kan tänka mig att man gör någon webcrawler som kan leta lite grovt senan får man sortera ut avdelningar och journalister.
Så att den kan hitta artiklarna på ett snabbare sätt.

Sport var som sagt bara ett exempel, och antagligen ett dåligt sådant. Att söka efter journalister är inte speciellt aktuellt då nyheter ofta kommer från nyhetsbyråer typ AFP, AP, TT.

Citat:

Privata bloggar kan tänkas falla bort, men om detta bara är för att bygga upp en artikel data bas så borde det fungera

Bloggar är inte intressant. Endast nyheter och nyhetsartiklar, då endast dessa är representativa för nyhetsrapporteringen.

Lite hur jag tänker just nu (våldsbrott i världen):

  1. Hämta artiklar från New York Times utrikesflöde.

  2. Hämta artiklar från The Times (London) utrikesflöde.

  3. Räkna efter ord som tyder på att nyheten handlar om ett våldsbrott (violence, murder, shooting, beating, suspect, fight).

  4. Om antalet ord överskrider ett tröskelvärde (säg 5) är nyheten antagligen en nyhet om ett våldsbrott eller relaterat till detta.

  5. Räkna efter ord som tyder på vilken typ av våldsbrott det rör sig om (shoot, shot, gun, knife, stabbing, beating).

  6. Genom att se vilken sorts våldsbrott som får flest träffar i texten klassificeras nyheten som en sådan (skott, knivhugg, slagsmål).

  7. Och så vidare för annan information man vill ha ut av artikeln.

Det borde ju fungera hyfsat, ändå. Eller?

Permalänk
Medlem

Jag skulle börja med att testa något enkelt:
1) samla in ett gäng av testdata från kända sidor där du med stor säkerhet kan säga att artiklarna hör till hockey, fotboll, mode, etc.
2) bestäm dig för om det räcker att göra en binär klassning "sport eller ej" eller om du vill göra multiklassning
3) bestäm dig för en ordlista (ord_0=hej, ord_1=test, ...), du kan crawla igenom alla artiklar du plockat hem och använd varje unik förekomst
3) Träna upp en klassificerare med SVM, t.ex. libsvm, svm-light eller liknande genom att för varje artikel ta fram ett normaliserat histogram över förekomsten av ord gentemot den ordlista du skapade nyss. På detta vis så kommer varje artikel motsvara (precis som i vektorklassificeringen) en punkt i ett låt säga 20000-dimensionellt rum. Det är där svm (stöd-vektorerna) kommer in för att separera rummet i olika klasser
4) med en klassificerare tränad så tar du varje ny artikel, räknar ut histogrammet (O(n) där n är antalet ord i artikeln förutsatt att du använder en vettig hash på din ordlista), sedan är klassningen bara frågan om en skalärprodukt i stort sett, och du får ett svar -1 eller 1, också O(n) i tidskomplexitet.

Ett annat alternativ är att du för varje test-artikel bygger och utökar en markov-kedja över hur orden följer på varandra. Du kan sedan följa varje ny artikel genom markov-kedjan och summera upp sannolikheten att den givna artikeln hör till mängden av sport-artiklar eller ej.
t.ex.

s0) En åsna går på ängen s1) En åsna vandrar på en stig s2) På ängen vandrar en åsna s3) Min kompis gillar en åsna t0) På ängen vandrar min kompis t1) På en stig går en åsna s0,s1,s2 ger oss följande: nod_0 = "En", P_start=2/4 nod_1 = "åsna" nod_2 = "går" nod_3 = "på", P_start=1/4 nod_4 = "ängen" nod_5 = "vandrar" nod_6 = "stig" nod_7 = "min", P_start=1/4 nod_8 = "kompis" nod_9 = "gillar" nod_10 = "" (tom) Bygg en graf/kedja nod_0 --> nod_1 P=4/5 nod_0 --> nod_6 P=1/5 nod_1 --> nod_2 P=1/4 nod_1 --> nod_5 P=1/4 nod_1 --> nod_10 P=2/4 nod_2 --> nod_3 P=1 nod_3 --> nod_0 P=1/2 nod_3 --> nod_4 P=2/3 nod_4 --> nod_5 P=1/2 nod_4 --> nod_10 P=1/2 nod_4 --> nod_5 P=1/2 nod_5 --> nod_0 P=1/2 nod_5 --> nod_3 P=1/2 nod_6 --> nod_10 P=1 nod_7 --> nod_8 P=1 nod_8 --> nod_9 P=1 nod_9 --> nod_0 P=1

självklart behöver du mycket mer data.
Men du kan nu ta en sträng och starta på ett ställe i grafen och följa orden i artikeln och multiplicera sannolikheterna. Ju högre slh. desto troligare att texten hör till den text du använde för att träna systemet.

Du kan också leka med att bygga statistik baserade på n-gram för att kunna räkna ut ett antal mått på artikeln i fråga. Sedan får du finna lämpliga kriterier på vad artikeln ska klassas som.

Lycka till

Visa signatur

weeeee

Permalänk
Medlem

Av ren nyfikenhet så undrar jag om du gjort några framsteg. Det har ju gått några veckor sedan senast.
Vore skoj att veta hur/om du löst problemet.

Visa signatur

weeeee