Probabilmente vi siete imbattuti in alcuni di quei grandi libri di testo e avete notato l'indice alla fine. Con una copia cartacea, è bello avere un indice simile per navigare velocemente nella pagina desiderata. Di recente ho pubblicato un libro molto breve, e quando si è trattato di impostare l'indice, il compito sembrava scoraggiante anche se il libro è molto breve. Il libro non ha ancora un indice comunque.
Se hai seguito i miei articoli, noterai che principalmente scrivo su Python e su come può aiutarci a risolvere diversi problemi in modo semplice. Quindi vediamo come possiamo impostare un indice di libri usando Python.
Senza ulteriori indugi, iniziamo.
sonosono sicuro che molti di voi sanno che cos'è un indice di libri, ma voglio solo chiarire rapidamente questo concetto.
UN indice del libro è semplicemente una raccolta di parole e / o frasi che sono considerate importanti per il libro, insieme con le loro posizioni nel libro. L'indice non contiene ogni parola / frase nel libro. Il motivo per questo è mostrato nella prossima sezione.
E se avessi un indice attraverso il quale puoi trovare la posizione di ogni parola o frase nel libro? Non sarebbe considerato l'indice di scelta? Sbagliato!
L'indice di scelta, o quello che sarebbe considerato un buon indice, è quello che indica le parole e le frasi importanti nel libro. Potresti metterti in dubbio sulla ragione di ciò. Facciamo un esempio. Di 'che abbiamo un libro che consiste solo della seguente frase:
Il mio libro è breve
Cosa succederebbe se provassimo ad indicizzare ogni parola e frase in quella brevissima frase, assumendo che la posizione fosse la parola numero nella frase? Questo è l'indice che avremmo in questo caso:
il mio libro è breve: 1 il mio libro è: 1 il mio libro: 1 mio: 1 breve: 4 è breve: 3 è: 3 libro è breve: 2 libro è: 2 libro: 2
Dall'esempio sopra, possiamo vedere che tale indice sarebbe più grande del libro stesso! Quindi un buon indice sarebbe quello che contiene le parole e le frasi considerate importanti per il lettore.
In questo tutorial, utilizzeremo la libreria Natural Language Toolkit (NLTK), che viene utilizzata per lavorare con i dati del linguaggio umano. Come accennato nella documentazione, NLTK è stato definito "un meraviglioso strumento per insegnare e lavorare in linguistica computazionale usando Python" e "un'incredibile libreria per giocare con il linguaggio naturale".
Sto attualmente scrivendo questo tutorial dalla mia macchina Ubuntu, e i passaggi per l'installazione di NLTK in questa sezione saranno rilevanti per il sistema operativo di Ubuntu. Ma non preoccuparti, puoi trovare i passaggi per installare NLTK su altri sistemi operativi sul sito Web NLTK.
Per installare NLTK, userò pip. Se non hai già installato pip, puoi installare il seguente comando nel tuo terminale seme
:
sudo easy_install3 pip
Per assicurarti di aver installato pip, digita il seguente comando:
pip --version
Dovresti ottenere qualcosa di simile al seguente:
pip 8.1.2 da /usr/local/lib/python3.5/dist-packages/pip-8.1.2-py3.5.egg (python 3.5)
Ora, per installare NLTK, è sufficiente eseguire il seguente comando nel terminale:
sudo pip install -U nltk
Puoi testare l'installazione di nltk digitando pitone
, e quindi importando nltk nel tuo terminale. Se ottieni ImportError: nessun modulo chiamato nltk
, questa discussione potrebbe aiutarti.
A questo punto, abbiamo bisogno di un file di test (libro) da utilizzare per creare un indice di libri. Prenderò questo libro: Il tasso di variazione del tasso di variazione dal FEP. Puoi scaricare il file di testo del libro da Dropbox. Ovviamente puoi usare qualsiasi libro di tua scelta; hai solo bisogno di qualcosa con cui sperimentare in questo tutorial.
Iniziamo con la parte interessante di questo tutorial, il programma che ci aiuterà a formare l'indice del libro. La prima cosa che vogliamo fare è trovare la parola frequenza nel libro. Ho mostrato come possiamo farlo in un altro tutorial, ma voglio mostrarvi come possiamo farlo usando la libreria NLTK.
Questo può essere fatto come segue:
import nltk, collezioni da nltk.collocations import * frequencies = collections.Counter () con open ('bigd10.txt') come libro: read_book = book.read () words = nltk.word_tokenize (read_book) per w in words: frequenze [w] + = 1 stampa (frequenze)
Quando eseguirai il programma, noterai che avremo una lunga lista di parole e le loro frequenze.
Prima di spostarci ulteriormente, analizziamo un po 'il codice precedente. Nella riga seguente:
frequenze = collections.Counter ()
Stiamo cercando di usare il Contatore ()
funzione per ottenere le frequenze della parola nel libro (quante volte la parola si è verificata nel libro).
word_tokenize
, d'altra parte, divide le frasi nelle loro parti costituenti. Facciamo un semplice esempio per vedere come word_tokenize
funziona davvero:
da nltk.tokenize import word_tokenize sentence = 'Il mio nome è Abder. Mi piace Python. E 'un bel linguaggio di programmazione' print (word_tokenize (frase))
L'output dello script precedente è il seguente:
['My', 'name', 'is', 'Abder', '.', 'I', 'like', 'Python', '.', 'It', "'s",' a ', 'carino', 'bello', 'programmazione', 'lingua']
Quindi passiamo in rassegna le parole e troviamo la frequenza di occorrenza di ogni parola.
Che dire delle frasi (combinazione di parole)? Quelli sono chiamati collocazioni (una sequenza di parole che si verificano insieme spesso). È un esempio di collocazioni bigrammi, questa è una lista di coppie di parole. Simile a quello è trigrammi (una combinazione di tre parole), e così via (cioè n-grammi).
Diciamo che vogliamo estrarre i bigram dal nostro libro. Possiamo farlo come segue:
bigram = nltk.collocations.BigramAssocMeasures () finder = BigramCollocationFinder.from_words (words) finder.apply_freq_filter (2)
Il numero 2
nel apply_freq_filter ()
la funzione ci sta dicendo di ignorare tutti i bigram che si verificano meno di due volte nel libro.
Se vogliamo trovare il 30
i bigram più presenti nel libro, possiamo usare la seguente dichiarazione di codice:
print (finder.nbest (bigram.pmi, 30))
Infine, se vorremmo trovare la posizione, che è nel nostro caso in cui la parola o la frase si verifica nel libro (non il numero di pagina), possiamo fare quanto segue:
print (read_book.index ('computer')) print (read_book.index ('Assisted Reporting')))
Le affermazioni sopra riportate sembrano restituire la parola posizione in una frase, simile a ciò che abbiamo visto nel nostro breve esempio di frase all'inizio del tutorial.
Mettiamo ciò che abbiamo imparato in un singolo script Python. Il seguente script leggerà il nostro libro e restituirà le frequenze delle parole, insieme ai 30 bigram più presenti nel libro, oltre alla posizione di una parola e di una frase nel libro:
import nltk, collezioni da nltk.collocations import * frequencies = collections.Counter () con open ('bigd10.txt') come libro: read_book = book.read () words = nltk.word_tokenize (read_book) per w in words: frequenze [w] + = 1 bigram = nltk.collocations.BigramAssocMeasures () finder = BigramCollocationFinder.from_words (words) finder.apply_freq_filter (2) print ('Quelle sono le parole e la loro frequenza di occorrenza nel libro:') print (frequenze ) print ('######################################################## ################### ') print (' Questi sono i 30 più bigram presenti nel libro: ') print (finder.nbest (bigram.pmi, 30)) print (read_book.index ('computer')) print (read_book.index ('Assisted Reporting')))
Come abbiamo visto in questo tutorial, anche un breve testo può essere molto scoraggiante quando si tratta di costruire un indice per quel testo. Inoltre, un modo automatico per costruire l'indice ottimale per il libro potrebbe non essere abbastanza fattibile.
Siamo stati in grado di risolvere questo problema utilizzando Python e la libreria NLTK, dove potevamo scegliere le parole e le frasi migliori per l'indice del libro in base alla frequenza di occorrenza (vale a dire l'importanza) nel libro.
C'è, naturalmente, più che puoi fare con NLTK, come mostrato nella documentazione della biblioteca. Puoi anche fare riferimento al libro Natural Language Processing with Python se vuoi approfondire questa libreria.