Forbereder en boksindeks ved hjelp av Python

Du har sikkert kommet over noen av de store tekstbøkene og la merke til indeksen på slutten. Med en kopi er det fint å ha en slik indeks for å navigere raskt til ønsket side. Jeg har nylig publisert en veldig kort bok, og når det gjelder å sette indeksen, virket oppgaven skremmende selv om boka er veldig kort. Boken har ikke en indeks ennå uansett.

Hvis du har fulgt artiklene mine, vil du legge merke til at jeg hovedsakelig skriver om Python og hvordan det kan hjelpe oss med å løse forskjellige problemer på en enkel måte. Så la oss se hvordan vi kan sette en boksindeks ved hjelp av Python.

Uten videre, la oss komme i gang.

Hva er en bokindeks?

Jeg erganske sikker på at de fleste av dere vet hva en bokindeks er, men jeg vil bare raskt avklare dette konseptet.

EN bok indeks er bare en samling av ord og / eller setninger som anses viktig for boken, sammen med deres plasseringer i boken. Indeksen inneholder ikke hvert ord / setning i boken. Årsaken til dette er vist i neste avsnitt.

Hva gjør en god boksindeks?

Hva om du hadde en indeks der du finner plasseringen av hvert ord eller uttrykk i boken? Ville det ikke bli vurdert som indeksen til valg? Feil!

Valgt indeks, eller hva som skal betraktes som en god indeks, er det som peker på de viktige ordene og setningene i boken. Du kan være i tvil om årsaken til det. La oss ta et eksempel. Si at vi har en bok som bare består av følgende setning:

Min bok er kort

Hva vil skje hvis vi prøver å indeksere hvert ord og uttrykk i den svært korte setningen, forutsatt at plasseringen er ordetummeret i setningen? Dette er indeksen som vi ville ha i dette tilfellet:

min bok er kort: 1 min bok er: 1 min bok: 1 min: 1 kort: 4 er kort: 3 er: 3 boken er kort: 2 boken er: 2 bok: 2

Fra eksemplet ovenfor kan vi se at en slik indeks ville være større enn selve boken! Så en god indeks ville være en som inneholder ordene og setningene som anses viktige for leseren.

Setup

Natural Language Toolkit (NLTK)

I denne opplæringen bruker vi biblioteket Natural Language Toolkit (NLTK), som brukes til å jobbe med menneskelige språkdata. Som nevnt i dokumentasjonen, har NLTK blitt kalt "et flott verktøy for undervisning, og arbeidet i, databehandling lingvistikk ved hjelp av Python" og "et fantastisk bibliotek å leke med naturlig språk."

Jeg skriver for øyeblikket denne opplæringen fra min Ubuntu-maskin, og trinnene for installasjon av NLTK i denne delen vil være relevante for Ubuntu-operativsystemet. Men ikke bekymre deg, du kan finne trinnene for installasjon av NLTK på andre operativsystemer på NLTKs nettsted.

For å installere NLTK, skal jeg bruke pip. Hvis du ikke allerede har installert pip, kan du bruke følgende kommando i terminalen din for å installere pip:

sudo easy_install3 pip

For å sikre at du har pip installert, skriv inn følgende kommando:

pip - versjon

Du bør få noe som ligner på følgende:

pip 8.1.2 fra /usr/local/lib/python3.5/dist-packages/pip-8.1.2-py3.5.egg (python 3.5)

Nå, for å installere NLTK, kjør du bare følgende kommando i terminalen din:

sudo pip install -U nltk

Du kan teste nltk-installasjonen ved å skrive python, og deretter importerer nltk i terminalen din. Hvis du får ImportError: Ingen modul kalt nltk, denne tråden kan hjelpe deg.

Testfil

På dette tidspunktet trenger vi en testfil (bok) som skal brukes til å lage en bokindeks. Jeg tar denne boken: Endringsfrekvensen for endringshastigheten av EFF. Du kan laste ned tekstfilen til boken fra Dropbox. Du kan selvfølgelig bruke en hvilken som helst bok av ditt valg; du trenger bare noe å eksperimentere med i denne opplæringen.

Program

La oss starte med den interessante delen i denne opplæringen, programmet som vil hjelpe oss til å utgjøre bokindeksen. Det første vi ønsker å gjøre er å finne ordet frekvens i boken. Jeg har vist hvordan vi kan gjøre det i en annen opplæring, men jeg vil vise deg hvordan vi kan gjøre det ved hjelp av NLTK biblioteket.

