Pregătirea unui index al cărților utilizând Python

Ați întâmpinat probabil unele dintre acele cărți mari și ați observat indicele la sfârșit. Cu o copie de hârtie, este bine să aveți un astfel de index pentru a naviga rapid la pagina dorită. Am publicat recent o carte foarte scurtă, iar când a venit la stabilirea indexului, sarcina părea descurajantă, chiar dacă cartea este foarte scurtă. Cartea nu are încă un index.

Dacă v-ați urmărit articolele, veți observa că scriu în principal despre Python și cum ne poate ajuta în rezolvarea diferitelor probleme într-un mod simplu. Deci, să vedem cum putem seta un index de carte utilizând Python.

Fără să mai vorbim, să începem.

Ce este un index al cărții?

Suntdestul de sigur că majoritatea știți ce este un indice de carte, dar vreau doar să clarific acest concept rapid.

A indicele de carte este pur și simplu o colecție de cuvinte și / sau expresii care sunt considerate importante pentru carte, împreună cu locațiile lor din carte. Indicele nu conține niciun cuvânt / frază din carte. Motivul pentru care este prezentat în următoarea secțiune.

Ce face un index al cărții bune?

Dacă ați avea un index prin care puteți găsi locația fiecărui cuvânt sau frază în carte? Nu ar fi considerat ca indice de alegere? Gresit!

Indicele de alegere sau ceea ce ar fi considerat un indice bun este ceea ce indică cuvintele și expresiile importante din carte. S-ar putea să întrebați motivul pentru asta. Să luăm un exemplu. Spuneți că avem o carte care constă numai din următoarea frază:

Cartea mea este scurtă

Ce s-ar întâmpla dacă încercăm să indexăm fiecare cuvânt și frază în acea teză foarte scurtă, presupunând că locația este numărul de cuvânt din propoziție? Acesta este indicele pe care l-am avea în acest caz:

cartea mea este scurtă: 1 cartea mea este: 1 cartea mea: 1 mea: 1 scurtă: 4 scurtă: 3 este: 3 carte este scurtă: 2 carte este: 2 carte: 2

Din exemplul de mai sus, putem vedea că un astfel de indice ar fi mai mare decât cartea însăși! Deci, un indice bun ar fi unul care conține cuvintele și frazele considerate importante pentru cititor.

Înființat

Instrumentul de limbă naturală (NLTK)

În acest tutorial, vom folosi biblioteca Natural Language Toolkit (NLTK), care este folosită pentru a lucra cu date de limbă umană. După cum se menționează în documentație, NLTK a fost numit "un instrument minunat pentru predarea și lucrul în lingvistica computațională folosind Python" și "o bibliotecă uimitoare de a juca cu limba naturală".

În prezent, scriu acest tutorial de pe mașina mea Ubuntu, iar pașii pentru instalarea NLTK în această secțiune vor fi relevanți pentru sistemul de operare Ubuntu. Dar nu vă faceți griji, puteți găsi pașii pentru instalarea NLTK pe alte sisteme de operare pe site-ul NLTK.

Pentru a instala NLTK, voi folosi pip. Dacă nu aveți deja instalat pip, puteți utiliza următoarea comandă în terminal pentru a instala țâfnă:

sudo easy_install3 pip

Pentru a vă asigura că ați instalat un pip, tastați următoarea comandă:

pip --versiune

Ar trebui să obțineți ceva similar cu următorul:

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

Acum, pentru a instala NLTK, pur și simplu rulați următoarea comandă în terminal:

sudo pip install -U nltk

Puteți testa instalarea nltk tastând piton, și apoi importați nltk în terminalul dvs. Daca primesti ImportError: Niciun modul numit nltk, acest fir ar putea să vă ajute.

Fișier de test

În acest moment, avem nevoie de un fișier de testare (carte) care să fie utilizat pentru crearea unui index de carte. O să apuc această carte: Rata de schimbare a ratei de schimbare de către FEP. Puteți descărca fișierul text al cărții din Dropbox. Puteți folosi, desigur, orice carte pe care o alegeți; trebuie doar să experimentați ceva în acest tutorial.

Program

Să începem cu partea interesantă din acest tutorial, programul care ne va ajuta să formăm indexul cărții. Primul lucru pe care vrem să-l facem este să găsim frecvența cuvântului în carte. Am arătat cum putem face acest lucru într-un alt tutorial, dar vreau să vă arăt cum putem face acest lucru folosind biblioteca NLTK.

