Trädvy Permalänk
Medlem
Plats
Om jag bara visste
Registrerad
Jul 2001

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).

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

Trädvy Permalänk
Medlem
Plats
Umeå
Registrerad
Feb 2004

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.

Vill du ha svar? Citera mig gärna.

Trädvy Permalänk
Medlem
Plats
Om jag bara visste
Registrerad
Jul 2001

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?

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

Trädvy Permalänk
Hedersmedlem
Plats
Stockholm
Registrerad
Dec 2002

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

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