Een boekindex voorbereiden met Python

U bent waarschijnlijk enkele van die grote tekstboeken tegengekomen en hebt de index aan het eind opgemerkt. Met een papieren versie is het fijn om zo'n index te hebben om snel naar de gewenste pagina te gaan. Ik heb onlangs een heel kort boek gepubliceerd en als het erop aankwam om de index te bepalen, leek de taak ontmoedigend, hoewel het boek erg kort is. Het boek heeft sowieso nog geen index.

Als je mijn artikelen hebt gevolgd, zul je merken dat ik voornamelijk over Python schrijf en hoe het ons op een eenvoudige manier kan helpen bij het oplossen van verschillende problemen. Laten we dus kijken hoe we een boekenindex kunnen instellen met behulp van Python.

Zonder verder oponthoud gaan we aan de slag.

Wat is een boekenindex?

Imvrij zeker dat de meesten van jullie weten wat een boekenindex is, maar ik wil dit concept snel verduidelijken.

EEN boekindex is gewoon een verzameling woorden en / of zinsdelen die als belangrijk worden beschouwd voor het boek, samen met hun locaties in het boek. De index bevat niet elk woord / zin in het boek. De reden hiervoor staat in de volgende sectie.

Wat maakt een goede boekenindex?

Wat als u een index had waarmee u de locatie van elk woord of elke zin in het boek kunt vinden? Zou dat niet als de voorkeursindex kunnen worden beschouwd? Fout!

De voorkeursindex, of wat als een goede index wordt beschouwd, is die naar de belangrijke woorden en zinsneden in het boek verwijst. Je vraagt ​​je misschien af ​​waarom dat zo is. Laten we een voorbeeld nemen. Stel dat we een boek hebben dat alleen uit de volgende zin bestaat:

Mijn boek is kort

Wat zou er gebeuren als we proberen elk woord en elke zin in die zeer korte zin te indexeren, ervan uitgaande dat de locatie het woordnummer in de zin is? Dit is de index die we in dit geval zouden hebben:

mijn boek is kort: 1 mijn boek is: 1 mijn boek: 1 mijn: 1 kort: 4 is kort: 3 is: 3 boek is kort: 2 boek is: 2 boek: 2

Uit het bovenstaande voorbeeld kunnen we afleiden dat zo'n index groter zou zijn dan het boek zelf! Dus een goede index zou een index zijn die de woorden en zinnen bevat die belangrijk worden geacht voor de lezer.

Opstelling

Natural Language Toolkit (NLTK)

In deze zelfstudie gebruiken we de Natural Language Toolkit (NLTK) -bibliotheek, die wordt gebruikt om met menselijke taalgegevens te werken. Zoals vermeld in de documentatie, wordt NLTK "een geweldige tool voor lesgeven en werken in, computationele taalkunde met Python" en "een geweldige bibliotheek om met natuurlijke taal te spelen" genoemd.

Ik ben momenteel bezig met het schrijven van deze tutorial van mijn Ubuntu-machine en de stappen voor het installeren van NLTK in dit gedeelte zijn relevant voor het Ubuntu-besturingssysteem. Maar maak je geen zorgen, je kunt de stappen vinden voor het installeren van NLTK op andere besturingssystemen op de NLTK-website.

Om NLTK te installeren, ga ik pip gebruiken. Als u nog geen pip hebt geïnstalleerd, kunt u de volgende opdracht in uw terminal gebruiken om te installeren Pip:

sudo easy_install3 pip

Om ervoor te zorgen dat je pip geïnstalleerd hebt, typ je de volgende opdracht:

pip --version

Je zou iets moeten krijgen dat lijkt op het volgende:

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

Om nu NLTK te installeren, voert u eenvoudig het volgende commando uit in uw terminal:

sudo pip install -U nltk

U kunt de nltk-installatie testen door te typen Python, en vervolgens nltk importeren in uw terminal. Als je krijgt ImportError: geen module met de naam nltk, deze thread kan je misschien helpen.

Testbestand

Op dit moment hebben we een testbestand (boek) nodig om te gebruiken voor het maken van een boekenindex. Ik pak dit boek: De snelheid waarmee het veranderingspercentage verandert door de EFF. U kunt het tekstbestand van het boek downloaden van Dropbox. U kunt natuurlijk elk boek van uw keuze gebruiken; je hebt gewoon iets nodig om mee te experimenteren in deze tutorial.

Programma