Acest lucru se poate face după cum urmează:

import nltk, colecții din nltk.collocations import * frequencies = collections.Counter () cu open ('bigd10.txt') ca carte: read_book = book.read () words = nltk.word_tokenize (read_book) [w] + = 1 imprimare (frecvențe) 

Când executați programul, veți observa că vom avea o listă foarte lungă de cuvinte și frecvențele acestora.

Înainte de a trece mai departe, să analizăm puțin codul de mai sus. În următorul rând:

frecvențe = colecții.Counter ()

Încercăm să folosim Tejghea() pentru a obține frecvențele cuvântului din carte (de câte ori a apărut cuvântul în carte).

word_tokenize, pe de altă parte, împarte sentințele în părțile lor constitutive. Să luăm un exemplu simplu pentru a vedea cum word_tokenize funcționează efectiv:

de la nltk.tokenize import word_tokenize sentence = 'Numele meu este Abder. Îmi place Python. Este un tip de limbaj destul de frumos de programare (word_tokenize (sentence))

Rezultatul scriptului de mai sus este următorul:

['My', 'name', 'este', 'Abder', '.', 'I', 'like', 'Python', ' "destul de", "frumos", "programare", "limbă"]

Apoi buclele prin cuvinte și de a găsi frecvența de apariție a fiecărui cuvânt.
Ce este vorba de expresii (combinație de cuvinte)? Aceștia sunt chemați sintagmele (o succesiune de cuvinte care se întâlnesc împreună adesea). Un exemplu de colocare este bigrams, aceasta este o listă de perechi de cuvinte. În mod similar, este trigrame (o combinație de trei cuvinte) și așa mai departe (adică n-grame).

Să presupunem că vrem să extragem bigramele din cartea noastră. Putem face acest lucru după cum urmează:

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

Numarul 2 în apply_freq_filter () funcția ne spune să ignorăm toate bigramele care apar mai puțin de două ori în carte.

Dacă vrem să găsim 30 cele mai multe bigrame care apar în carte, putem folosi următoarea declarație de cod:

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

În cele din urmă, dacă dorim să găsim locația, care este cazul nostru în cazul în care cuvântul sau fraza apare în carte (nu numărul paginii), putem face următoarele:

print (read_book.index ('computer')) print (read_book.index ('Asistat de raportare'))

Exemplele de mai sus par să revină locația cuvântului într-o propoziție, similară cu ceea ce am văzut în exemplul nostru de scurtă teză de la începutul tutorialului.

Punându-le pe toți împreună

Să punem ceea ce am învățat într-un singur script Python. Următorul scenariu va citi cartea noastră și vom returna frecvențele cuvântului, împreună cu cele 30 de cele mai mari ferestre ale cărții, pe lângă locația unui cuvânt și a unei fraze în carte:

import nltk, colecții din nltk.collocations import * frequencies = collections.Counter () cu open ('bigd10.txt') ca carte: read_book = book.read () words = nltk.word_tokenize (read_book) [w] + = 1 bigram = nltk.collocations.BigramAssocMeasures () finder = BigramCollocationFinder.from_words (cuvinte) finder.apply_freq_filter (2) print ('Acestea sunt cuvintele și frecvența lor de apariție în carte: ) imprimare ('############################################## ################### 'print (' Acestea sunt cele 30 de mostre care apar în carte: ') print (finder.nbest (bigram.pmi, 30)) print (read_book.index ('computer')) print (read_book.index ('Asistat de raportare')) 

Concluzie

Așa cum am văzut în acest tutorial, chiar și un text scurt poate fi foarte descurajant atunci când vine vorba de construirea unui index pentru acel text. De asemenea, este posibil ca un mod automat de construire a indexului optim pentru carte să nu fie suficient de fezabil.

Am reușit să rezolvăm această problemă utilizând Python și biblioteca NLTK, unde am putea alege cele mai bune cuvinte și fraze pentru indexul cărții în funcție de frecvența lor de apariție (adică de importanță) în carte.

Există, desigur, mai multe lucruri pe care le puteți face cu NLTK, așa cum se arată în documentația bibliotecii. De asemenea, puteți să consultați cartea Natural Language Processing with Python dacă doriți să mergeți mai adânc în această bibliotecă.

Cod