Du har förmodligen stött på några av de stora textböckerna och märkt indexet i slutet. Med en kopia är det trevligt att ha ett sådant index för att snabbt navigera till önskad sida. Jag har nyligen publicerat en mycket kort bok, och när det gäller att ställa in indexet verkade uppgiften skrämmande trots att boken är mycket kort. Boken har inget index än ändå.
Om du har följt mina artiklar kommer du märka att jag huvudsakligen skriver om Python och hur det kan hjälpa oss att lösa olika problem på ett enkelt sätt. Så låt oss se hur vi kan ställa in ett bokindex med Python.
Utan ytterligare ado, låt oss komma igång.
Jag ärganska säker på att de flesta av dig vet vad ett bokindex är, men jag vill bara snabbt klargöra detta koncept.
en bokindex är helt enkelt en samling av ord och / eller fraser som anses vara viktiga för boken, tillsammans med deras platser i boken. Indexet innehåller inte varje ord / fras i boken. Anledningen till detta visas i nästa avsnitt.
Vad händer om du hade ett index genom vilket du kan hitta platsen för varje ord eller fras i boken? Skulle inte det anses vara ett valindex? Fel!
Valet index, eller vad som skulle anses vara ett bra index, är det som pekar på de viktiga orden och fraserna i boken. Du kanske ifrågasätter orsaken till det. Låt oss ta ett exempel. Säg att vi har en bok som endast består av följande mening:
Min bok är kort
Vad skulle hända om vi försöker indexera varje ord och fras i den mycket korta meningen, förutsatt att platsen är ordnumret i meningen? Detta är det index som vi skulle ha i det här fallet:
min bok är kort: 1 min bok är: 1 min bok: 1 min: 1 kort: 4 är kort: 3 är: 3 boken är kort: 2 boken är: 2 bok: 2
Från exemplet ovan kan vi se att ett sådant index skulle vara större än själva boken! Så ett bra index skulle vara en som innehåller de ord och fraser som anses vara viktiga för läsaren.
I den här handledningen använder vi biblioteket Natural Language Toolkit (NLTK), som används för att arbeta med mänskliga språkdata. NLTK har som nämnts i dokumentationen kallats "ett underbart verktyg för undervisning och arbete i computational linguistics using Python" och "ett fantastiskt bibliotek att spela med naturligt språk".
Jag skriver för närvarande denna handledning från min Ubuntu-maskin, och stegen för installation av NLTK i det här avsnittet kommer att vara relevant för Ubuntu-operativsystemet. Men oroa dig inte, du kan hitta stegen för att installera NLTK på andra operativsystem på NLTKs webbplats.
För att installera NLTK, ska jag använda pip. Om du inte redan har pip installerat kan du använda följande kommando i din terminal för att installera pip
:
sudo easy_install3 pip
För att vara säker på att du har pip installerat, skriv följande kommando:
pip - version
Du borde få något liknande följande:
pip 8.1.2 från /usr/local/lib/python3.5/dist-packages/pip-8.1.2-py3.5.egg (python 3.5)
Nu, för att installera NLTK, kör du bara följande kommando i din terminal:
sudo pip install -U nltk
Du kan testa nltk-installationen genom att skriva pytonorm
, och sedan importera nltk i din terminal. Om du får ImportError: Ingen modul namngiven nltk
, den här tråden kan hjälpa dig.
Vid denna tidpunkt behöver vi en testfil (bok) som ska användas för att skapa ett bokindex. Jag tar den här boken: Ändringshastigheten för förändringshastigheten av EFF. Du kan ladda ner textfilen i boken från Dropbox. Du kan självklart använda en bok av ditt val; du behöver bara något att experimentera med i denna handledning.
Låt oss börja med den intressanta delen i denna handledning, det program som hjälper oss att skapa bokindexet. Det första vi vill göra är att hitta ordet frekvens i boken. Jag har visat hur vi kan göra det i en annan handledning, men jag vill visa dig hur vi kan göra det med NLTK-biblioteket.
Detta kan göras enligt följande:
import nltk, samlingar från nltk.collocations import * frekvenser = samlingar.Counter () med öppen ('bigd10.txt') som bok: read_book = book.read () words = nltk.word_tokenize (read_book) för w i ord: frekvenser [w] + = 1 skriv ut (frekvenser)
När du kör programmet kommer du att märka att vi får en mycket lång lista med ord och deras frekvenser.
Innan vi går vidare, låt oss analysera ovanstående kod en bit. I följande rad:
frekvenser = samlingar.Counter ()
Vi försöker använda Disken()
funktion för att få ordfrekvenserna i boken (hur många gånger ordet hände i boken).
word_tokenize
, å andra sidan delar upp meningarna i deras ingående delar. Låt oss ta ett enkelt exempel för att se hur word_tokenize
faktiskt fungerar:
från nltk.tokenize import word_tokenize sentence = 'Jag heter Abder. Jag gillar Python. Det är ett ganska trevligt programmeringsspråk "print (word_tokenize (sentence))
Resultatet av ovanstående skript är följande:
['My', 'name', 'is', 'Abder', '.', 'I', 'like', 'Python', '.', 'It', '' s ',' a ' 'pretty', 'nice', 'programming', 'language']
Vi slår sedan igenom orden och hittar frekvensen av varje ords förekomst.
Vad sägs om fraser (kombination av ord)? De kallas kollokationer (en ordsekvens som ofta uppstår). Ett exempel på samlokationer är bigrams, det är en lista över ordpar. Liksom det är trigrams (en kombination av tre ord) och så vidare (dvs n-gram).
Låt oss säga att vi vill extrahera bigramerna från vår bok. Vi kan göra det enligt följande:
bigram = nltk.collocations.BigramAssocMeasures () finder = BigramCollocationFinder.from_words (ord) finder.apply_freq_filter (2)
Numret 2
i apply_freq_filter ()
funktionen säger att vi ska ignorera alla bigrams som inträffar mindre än två gånger i boken.
Om vi vill hitta 30
mest förekommande bigrams i boken kan vi använda följande koddeklaration:
print (finder.nbest (bigram.pmi, 30))
Slutligen, om vi skulle vilja hitta platsen, vilket är i vårt fall där ordet eller frasen förekommer i boken (inte sidnumret), kan vi göra följande:
skriv ut (read_book.index ('computer')) print (read_book.index ('Assisted Reporting'))
Ovanstående uttalanden verkar återge ordplatsen i en mening, som liknar vad vi sett i vårt korta exempel i början av handledningen.
Låt oss sätta vad vi har lärt oss i ett enda Python-skript. Följande skript kommer att läsa vår bok och returnera ordfrekvenserna, tillsammans med de 30 mest förekommande bigramerna i boken, förutom platsen för ett ord och en fras i boken:
import nltk, samlingar från nltk.collocations import * frekvenser = samlingar.Counter () med öppen ('bigd10.txt') som bok: read_book = book.read () words = nltk.word_tokenize (read_book) för w i ord: frekvenser [w] + = 1 bigram = nltk.collocations.BigramAssocMeasures () finder = BigramCollocationFinder.from_words (ord) finder.apply_freq_filter (2) print ('Dessa är orden och deras frekvens i förekomsten i boken:') print (frekvenser ) print ('################################################################################################## #########) ("Det är de 30 största bigramerna som finns i boken: ') print (finder.nbest (bigram.pmi, 30)) skriv ut (read_book.index ('computer')) print (read_book.index ('Assisted Reporting'))
Som vi har sett i den här handledningen kan även en kort text vara mycket skrämmande när det gäller att bygga ett index för den texten. Ett automatiskt sätt att bygga det optimala indexet för boken är inte heller möjligt.
Vi kunde lösa det här problemet genom att använda Python och NLTK-biblioteket, där vi kunde välja de bästa orden och fraserna för bokindexet baserat på deras förekomstfrekvens (dvs betydelse) i boken.
Det finns självklart mer du kan göra med NLTK, vilket framgår av bibliotekets dokumentation. Du kan också hänvisa till boken Natural Language Processing med Python om du vill gå djupare i det här biblioteket.