problema Progetto Gutenberg Python?
Domanda
Sto cercando la lavorazione di vari testi di regex e NLTK di pitone -che è a http: // www .nltk.org / libro- . Sto cercando di creare un generatore di testo casuale e sto avendo un momento difficile con un problema. In primo luogo, qui è il mio algoritmo:
-
Inserisci una frase come -questo ingresso è chiamato stringa di innesco -
-
Get più lunga parola nella stringa di innesco
-
Cerca tutti i database di Project Gutenberg per le frasi che contengono questa parola -regardless di minuscole e maiuscole -
-
Ritorna la frase più lunga che ha la parola ho parlato al punto 3
-
Append la frase nella Fase 1 e Fase 4 insieme
-
Ripetere la procedura. Si noti che ho per ottenere la parola più lunga nella seconda frase, e continuare così e così via -
Finora sono stato in grado di fare questo per le prime due frasi, ma non è possibile eseguire una ricerca non insensibile. Intero database frase del Progetto Gutenberg è disponibile tramite la funzione gutenberg.sents()
ma regex - caso ricerca maiuscole è praticamente impossibile in quanto il gutenberg.sents()
emette le sentenze in libri come a seguito -in un elenco di formato elenco -:
Esempio: tutte le sentenze di Macbeth di Shakespeare è chiamato digitando
import nltk
from nltk.corpus import gutenberg
gutenberg.sents('shakespeare-macbeth.txt')
nella linea di comando shell pitone e uscita è:
[['[', 'The', 'Tragedie', 'of', 'Macbeth', 'by', 'William', 'Shakespeare', '1603', ']'],
['Actus', 'Primus', '.'], .......]
con [La Tragedie del Macbeth di William Shakespare, 1603] e Actus Primus. essendo le prime due frasi.
Come faccio a trovare la parola che sto cercando a prescindere che sia maiuscole / minuscole? Sono disperato bisogno di aiuto da quando sono stato armeggiare con questo negli ultimi due giorni e sta iniziando ad indossare sui nervi. Grazie mille.
Soluzione
Dato un elenco L
di parole, e una parola bersaglio t
,
any(t.lower()==w.lower() for w in L)
si dice se L ha parola t in un modo maiuscole e minuscole. E 'più veloce, ovviamente, per fare
lt = t.lower()
any(lt==w.lower() for w in L)
dal momento che Python non "sollevamento" la costante di calcolo fuori dal giro e, a meno che non sollevarlo da soli, sarà eseguita più volte.
Dato un elenco di liste lol
, la più lunga sotto-list tra cui t
può essere trovato
longest = max((L for L in lol if any(lt==w.lower() for w in L)), key=len)
Se più sotto-liste includono t
e sono della stessa lunghezza massima, questo vi darà il primo, come accade.
Altri suggerimenti
Come sull'utilizzo della funzione built-in: str.lower () ¶ Restituisce una copia della stringa convertita in minuscolo.
Poi basta confrontare le stringhe.