Laten we beginnen met het interessante deel in deze zelfstudie, het programma dat ons zal helpen de boekindex te vormen. Het eerste wat we willen doen, is de woordfrequentie in het boek vinden. Ik heb laten zien hoe we dat kunnen doen in een andere tutorial, maar ik wil je laten zien hoe we dat kunnen doen met behulp van de NLTK-bibliotheek.

Dit kan als volgt worden gedaan:

import nltk, collections from nltk.collocations import * frequencies = collections.Counter () met open ('bigd10.txt') als boek: read_book = book.read () words = nltk.word_tokenize (read_book) voor w in woorden: frequencies [w] + = 1 afdruk (frequenties) 

Wanneer u het programma uitvoert, zult u merken dat we een zeer lange lijst met woorden en hun frequenties zullen hebben.

Voordat we verdergaan, laten we de bovenstaande code een beetje analyseren. In de volgende regel:

frequencies = collections.Counter ()

We proberen het te gebruiken Teller() functie om het woord frequenties in het boek te krijgen (hoe vaak het woord in het boek voorkomt).

word_tokenize, aan de andere kant, splitst de zinnen in hun samenstellende delen. Laten we een eenvoudig voorbeeld nemen om te zien hoe word_tokenize werkt eigenlijk:

from nltk.tokenize import word_tokenize sentence = 'Mijn naam is Abder. Ik hou van Python. Het is een vrij mooie programmeertaal 'print (word_tokenize (zin))

De uitvoer van het bovenstaande script is als volgt:

['Mijn', 'naam', 'is', 'Abder', '.', 'I', 'like', 'Python', '.', 'It', "'s",' a ', 'mooi', 'leuk', 'programmeren', 'taal']

Vervolgens doorlopen we de woorden en vinden we de frequentie van voorkomen van elk woord.
Hoe zit het met zinnen (woordencombinatie)? Die worden genoemd collocaties (een reeks woorden die vaak samen voorkomen). Een voorbeeld van collocaties is bigrammen, dat is een lijst met woordparen. Gelijkaardig aan dat is trigrammen (een combinatie van drie woorden), enzovoort (dat wil zeggen n-grammen).

Laten we zeggen dat we de bigrammen uit ons boek willen halen. We kunnen dat als volgt doen:

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

Het nummer 2 in de apply_freq_filter () functie vertelt ons om alle bigrammen die minder dan twee keer voorkomen in het boek te negeren.

Als we het willen vinden 30 meest voorkomende bigrammen in het boek, kunnen we de volgende codeverklaring gebruiken:

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

Als we tenslotte de locatie willen vinden, in ons geval waar het woord of de woordgroep voorkomt in het boek (niet het paginanummer), kunnen we het volgende doen:

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

De bovenstaande uitspraken lijken het woord locatie in een zin terug te geven, vergelijkbaar met wat we in het korte voorbeeld van de zin aan het begin van de tutorial hebben gezien.

Alles samenvoegen

Laten we het geleerde in één Python-script plaatsen. Het volgende script zal ons boek lezen en de woordfrequenties retourneren, samen met de 30 meest voorkomende bigrammen in het boek, naast de locatie van een woord en een zin in het boek:

import nltk, collections from nltk.collocations import * frequencies = collections.Counter () met open ('bigd10.txt') als boek: read_book = book.read () words = nltk.word_tokenize (read_book) voor w in woorden: frequencies [w] + = 1 bigram = nltk.collocations.BigramAssocMeasures () finder = BigramCollocationFinder.from_words (words) finder.apply_freq_filter (2) print ('Dat zijn de woorden en hun frequentie van voorkomen in het boek:') print (frequenties ) print ('###################### ################### ') print (' Dit zijn de 30 meest bigrammen die voorkomen in het boek: ') print (finder.nbest (bigram.pmi, 30)) print (read_book.index ('computer')) print (read_book.index ('Assisted Reporting')) 

Conclusie

Zoals we in deze tutorial hebben gezien, kan zelfs een korte tekst erg ontmoedigend zijn als het gaat om het bouwen van een index voor die tekst. Ook is een geautomatiseerde manier voor het maken van de optimale index voor het boek mogelijk niet haalbaar genoeg.

We konden dit probleem oplossen door Python en de NLTK-bibliotheek te gebruiken, waar we de beste woorden en zinnen voor de boekenindex konden kiezen op basis van hun frequentie van voorkomen (dat wil zeggen belangrijkheid) in het boek.

Er is, natuurlijk, meer wat je kunt doen met NLTK, zoals te zien is in de documentatie van de bibliotheek. Je kunt ook het boek Natuurlijke taalverwerking met Python raadplegen als je dieper in deze bibliotheek wilt gaan.