Permalänk
Medlem

Plocka fram n-gram statistik

Jag är intresserad av att plocka fram n-gram statistik från en textfil jag har. Det innebär att jag vill räkna antalet förekomster av varje ord i texten. Vidare vill jag även räkna antalet förekomster av varje sekvens av två ord, tre ord och möjligen även 4 ord.

Ett exempel på det jag menar finns här:
http://googleresearch.blogspot.com/2006/08/all-our-n-gram-are...

Där har dom t.ex tagit fram att i den filen dom gick igenom så förekom sekvensen
ceramics collectables collectibles
55ggr.

Jag har börjat lite, och har fått fram ett script som räknar antalet förekomster av varje ord. Men när jag ska utvidga det till sekvenser av ord så kommer jag ingen vart.
awk -F'[^a-zA-ZåäöÅÄÖ]+' '{ for (i = 1; i <= NF; i++) words[$i]++ } END { for (i in words) print i, words[i] }' <file>

Jag testade att skriva ett litet program i java där den läste in sekvenserna i en hashmap, men inte helt oväntat så fick jag minnesproblem eftersom filen är väldigt stor (ca 1gb).

Visa signatur

Du är min fiende tills motsatsen är bevisad, och bevisbördan ligger hos dig.

Permalänk
Medlem

Re: Plocka fram n-gram statistik

Datastrukturmässigt känns det som en Trie skulle passa, där du i varje nod sparar hur många gånger en viss sekvens påträffats. För att spara minne kan du ha en separat mängd (typ HashSet) för de enskilda orden, dit noderna i trien håller referenser.

Är det just en lösning i awk som du är ute efter så har jag ingen aning om hur praktiskt mitt förslag är.

Visa signatur

Vill du ha svar? Citera mig gärna.

Permalänk
Medlem

Re: Re: Plocka fram n-gram statistik

Citat:

Ursprungligen inskrivet av lajnold
Är det just en lösning i awk som du är ute efter så har jag ingen aning om hur praktiskt mitt förslag är.

Jag är totalt likgiltig för vilken lösning jag använder, jag är intresserad av resultatet. Jag fick för mig att detta var något som var enkelt att fixa med ett litet shellscript med någon kombination av cat sort och wc, men jag kanske har fel där?

Visa signatur

Du är min fiende tills motsatsen är bevisad, och bevisbördan ligger hos dig.

Permalänk
Hedersmedlem

Att endast göra det med cat, sort och wc går tyvärr inte.
Det går säkert att bygga på AWK-raden jag gav dig (jag nickar xevz på IRC), men lär bli ganska komplext i slutändan.

Gör man det i Perl finns det säkert någon modul på CPAN som kan hjälpa:
http://search.cpan.org/search?query=ngram&mode=all

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.