NLTK
NLTK
NLTK
Language
Processing
en
Python
Vanessa
Gmez
Verdejo
Manel
Mar5nez
Ramn
1/54
NLTK
(Natural
Language
Toolkit
)
Procesado
de
contenidos
In
2
weeks.
Aprendizaje
mquina
sobre
textos
youll
be
NLTK
geeks!
2/54
Referencias bsicas
nltk.org/book
3/54
Empezando
a
manejar
NLTK
Parte
1
4/54
Instalacin
y
arranque
Se
supone
que
el
usuario
Tene
instalado
el
Python,
con
las
libreras:
NLTK
NLTK-Data
NumPy,
Scipy
Pylab
import
numpy
import
pylab
import
nltk
from
__future__
import
division
5/54
6/54
Carga
de
corpora
from
nltk.book
import
*
text1:
Moby
Dick
by
Herman
Melville
1851
text2:
Sense
and
Sensibility
by
Jane
Austen
1811
text3:
The
Book
of
Genesis
text4:
Inaugural
Address
Corpus
text5:
Chat
Corpus
text6:
Monty
Python
and
the
Holy
Grail
text7:
Wall
Street
Journal
text8:
Personals
Corpus
text9:
The
Man
Who
Was
Thursday
by
G
.
K
.
Chesterton
1908
7/54
La
clase
text
Los
anteriores
textos
pertenecen
a
la
clase
text
de
la
librera
nltk,
e
incorporan
diferentes
funciones.
Algunas
funciones
Tles
para
anlisis
semnTco
text2.concordance(monstrous)
Devuelve
las
lneas
del
texto
text1
en
las
que
aparece
monstrous
text2.similar(monstrous)
Devuelve
palabras
usadas
de
forma
similar
en
el
texto.
text2.common_contexts([monstrous,very])
Encuentra
contextos
comparTdos
por
dos
o
ms
palabras
Los
_
del
resultado
denotan
dnde
van
las
palabras.
text2.tokens
Crea
una
lista
con
los
tokens
del
texto
8/54
len(text1)
set(text1)
sorted(set(text1))
Obtenemos
el
vocabulario
(por
orden
alfabTco)
de
un
texto
words=sorted(set(text1))
Calculamos
la
frecuencia
de
aparicin
de
una
palabra
def
percentage(count,total):
return
100*count/total
Trabajando
con
listas
recursivamente
[percentage(text.count(word),len(text1))
for
word
in
words]
[word
for
word
in
words
if
percentage(text1.count(word),len(text1))>4]
9/54
s.startswith(t)
test
if
s
starts
with
t
s.endswith(t)
test
if
s
ends
with
t
t
in
s
test
if
t
is
contained
inside
s
s.islower()
test
if
all
cased
characters
in
s
are
lowercase
s.isupper()
test
if
all
cased
characters
in
s
are
uppercase#
s.isalpha()
test
if
all
characters
in
s
are
alphabeTc
s.isalnum()
test
if
all
characters
in
s
are
alphanumeric
s.isdigit()
test
if
all
characters
in
s
are
digits
s.isTtle()
test
if
s
is
Ttlecased
(all
words
in
s
have
have
iniTal
capitals)
s.nd(t)
s.rnd(t)
s.index(t)
s.rindex(t)
s.join(text)
s.split(t)
s.splitlines()
s.lower()
s.upper()
s.Ttle()
s.strip()
s.replace(t,
u)
s.startswith(t)
s.endswith(t)
t
in
s
s.islower()
s.isupper()
s.isalpha()
s.isalnum()
s.isdigit()
s.isTtle()
11/54
Expresiones
tiles
EJERCICIO
1
Homogeneizar
el
vocabulario
de
un
texto
poniendo
todas
las
palabras
en
minsculas
EJERCICIO
2
Eliminar
los
signos
de
puntuacin
de
un
texto
12/54
La
funcin
FreqDist
fdist=FreqDist(text2)
fdist
es
una
funcin
que
genera
una
variable
de
la
clase
nltk.probability.freqdist.
Incorpora
diferentes
funciones
que
permiten
generar
el
vocabulario
del
texto
y
la
frecuencia
de
aparacin
de
cada
elemento
(en
orden
decreciente).
Incluye,
entre
otras,
las
siguientes
funciones:
fdist.samples()
Genera
una
lista
con
el
vocabulario
fdist.values()
Devuelve
el
n
de
veces
que
aparece
cada
palabra
fdist.N()
N
total
de
palabras
en
el
texto
fdist.freq(word)
Devuelve
la
frecuencia
de
aparacin
de
word
fdist.inc(palabra)
Incrementa
la
cuenta
para
una
palabra
fdist.max()
Palabra
con
mxima
frecuencia
fdist.tabulate()
Tabula
la
distribucin
de
frecuencia
fdist.plot()
Representacin
grca
13/54
Corpora
de
inters
Cmo
importar
un
corpus
Vemos
sus
textos
nltk.corpus.gutenberg.leids()
['austen-emma.txt',
'austen-persuasion.txt',
...
Seleccionamos
uno
de
ellos
emma
=
nltk.corpus.gutenberg.words('austen-emma.txt')
O,
directamente
from
nltk.corpus
import
gutenberg
emma
=
gutenberg.words('austen-emma.txt')
15/54
leids()
leids([categories])
categories()
categories([leids])
raw()
raw(leids=[f1,f2,f3])
raw(categories=[c1,c2])
words()
words(leids=[f1,f2,f3])
words(categories=[c1,c2])
sents()
sents(leids=[f1,f2,f3])
sents(categories=[c1,c2])
abspath(leid)
encoding(leid)
open(leid)
root()
readme()
16/54
Corpora etiquetados
EJEMPLO:
from
nltk.corpus
import
brown
brown.categories()
[[leid,
brown.categories(leid)]
for
leid
in
brown.leids()]
17/54
Adquisicin
de
documentos
Parte
2
18/54
Objetivos
Adquisicin
de
documentos
Procesado
de
contenidos
Aprendizaje
mquina
sobre
textos
19/54
20/54
22/54
Importacin
de
blogs
Se
puede
importar
RSS
import
feedparser
llog
=
feedparser.parse("h{p://languagelog.ldc.upenn.edu/nll/?
feed=atom")
Ttulo
post
=
llog.entries[2]
post.Ttle
u'NPR:
oyez.org
nishes
Supreme
Court
oral
arguments
project
Contenido
content
=
post.content[0].value
23/54
Procesado
de
contenido
Parte
3
26/54
Objetivos
Adquisicin
de
documentos
Procesado
de
contenidos
Aprendizaje
mquina
sobre
textos
Tokenizacin
Extraccin
de
races:
lemaTzacin
Eliminacin
de
stopwords
Correccin
de
texto
Spell-checker
Expresiones
regulares
Caracteres
repeTdos
Sinnimos
27/54
Tokenizacin
Paso
de
texto
a
frases
UTliza
una
instancia
de
PunktSentenceTokenizer,
que
funciona
para
una
gran
variedad
de
idiomas.
Si
se
deben
formatear
muchas
frases
en
ingls,
es
ms
eciente
cargar
el
mdulo
correspondiente
import
nltk.data
tokenizer=nltk.data.load(tokenizers/punkt/english.pickle)
tokenizer.tokenize(frase)
28/54
Tokenizacin
Otros
idiomas.
Para
formatear
texto
en
frases
en
otros
idiomas
cargando
previamente
la
librera,
hay
que
especicarlo:
tokenizer=nltk.data.load(tokenizers/punkt/spanish.pickle)
29/54
Tokenizacin
Denicin
de
criterios
de
separacin
usando
RegexpTokenizer
from
nltk.tokenize
import
regexp_tokenize
regexp_tokenize(Cant
is
a
contracTon.,[\w]+)
[Cant,
is,
a,
contracTon]
.
^abc
abc$
[abc]
[A-Z0-9]
ed|ing|s
*
+
?
{n}
{n,}
{,n}
{m,n}
a(b|c)+
Wildcard
Encuentra
un
patrn
abc
al
inicio
de
una
cadena
Encuentra
abc
al
nal
de
una
cadena
Encuentra
uno
de
un
conjunto
de
caracteres
Encuentra
uno
de
un
rango
de
caracteres
Encuentra
una
de
las
cadenas
especicadas
(disjuncTon)
Cero
o
ms
de
los
tems
previos.
Ej.:
a*,
[a-z]*
(Kleene
Closure)
Uno
o
ms
de
los
tems
previos,
Ej.:
a+,
[a-z]+
Opcional,
ej.:
a?,
[a-z]?
Exactamente
n
repeTciones
Al
menos
n
repeTciones
No
ms
de
n
repeTciones
Al
menos
m
y
no
ms
de
m
Parntesis
que
indica
el
objeto
de
las
operaciones
31/54
Smbolo
\b
\d
\D
\s
\S
\w
\W
\t
\n
\r
\f
\v
Funcin
Word
boundary
(zero
width)
Cualquier
decimal
(equivalente
a
[0-9])
Cualquier
no
decimal
(equivalente
a
[^0-9])
Cualquier
espacio
(equivalente
a
[
\t\n\r\f\v]
Cualquier
no
espacio
(equivalente
a
[^
\t\n\r\f\v])
Cualquier
alfanumrico
(equivalente
a
[a-zA-Z0-9_])
Cualquier
no
alfanumrico
(equivalente
a
[^a-zA-Z0-9_])
Tabulador
Nueva
lnea
Retorno
de
carro
Form
feed
(pgina
nueva)
Tabulador
verTcal
32/54
35/54
re.split(r'
',
raw)
#Dividimos
cuando
hay
espacios
re.split(r'[
\t\n]+',
raw)
#Dividimos
cuando
hay
espacios,
#tabulaciones
o
retornos
de
carro
re.split(r'\W+',
raw)
#Dividimos
cuando
aparece
cualquier
#carcter
que
NO
es
alfanumrico
36/54
37/54
38/54
raw
=
DENNIS:
Listen,
strange
women
lying
in
ponds
distribuTng
swords
...
is
no
basis
for
a
system
of
government.
Supreme
execuTve
power
derives
from
...
a
mandate
from
the
masses,
not
from
some
farcical
aquaTc
ceremony.
tokens
=
nltk.word_tokenize(raw)
porter
=
nltk.PorterStemmer()
[porter.stem(t)
for
t
in
tokens]
['DENNI',
':',
'Listen',
',',
'strang',
'women',
'lie',
'in',
'pond',
....
lancaster
=
nltk.LancasterStemmer()
[lancaster.stem(t)
for
t
in
tokens]
['den',
':',
'list',
',',
'strange',
'wom',
'lying',
'in',
'pond',
'distribut',
...
39/54
Lematizacin
Un
lemaTzador
extrae
la
autnTca
raz
de
una
palabra
a
parTr
de
un
diccionario.
NLTK
uTliza
WordNet,
una
base
de
datos
lxica
en
ingls,
a
travs
de
un
interfaz.
Tiene
una
versin
en
castellano
(h{p://grial.uab.es/sensem/
download/).
from
nltk.stem
import
WordNetLemmaTzer
lemmaTzer
=
WordNetLemmaTzer()
[lemmaTzer.lemmaTze(t)
for
t
in
tokens]
El
resultado
ya
no
conTene
las
palabras
con
los
sujos
extrados
sino
que
conTene
la
raz
o
lema
de
las
palabras.
Con
Lancaster:
'execut',
'power',
'deriv
Con lemaTzador:
41/54
Lematizacin
El
lemaTzador
busca
un
lema
para
la
palabra,
y
la
devuelve
tal
cual
si
no
lo
halla.
lemmaTzer.lemmaTze('ndings')
nding
42/54
Lemmatizacin
EJERCICIO
Construir
una
funcin
que
a
parTr
de
un
texto
de
entrada
(ya
separado
en
tokens
)
lemaTce
su
contenido
de
manera
secuencial
(primero
considera
que
es
nombre,
a
conTnuacin
considera
que
es
verbo,
adjeTvo
y/o
adverbio)
43/54
44/54
Correccin
de
texto
Se
puede
uTlizar
el
diccionario
Wordlist
para
buscar
aquellas
palabras
del
texto
que
no
estn
en
el
diccionario.
def
unusual_words(text):
text_vocab
=
set(w.lower()
for
w
in
text
if
w.isalpha())
english_vocab
=
set(w.lower()
for
w
in
nltk.corpus.words.words())
unusual
=
text_vocab.dierence(english_vocab)
return
sorted(unusual)
45/54
Correccin
de
texto
La
funcin
se
puede
probar
de
la
siguiente
manera:
#
Nmero
de
palabras
no
usuales
print
len(nltk.corpus.gutenberg.words('austen-sense.txt'))
print
len(unusual_words(nltk.corpus.gutenberg.words('austen-sense.txt')))
#
Nmero
de
palabras
no
usuales
tras
lemaTzacin
texto=nltk.corpus.gutenberg.words('austen-sense.txt')
wnl
=
nltk.WordNetLemmaTzer()
clean_text=[wnl.lemmaTze(t)
for
t
in
texto]
print
len(unusual_words(clean_text))
clean_text=improved_lemmaTzer(texto)
print
unusual_words(clean_text)[:10]
print
len(unusual_words(clean_text))
46/54
Correccin
de
texto
EJERCICIO:
Modicar
la
funcin
anterior
para
que
elimine
las
palabras
inusuales
de
un
texto
tokenizado
47/54
class
RegexpReplacer(object):
def
__init__(self,
pa{erns=replacement_pa{erns):
def
replace(self,
text):
s
=
text
for
(pa{ern,
repl)
in
self.pa{erns:
(s,
count)
=
re.subn(pa{ern,
repl,
s)
return
s
48/54
49/54
51/54
Eliminando
sinnimos
WordNet
incorpora
una
base
de
datos
lxica
Para
cada
trmino
proporciona
una
familia
semnTca
de
trminos
from
nltk.corpus
import
wordnet
as
wn
synset_clases=wn.synsets('pre{y')
print
synset_clases
[Synset('pre{y.s.01'),
Synset('pre{y.s.02'),
Synset('reasonably.r.01')]
synset_clases[2].lemma_names
['reasonably',
'moderately',
'pre{y',
'jolly',
'somewhat',
'fairly',
'middling',
'passably']
52/54
Eliminando
sinnimos
EJERCICIO:
Construir
una
funcin
que
susTtuya
cada
palabra
de
un
texto
tokenizado
por
el
primer
trmino
de
su
primera
familia
semnTca
53/54
Eliminando
sinnimos
Podemos
probar
esta
funcin
con:
text=nltk.corpus.gutenberg.words('austen-sense.txt')
print
len(set(text))
clean_text1=improved_lemmaTzer(text)
print
len(set(clean_text1))
6833
clean_text2=[synonim_converter(w)
for
w
in
clean_text1]
print
len(set(clean_text2))
5035
54/54
Un
vocabulario
avanzado
Creemos
una
librera
(lib_curso.py)
con
todas
las
funciones:
improved_lemmaTzer
remove_stopwords
elimina_unusual_words
synonim_converter?
ClasiJicacin
de
textos
Parte
4.
prximamente
en
Matlab
56/54