Dette kan gjøres på følgende måte:

import nltk, samlinger fra nltk.collocations import * frekvenser = collections.Counter () med åpen ('bigd10.txt') som bok: read_book = book.read () ord = nltk.word_tokenize (read_book) for w i ord: frekvenser [w] + = 1 utskrift (frekvenser) 

Når du kjører programmet, vil du legge merke til at vi vil ha en veldig lang liste over ord og deres frekvenser.

Før vi går videre, la oss analysere den ovennevnte koden litt. I følgende linje:

frekvenser = samlinger.Teller ()

Vi prøver å bruke Disk() funksjon for å få ordfrekvensene i boken (hvor mange ganger ordet skjedde i boken).

word_tokenize, på den annen side deler setningene i deres bestanddeler. La oss ta et enkelt eksempel for å se hvordan word_tokenize faktisk fungerer:

fra nltk.tokenize import word_tokenize sentence = 'Mitt navn er Abder. Jeg liker Python. Det er et ganske fint programmeringsspråk 'print (word_tokenize (setning))

Utgangen av det ovennevnte skriptet er som følger:

['My', 'name', 'er', 'Abder', '.', 'Jeg', 'like', 'Python', '.', 'It', '' s ',' a ' 'pen', 'hyggelig', 'programmering', 'språk']

Vi slår deretter gjennom ordene og finner hyppigheten av forekomsten av hvert ord.
Hva med setninger (kombinasjon av ord)? De kalles collocations (en rekke ord som ofte forekommer sammen). Et eksempel på kollokasjoner er bigrammer blir produsert, det er en liste over ordpar. Ligner på det er trigrams (en kombinasjon av tre ord), og så videre (dvs. n-gram).

La oss si at vi ønsker å trekke ut bigramene fra vår bok. Det kan vi gjøre som følger:

bigram = nltk.collocations.BigramAssocMeasures () finder = BigramCollocationFinder.from_words (ord) finder.apply_freq_filter (2)

Nummeret 2 i apply_freq_filter () funksjonen forteller oss å ignorere alle bigrams som forekommer mindre enn to ganger i boken.

Hvis vi vil finne 30 mest forekommende bigrams i boken, kan vi bruke følgende kodestilling:

print (finder.nbest (bigram.pmi, 30))

Til slutt, hvis vi ønsker å finne plasseringen, som er i vårt tilfelle der ordet eller setningen oppstår i boken (ikke sidenummeret), kan vi gjøre følgende:

print (read_book.index ('computer')) print (read_book.index ('Assisted Reporting'))

Ovennevnte uttalelser ser ut til å returnere ordet plassering i en setning, som ligner på det vi har sett i vår korte setning eksempel i begynnelsen av opplæringen.

Sette alt sammen

La oss sette det vi har lært i et enkelt Python-skript. Følgende skript vil lese vår bok og returnere ordfrekvensene, sammen med de 30 mest forekommende bigramene i boken, i tillegg til plasseringen av et ord og en setning i boken:

import nltk, samlinger fra nltk.collocations import * frekvenser = collections.Counter () med åpen ('bigd10.txt') som bok: read_book = book.read () ord = nltk.word_tokenize (read_book) for w i ord: frekvenser [w] + = 1 bigram = nltk.collocations.BigramAssocMeasures () finder = BigramCollocationFinder.from_words (ord) finder.apply_freq_filter (2) print ('Disse er ordene og hyppigheten av deres forekomst i boken:') print ) skrive ut ('############################################## ########## ("Det er de 30 største bigramene som finnes i boken: ') print (finder.nbest (bigram.pmi, 30)) print (read_book.index ('computer')) print (read_book.index ('Assisted Reporting')) 

Konklusjon

Som vi har sett i denne opplæringen, kan selv en kort tekst være veldig skremmende når det gjelder å bygge en indeks for den teksten. Også en automatisert måte å bygge den optimale indeksen på boken er kanskje ikke gjennomførbar nok.

Vi var i stand til å løse dette problemet ved å bruke Python og NLTK biblioteket, der vi kunne velge de beste ordene og setningene for bokindeksen basert på deres hyppighet av forekomst (dvs. betydning) i boken.

Det er selvfølgelig mer du kan gjøre med NLTK, som vist i bibliotekets dokumentasjon. Du kan også henvise til boken Natural Language Processing med Python hvis du ønsker å gå dypere i dette biblioteket.