Procesamiento Del Lenguaje y Python
Procesamiento Del Lenguaje y Python
POLITÉCNICA SALESIANA
Agosto de 2018
Jorge Soria
EDITORIAL
UNIVERSITAT POLITÈCNICA DE VALÈNCIA
Resumen
Este capítulo está dividido en secciones que saltan entre dos estilos bastante
diferentes. En las secciones de informática con lenguaje realizaremos algunas
tareas de programación motivadas linguística-mente sin explicar necesariamen-
te cómo funcionan. En las secciones de mirar más de cerca a Python, revisa-
remos sistemáticamente los conceptos clave de programación. Marcaremos los
dos estilos en los títulos de la sección, pero los capítulos posteriores mezclarán
ambos estilos sin ser tan directos al respecto. Esperamos que este estilo de
presentación le brinde un sabor auténtico de lo que vendrá después, mientras
cubre una variedad de conceptos elementales en lingà 14 ística e informática.
iii
Si tiene familiaridad básica con ambas áreas, puede saltar a 5; repetiremos
cualquier punto importante en capítulos posteriores, y si pierde algo, puede
consultar fácilmente el material de referencia en línea en la web:
https://www.nltk.org/book/ch01.html
Jorge Soria
[email protected]
iv
ï¿ 12 ndice general
Resumen iii
ï¿ 12 ndice general v
v
ï¿ 12 ndice general
4 Volver a Python:
tomar decisiones y tomar el control 35
4.1 Condicionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
4.2 Operando en cada elemento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.3 Bloques de código anidados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.4 Bucle con condiciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
6 Resumen 53
7 Lectura adicional 55
8 Ejercicios 57
vi
Capítulo 1
Una de las cosas más amigables de Python es que te permite escribir directa-
mente en el intérprete interactivo , el programa que ejecutará tus programas de
Python. Puede acceder al intérprete de Python utilizando una interfaz gráfica
simple llamada Interactive DeveLopment Environment (IDLE). En una Mac,
puede encontrar esto en Aplicaciones = MacPython, y en Windows en Todos
los programas = Python. En Unix, puede ejecutar Python desde el shell al
escribir inactivo (si no está instalado, intente escribir Python ). El intérprete
imprimirá una propaganda sobre su versión de Python; simplemente comprue-
be que está ejecutando Python 3.2 o posterior (aquí está para 3.4.2):
1
Capítulo 1. Computación con lenguaje: textos y palabras
Nota
Si no puede ejecutar el intérprete de Python, probablemente no tenga
instalado Python correctamente. Visite http://python.org/ para obtener
instrucciones detalladas. NLTK 3.0 funciona para Python 2.6 y 2.7. Si
está utilizando una de estas versiones anteriores, tenga en cuenta que el
operador / redondea los resultados fraccionarios hacia abajo (por lo que
1/3 le dará 0 ). Para obtener el comportamiento esperado de la división,
debe escribir: desde la división de importación –future–
1 + 5 ∗ 2 − 3
8
Nota
Tu turno: ingresa algunas expresiones máás tuyas. Puede usar el as-
terisco ( * ) para la multiplicación y la barra inclinada ( / ) para la
división, y los paréntesis para las expresiones de horquillado.
2
1.2 Comenzando con NLTK
1 +
Archivo” < stdin > ”, lnea1
1+
SintaxisError:sintaxisnovlida
Antes de continuar, debe instalar NLTK 3.0, que se puede descargar de manera
gratuita desde http://nltk.org/ . Siga las instrucciones allí para descargar la
versión requerida para su plataforma.
Una vez que haya instalado NLTK, inicie el intérprete de Python como antes e
instale los datos necesarios para el libro escribiendo los dos comandos siguien-
tes en el indicador de Python, luego seleccione la colección de libros como se
muestra en secciï¿ 12 n 1.1.
importnltk
nltk.download()
Una vez que los datos se descargan en su máquina, puede cargar algunos usando
el intérprete de Python. El primer paso es escribir un comando especial en el
indicador de Python que le dice al intérprete que cargue algunos textos para
que podamos explorar: desde nltk.book import * . Esto dice "del módulo de
libros de NLTK , cargue todos los artículos". El módulo del libro contiene
todos los datos que necesitará mientras lee este capítulo. Después de imprimir
un mensaje de bienvenida, carga el texto de varios libros (esto llevará unos
segundos). Aquí está el comando nuevamente, junto con la salida que verá.
Tenga cuidado de obtener la ortografía y la puntuación correctas, y recuerde
que no escribe .
3
Capítulo 1. Computación con lenguaje: textos y palabras
Figura 1.1: Descarga de la colección de libros NLTK: explore los paquetes disponibles usan-
do nltk.download () . La pestania Colecciones en el descargador muestra cómo se agrupan
los paquetes en conjuntos, y debe seleccionar la línea etiquetada como libro para obtener
todos los datos necesarios para los ejemplos y ejercicios de este libro. Consiste en aproxi-
madamente 30 archivos comprimidos que requieren aproximadamente 100Mb de espacio en
disco. La colección completa de datos (es decir, todo en el programa de descarga) es casi diez
veces más grande (en el momento de redactar este documento) y continúa expandiéndose.
f romnltk.bookimport ∗
∗ ∗ ∗ Ejemplosdeintroducci3 nparaellibroN LT K ∗ ∗ ∗
Cargandotexto1, ..., texto9yenviado1, ..., enviado9
Escribaelnombredeltextoof raseparaverlo.
Escriba :0 texts()0 o0 sents()0 paraenumerarlosmateriales.
texto1 : M obyDickdeHermanM elville1851
texto2 : SentidoysensibilidaddeJaneAusten1811
text3 : EllibrodelGnesis
texto4 : DiscursoinauguralCorpus
text5 : ChatCorpus
text6 : Loscaballerosdelamesacuadrada
text7 : W allStreetJournal
text8 : ContactosCorpus
text9 : Elhombrequef uejuevesporG.K.Chesterton1908
Siempre que deseamos conocer estos textos, solo debemos ingresar sus nombres
en el indicador de Python:
4
1.3 Búsqueda de texto
text1
< T exto : M obyDickporHermanM elville1851 >
text2
< T ext : sentidoysensibilidadporJaneAusten1811 >
Ahora que podemos usar el intérprete de Python y tener algunos datos para
trabajar, estamos listos para comenzar.
5
Capítulo 1. Computación con lenguaje: textos y palabras
text1.concordance(”monstrous”)
M ostrando11de11coincidencias :
onglaprimera, unaeradeuntama ± oms
monstruoso....Estovinohacianosotros,
ON OF T HEP SALM S.”T ocandoesemonstruosobultode
laballenauorco, hemos
terminadoconunapandillapaganademonstruosos
garrotesylanzas.Algunosestabangruesos
mientrasmirabas, ytepreguntabasqu
monstruoso
canbalysalvajepodrahaber
sobrevividoalainundacin; monstruosoyms
monta ± oso!P araHimmal
podranexploraraM obyDickcomounaf bula
monstruosa, opeoranymsde
Radney”.CAP T U LO55Delasmonstruosas
ImgenesdelasBallenas.Estarerel
ingEscenas.Enrelacinconlasimgenes
monstruosasdelasballenas, estoymuy
dispuestoaentrarenaquellashistoriasan
msmonstruosasdelasquese
handescubiertoquehansidosacadasdeeste
monstruosogabinete.P ero
deW hale − Bones; porquelasballenasdeuntamanio
monstruososonamenudoarrojadasmuertas
6
1.3 Búsqueda de texto
Nota
Su turno: intente buscar otras palabras; para guardar el reescrito, es
posible que pueda utilizar la flecha hacia arriba, la flecha hacia arriba o
Alt-p para acceder al comando anterior y modificar la palabra que se bus-
ca. También puede intentar buscar en algunos de los otros textos que he-
mos incluido. Por ejemplo, busque Sense and Sensibility para la palabra
afecto , usando text2.concordance ( .afecto") . Busque el libro de Génesis
para saber cuánto vivieron algunas personas, usando text3.concordance
( "vivido") . Puedes ver el texto 4 , el Corpus Inaugural Address Corp
, para ver ejemplos de inglés que data de 1789, y buscar palabras como
nation ,terror , dios para ver cómo estas palabras se han usado de manera
diferente a lo largo del tiempo. También hemos incluido text5 , el NPS
Chat Corpus : busque palabras poco convencionales como im , ur , lol .
(Tenga en cuenta que este corpus no tiene censura!)
Una vez que haya dedicado un poco de tiempo a examinar estos textos, espe-
ramos que tenga un nuevo sentido de la riqueza y la diversidad del lenguaje.
En el siguiente capítulo, aprenderá cómo acceder a un rango más amplio de
texto, incluido el texto en otros idiomas además del inglés.
Una concordancia nos permite ver palabras en contexto. Por ejemplo, vimos
que lo monstruoso ocurría en contextos como las – imágenes y un – tamano .
Qué otras palabras aparecen en un rango similar de contextos ?
Podemos averiguar agregando el término similar al nombre del texto en cues-
tión, luego insertando la palabra relevante entre paréntesis:
text1.similar(”monstrous”)
meanpartemaddensdolef ulgamesomesutilmentepoco
comedidocuidadosoadverso
exasperatelovingpassingmohosocristianopocostruemistif ying
imperialmodif icadespreciable
text2.similar(”monstrous”)
muycordialmentetanextraordinariamentetan
grandecomoungranincreblemente
extremadamentebuenodulce
7
Capítulo 1. Computación con lenguaje: textos y palabras
Nota
Su turno: elija otro par de palabras y compare su uso en dos textos
diferentes, usando las funciones similar () y common-contexts () .
Nota
Importante: debe tener instalados los paquetes NumPy y Matplotlib
de Python para generar los gráficos utilizados en este libro. Por favor,
consulte http://nltk.org/ para obtener instrucciones de instalación.
8
1.3 Búsqueda de texto
Figura 1.2: Gráfico de dispersión léxica para palabras en las direcciones iniciales presiden-
ciales de EE. UU .: Esto se puede utilizar para investigar los cambios en el uso del lenguaje
a lo largo del tiempo.
Nota
También puede trazar la frecuencia del uso de las palabras a través del
tiempo utilizando https://books.google.com/ngrams
Ahora, solo por diversión, intentemos generar texto aleatorio en los diversos
estilos que acabamos de ver. Para hacer esto, escribimos el nombre del texto
seguido del término generar . (Necesitamos incluir los paréntesis, pero no hay
nada que los interrumpa).
9
Capítulo 1. Computación con lenguaje: textos y palabras
text3.generate()
Enelcomienzodesuhermanoesunhombrepeludo, cuyacimapuedellegar
alcielo; ysembrarslatierradeEgipto, nohubopanen
todoloquef uesacadodelmes, sobrelatierra.Entonces, sertu
salario?Ehicieronasupadre; eIsaaceraviejo, y
lo
bes, yLabnconsuganadoenmediodelasmanosdeEsatuprimognito, yF icol, elprincipal
mayordomodesuhijoIsaac, ella
Nota
El método generate () no está disponible en NLTK 3.0, pero se restable-
cerá en una versión posterior.
El hecho más obvio sobre textos que surge de los ejemplos anteriores es que
difieren en el vocabulario que usan. En esta sección veremos cómo usar la
computadora para contar las palabras en un texto en una variedad de formas
útiles. Como antes, saltará directamente y experimentará con el intérprete de
Python, aunque es posible que todavía no haya estudiado Python sistemática-
mente. Ponga a prueba su comprensión modificando los ejemplos y probando
los ejercicios al final del capítulo.
Comencemos por conocer la longitud de un texto de principio a fin, en términos
de las palabras y los símbolos de puntuación que aparecen. Usamos el término
len para obtener la longitud de algo, que aplicaremos aquí al libro de Génesis:
len(text3)
44764
10
1.4 Contando Vocabulario
dos ocurrencias de a , dos de estar , y uno cada uno de o y no. Pero solo hay
cuatro elementos distintos de vocabulario en esta frase. ¿Cuántas palabras
distintas contiene el libro de Génesis? Para resolver esto en Python, tenemos
que plantear la pregunta de forma ligeramente diferente. El vocabulario de un
texto es solo el conjunto de tokens que utiliza, ya que en un conjunto, todos los
duplicados se contraen juntos. En Python podemos obtener los elementos de
vocabulario de text3 con el comando: set (text3) . Cuando hagas esto, pasarán
muchas pantallas de palabras. Ahora prueba lo siguiente:
ordenado(conjunto(texto3))[1]
[0 !0 , ”0 ”,0 (0 ,0 )0 ,0 ,0 ,0 , )0 ,0 .0 ,0 .)0 ,0 :0 ,0 ;0 ,0 ; )0 ,0 ?0 ,0 ?)0 , 0 A0 ,0 Abel0 ,0 Abelmizraim0 ,0 Abidah0 ,0 A
len(set(text3))[2]
2789
len(set(text3))/len(text3)
0,06230453042623537
11
Capítulo 1. Computación con lenguaje: textos y palabras
text3.count(”smote”)
5
100 ∗ text4.count(0 a0 )/len(text4)
1,4643016433938312
Nota
Tu turno: Cuántas veces aparece la palabra jaja en el texto5 ? Cuánto
es esto como un porcentaje de la cantidad total de palabras en este texto
?
Es posible que desee repetir dichos cálculos en varios textos, pero es tedio-
so seguir volviendo a escribir la fórmula. En su lugar, puede crear su propio
nombre para una tarea, como "lexical-diversity.o "percentage", y asociarlo con
un bloque de código. Ahora solo tiene que escribir un nombre corto en lugar
de una o más líneas completas de código Python, y puede volver a utilizarlo
tantas veces como desee. El bloque de código que nos hace una tarea se llama
función , y definimos un nombre corto para nuestra función con la palabra
clave def . El siguiente ejemplo muestra cómo definir dos nuevas funciones,
lexical-diversity () y percentage () :
Precaución!
El intérprete de Python cambia la solicitud de
adespusdeencontrarlosdospuntosalf inaldelaprimeralnea.ElindicaqueP ythonesperaquea
12
1.4 Contando Vocabulario
13
Capítulo 1. Computación con lenguaje: textos y palabras
14
Capítulo 2
2.1 Listas
15
Capítulo 2. Una mirada más de cerca a Python:
textos como listas de palabras
Después del mensaje que hemos dado, inventamos send1 , seguido del signo
igual y luego algunas palabras entre comillas, separadas por comas y rodeadas
de corchetes. Este material entre corchetes se conoce como una lista en Python:
es la forma en que almacenamos un texto. Podemos inspeccionarlo escribiendo
el nombre[1] . Podemos preguntar su longitud [2]. Incluso podemos aplicar
nuestra propia lexical-diversity () la función a ella [3].
sent1[1]
Llamar’, ’mÃ’, ’Ishmael’, ’.’
len(sent1)[2]
4
lexicald iversity(sent1)[3]
1,0
Se han definido algunas listas más para usted, una para la frase inicial de cada
uno de nuestros textos, sent2 ... sent9 . Inspeccionamos dos de ellos aquí; puede
ver el resto usted mismo usando el intérprete de Python (si obtiene un error que
dice que sent2 no está definido, primero debe escribir desde nltk.book import
∗ ).
sent2
The’, ’family’, ’of’, ’Dashwood’, ’had’, ’long’,
’been’, ’settle’, ’in’, ’Sussex’, ’.’
sent3
’, ’the’, ’beginning’, ’God’, ’created’, ’the’,
’heaven’, ’y’, ’the’, ’earth’, ’.’
16
2.1 Listas
Nota
Su Turno: Haga algunas oraciones propias, escribiendo un nombre, signo
igual y una lista de palabras, como esta: ex1 = [ ’Monty’ , ’Python’ , ’y’
, ’el’ , ’Santo ’ , ’ Grail ’ ] . Repite algunas de las otras operaciones de
Python que vimos anteriormente en 1 , por ejemplo, ordenadas (ex1) ,
len (set (ex1)) , ex1.count ( ’the’ ) .
Nota
Este uso especial de la operación de adición se denomina concatenación ;
combina las listas en una sola lista. Podemos concatenar oraciones para
construir un texto.
No tenemos que escribir literalmente las listas tampoco; podemos usar nombres
cortos que hacen referencia a listas predefinidas.
Qué sucede si queremos agregar un solo elemento a una lista? Esto se conoce
como agregar . Cuando agregamos () a una lista, la lista se actualiza como
resultado de la operación.
17
Capítulo 2. Una mirada más de cerca a Python:
textos como listas de palabras
sent1.append(”Some”)
sent1
Call’, ’me’, ’Ishmael’, ’.’, ’Some’
text4[173]
0
despertar0
Los índices son una forma común de acceder a las palabras de un texto o, más
en general, a los elementos de cualquier lista. Python también nos permite
acceder a sublistas, extrayendo fragmentos de lenguaje manejables a partir de
textos grandes, una técnica conocida como cortar .
18
2.2 Listas de indexación
Los índices tienen algunas sutilezas, y las exploraremos con la ayuda de una
oración artificial:
Observe que nuestros índices comienzan desde cero: el elemento enviado cero,
escrito enviado [0] , es la primera palabra, ’palabra1’ , mientras que el elemento
enviado 9 es ’palabra10’ . La razón es simple: en el momento en que Python
accede al contenido de una lista desde la memoria de la computadora, ya está
en el primer elemento; tenemos que decirle cuántos elementos avanzará. Por lo
tanto, cero pasos hacia delante lo deja en el primer elemento.
Nota
Esta práctica de contar desde cero es inicialmente confusa, pero típica
de los lenguajes de programación modernos. Lo dominará rápidamente si
domina el sistema de contar siglos en los que 19XY es un ano en el siglo
XX, o si vive en un país donde los pisos de un edificio están numerados
de 1, y así caminar hasta n-1 tramos de escaleras lo llevan al nivel n .
enviado[10]
T raceback(o ltimallamadamsreciente) :
Archivo” < stdin > ”, lnea1, en?
IndexError : listaelndicef ueraderango
19
Capítulo 2. Una mirada más de cerca a Python:
textos como listas de palabras
mensaje de seguimiento que muestra el contexto del error, seguido del nombre
del error, error de índice y una breve explicación.
Echemos un vistazo más de cerca a cortar, usando nuestra oración artificial
nuevamente. Aquí verificamos que la porción 5: 8 incluye elementos enviados
en los índices 5, 6 y 7:
enviado[5 : 8]
word6’, ’word7’, ’word8’
enviado[5]
0
word60
enviado[6]
0
word70
enviado[7]
0
word80
20
2.3 Variables
enviado[9][3]
Rastreo(o ltimallamadamsreciente) :
Archivo” < stdin > ”, lnea1, en?
IndexError : listaelndicef ueraderango
Nota
Tu turno: tómate unos minutos para definir tu propia oración y modi-
ficar palabras individuales y grupos de palabras (rebanadas) usando los
mismos métodos que antes. Compruebe su comprensión al intentar los
ejercicios en las listas al final de este capítulo.
2.3 Variables
En general, podemos inventar nombres para cualquier cosa que nos interese
calcular. Lo hicimos nosotros mismos en las secciones anteriores, por ejemplo,
definiendo una variable enviada1 , de la siguiente manera:
21
Capítulo 2. Una mirada más de cerca a Python:
textos como listas de palabras
0
mys ent = [0 Bravely 0 ,0 bold0 ,0 Sir0 ,0 Robin0 ,0 ,0 ,0 mont3 ,
...0 f orth0 ,0 f rom0 ,0 Camelot0 ,0 .0 ]
nounp hrase = mys ent[1 : 4]
nounp hrase
bold’, ’Sir’, ’Robin’
Recuerde que las palabras en mayúscula aparecen antes que las minúsculas en
las listas ordenadas.
Nota
Observe en el ejemplo anterior que dividimos la definición de my-sent en
dos líneas. Las expresiones de Python se pueden dividir en varias líneas,
siempre que esto ocurra dentro de cualquier tipo de corchetes. Python
usa el indicador "... "para indicar que se espera más entrada. No importa
cuánta indentación se use en estas líneas de continuación, pero algunas
sangrías generalmente las hacen más fáciles de leer.
22
2.3 Variables
su código. Python no intenta dar sentido a los nombres; sigue ciegamente tus
instrucciones y no se opone si haces algo confuso, como uno = ’dos’ o dos = 3
. La única restricción es que un nombre de variable no puede ser ninguna de
las palabras reservadas de Python, como def , if , not e import . Si usa una
palabra reservada, Python producirá un error de sintaxis:
no =0 Camelot0
Archivo” < stdin > ”, lnea1
no =0 Camelot0
SintaxisError:sintaxisnovlida
Precaución
!
23
Capítulo 2. Una mirada más de cerca a Python:
textos como listas de palabras
2.4 Cuerdas
Algunos de los métodos que usamos para acceder a los elementos de una lista
también funcionan con palabras individuales o cadenas . Por ejemplo, podemos
asignar una cadena a una variable[1] , indexar una cadena [2]y cortar una
cadena [3]:
nombre ∗ 2
0
M ontyM onty 0
nombre+0 !0
0
M onty!0 7
Podemos unir las palabras de una lista para hacer una sola cadena, o dividir
una cadena en una lista, de la siguiente manera:
24
Capítulo 3
25
Capítulo 3. Computación con lenguaje:
estadísticas simples
Figura 3.1: Palabras de conteo que aparecen en un texto (una distribución de frecuencia)
Cuando llamamos por primera vez a FreqDist , pasamos el nombre del texto
como un argumento[1] . Podemos inspeccionar el número total de palabras (-
esultados") que se han contabilizado [2], 260.819 en el caso de Moby Dick .
La expresión most-common (50) nos proporciona una lista de los 50 tipos más
frecuentes del texto [3].
26
3.1 Distribuciones de frecuencia
Nota
Su Turno: Pruebe el ejemplo anterior de distribución de frecuencia para
usted mismo, para texto2 . Tenga cuidado de usar los paréntesis correctos
y las letras mayúsculas. Si obtiene un mensaje de error NameError: el
nombre ’FreqDist’ no está definido , debe comenzar su trabajo desde
nltk.book import ∗
Figura 3.2: Gráfico de frecuencia acumulado para 50 palabras más frecuentes en Moby Dick
: estos representan casi la mitad de los tokens.)
Si las palabras frecuentes no nos ayudan, qué hay de las palabras que ocurren
una sola vez, los llamados hapax ? Visualícelos escribiendo fdist1.hapaxes () .
Esta lista contiene lexicógrafos , cetológicos , contrabandistas , expostulations
y alrededor de 9,000 más. Parece que hay demasiadas palabras raras, y sin ver
el contexto, probablemente no podamos adivinar qué significa la mitad de los
hapaxes en cualquier caso. Como ni palabras frecuentes ni infrecuentes ayudan,
tenemos que intentar algo más.
27
Capítulo 3. Computación con lenguaje:
estadísticas simples
a. w | w â V P (w)
segundo [w para w en V si p (w)]
V = set(text1)
longw ords = [wparawenV silen(w) > 15]
sorted(longw ords)
CIRCUMNAVIGATION’, ’Physiognomically’, ’aprehensiÃ3 n0 ,0 canibal-
stico0 ,
0
caractersticamente0 ,0 circunnavegaci3 n0 ,0 circunnavegaci3 n0 ,0 circunnavegaciones0 ,
0
integralidad0 ,0 hermaf rodita0 ,0 indiscriminadamente0 ,0 indispensabilidad0 ,
0
irresistibilidad0 ,0 f ison3 micamente0 ,0 sobrenaturalidad0 ,0 responsabilidades0 ,
0
simultaneidad0 ,0 subterraneidad0 ,0 sobrenaturalidad0 ,0 superstici3 n0 ,
0
incomodidad0 ,0 intransigencia0 ,0 indiscriminado0 ,0 nointerpenetrante0
28
3.2 SelecciÃ3 nf inadepalabras
Nota
Su Turno: Pruebe las declaraciones anteriores en el intérprete de Pyt-
hon, y experimente cambiando el texto y cambiando la condición de la
longitud.
Observe cómo hemos usado dos condiciones: len (w)>7 asegura que las pa-
labras tienen más de siete letras, y fdist5 [w]>7 asegura que estas palabras
ocurren más de siete veces. Por fin hemos logrado identificar automáticamente
las palabras del texto que contienen contenido con frecuencia. Es un hito mo-
desto pero importante: una pequena porción de código, que procesa decenas
de miles de palabras, produce una salida informativa.
29
Capítulo 3. Computación con lenguaje:
estadísticas simples
Nota
Si omitiste list () arriba, y acabas de escribir bigrams ([ ’more’ , ...])
, habrías visto el resultado de la forma <generator object bigrams en
0x10fb8b3a8>. Esta es la manera en que Python dice que está listo para
calcular una secuencia de elementos, en este caso, bigrams. Por ahora,
solo necesita saber decirle a Python que lo convierta en una lista, usando
list () .
30
3.4 Contando otras cosas
Contar palabras es útil, pero también podemos contar otras cosas. Por ejemplo,
podemos ver la distribución de las longitudes de palabra en un texto, creando
un FreqDist a partir de una larga lista de números, donde cada número es la
longitud de la palabra correspondiente en el texto:
[len(w)parawentexto1][1]
4, 4, 2, 6, 8, 4, 1, 9, 1, 1, 8, 2, 1, 4, 11, 5, 2, 1, 7, 6, 1, 3, 4, 5 , 2, ...
31
Capítulo 3. Computación con lenguaje:
estadísticas simples
f dist.max()
3
f dist[3]
50223
f dist.f req(3)
0,19255882431878046
De esto vemos que la longitud de palabra más frecuente es 3, y que las palabras
de longitud 3 representan aproximadamente 50,000 (o 20 por ciento) de las
palabras que componen el libro. Aunque no vamos a continuar aquí, un análisis
más detallado de la longitud de las palabras puede ayudarnos a comprender
las diferencias entre autores, géneros o idiomas.
3.1 resume las funciones definidas en las distribuciones de frecuencia.
Nuestra discusión sobre la distribución de frecuencias ha introducido algunos
conceptos importantes de Python, y los analizaremos sistemáticamente en 4 .
32
3.4 Contando otras cosas
Ejemplo Descripción
fdist = FreqDist (muestras) crear una distribución de frecuencia
que contenga las muestras dadas
fdist [muestra] + = 1 incrementar el conteo para esta muestra
fdist [ ’monstruo’ ] recuento del número de veces que se
produjo una muestra determinada
fdist.freq ( ’monstruoso’ ) frecuencia de una muestra dada
fdist.N () número total de muestras
fdist.most_common (n) las n muestras más comunes y
sus frecuencias
para la muestra en fdist: iterar sobre las muestras
fdist.max () muestra con el mayor recuento
fdist.tabulate () tabular la distribución de frecuencia
fdist.plot () gráfica gráfica de la
distribución de frecuencia
fdist.plot (acumulativo = verdadero) diagrama acumulativo de la distribución de
frecuencia
fdist1 | = fdist2 actualiza fdist1 con conteos de fdist2
fdist1 <fdist2 probar si las muestras en fdist1 ocurren con m
frecuencia que en fdist2
33
Capítulo 4
Hasta ahora, nuestros pequenos programas han tenido algunas cualidades in-
teresantes: la capacidad de trabajar con el lenguaje y el potencial para ahorrar
esfuerzo humano a través de la automatización. Una característica clave de
la programación es la capacidad de las máquinas para tomar decisiones en
nuestro nombre, la ejecución de instrucciones cuando se cumplen ciertas con-
diciones, o el bucle repetido a través de datos de texto hasta que se cumpla
alguna condición. Esta característica se conoce como control y es el foco de
esta sección.
4.1 Condicionales
Python admite una amplia gama de operadores, como <y >= , para probar la
relación entre valores. El conjunto completo de estos operadores relacionales
se muestra en 4.1 .
Podemos usar estos para seleccionar diferentes palabras de una oración de texto
de noticias. Aquí hay algunos ejemplos: solo el operador cambia de una línea
a la siguiente. Todos usan sent7 , la primera oración de text7 ( Wall Street
35
Capítulo 4. Volver a Python:
tomar decisiones y tomar el control
Operador Relación
< menos que
<= Menos que o igual a
== igual a (tenga en cuenta que esto es dos signos "= ", no uno)
!= no igual a
> mas grande que
>= Mayor qué o igual a
Journal ). Como antes, si recibe un error que dice que sent7 no está definido,
primero debe escribir: from nltk.book import ∗
sent7
Pierre’, ’Vinken’, ’,’, ’61’, ’años0 ,0 viejo0 ,0 ,0 ,0 will0 ,0 join0 ,0 the0 ,
0
board0 ,0 como0 ,0 a0 ,0 noejecutivo0 ,0 director0 ,0 N ov.0 ,0 290 ,0 .0
[wparawensent7silen(w) == 4]
will’, ’join’, ’Nov.’
[wparawensent7silen(w)! = 4]
Pierre’, ’Vinken’, ’,’, ’61’, ’años0 ,0 viejo0 ,0 ,0 ,0 el0 ,0 junta0 ,
0
como0 ,0 a0 ,0 noejecutivo0 ,0 director0 ,0 290 ,0 .0
Hay un patrón común para todos estos ejemplos: [w para w en texto si condición
] , donde condición es una "prueba"de Python que arroja verdadero o falso.
En los casos que se muestran en el ejemplo de código anterior, la condición
siempre es una comparación numérica. Sin embargo, también podemos probar
varias propiedades de palabras, usando las funciones enumeradas en 4.2 .
———————————————————————
36
4.2 Operando en cada elemento
[len(w)parawentexto1]
4, 4, 2, 6, 8, 4, 1, 9, 1, 1, 8, 2, 1, 4, 11, 5, 2, 1, 7, 6, 1, 3, 4, 5, 2, ...
[w.upper()parawentext1]
[’, ’MOBY’, ’DICK’, ’BY’, ’HERMAN’, ’MELVILLE’, ’1851’, ’
0 0
, ET IM OLOGA0 ,0 .0 , ...]
Estas expresiones tienen la forma [f (w) para ...] o [wf () para ...] , donde f es
una función que opera en una palabra para calcular su longitud o convertirla a
mayúsculas. Por ahora, no necesita comprender la diferencia entre las notacio-
nes f (w) y wf () . En su lugar, simplemente aprende este modismo de Python
que realiza la misma operación en cada elemento de una lista. En los ejemplos
anteriores, pasa por cada palabra en texto1 , asignando cada una a la variable
w y realizando la operación especificada en la variable.
Nota
La notación que acabamos de describir se llama "lista de comprensión".
Este es nuestro primer ejemplo de un modismo de Python, una notación
fija que usamos habitualmente sin molestarnos en analizar cada vez. Do-
minar dichos modismos es una parte importante de convertirse en un
programador de Python fluido.
len(text1)
260819
len(set(text1))
19317
len(set(word.lower()parapalabraentexto1))
17231
37
Capítulo 4. Volver a Python:
tomar decisiones y tomar el control
Ahora que no estamos contando dos palabras como Esto y esto , que difieren
solo en mayúsculas, hemos eliminado 2,000 del recuento de vocabulario! Pode-
mos ir un paso más allá y eliminar los números y la puntuación del recuento
de vocabulario filtrando los elementos no alfabéticos:
38
4.3 Bloques de código anidados
Nota Si
Si está utilizando Python 2.6 o 2.7, necesita incluir la siguiente línea para
que se reconozca la función de impresión anterior :
39
Capítulo 4. Volver a Python:
tomar decisiones y tomar el control
Usted se dará cuenta de que si y para los estados tienen dos puntos al final
de la línea, antes de que comience la sangría. De hecho, todas las estructuras
de control de Python terminan con dos puntos. Los dos puntos indican que la
instrucción actual se relaciona con el bloque sangrado que sigue.
También podemos especificar una acción a tomar si no se cumple la condición
de la declaración if . Aquí vemos la instrucción elif (else if) y la instrucción
else . Tenga en cuenta que estos también tienen dos puntos antes del código
sangrado.
paratokenensent1 :
...if token.islower() :
...print(token,0 esunapalabraenmino scula0 )
...elif token.istitle() :
...print(token,0 esunapalabradettulo0 )
...else :
...print(token,0 eslapuntuacion0 )
...
Callesunapalabraporpalabraclave
meesunapalabraminscula
Ishmaelesunapalabradettulo
.espuntuaci3 n
40
4.4 Bucle con condiciones
Como puede ver, incluso con esta pequena cantidad de conocimiento de Pyt-
hon, puede comenzar a crear programas de Python de líneas múltiples. Es
importante desarrollar dichos programas en piezas, probando que cada pieza
haga lo que esperas antes de combinarlas en un programa. Esta es la razón
por la cual el intérprete interactivo de Python es tan valioso y por qué debería
sentirse cómodo al usarlo.
Finalmente, combinemos los modismos que hemos estado explorando. Prime-
ro, creamos una lista de palabras cie y cei , luego recorremos cada elemento e
imprimimos. Observe la información adicional dada en la declaración de im-
presión: end = ” . Esto le dice a Python que imprima un espacio (no la nueva
línea predeterminada) después de cada palabra.
41
Capítulo 5
Qué sitios turísticos puedo visitar entre Filadelfia y Pittsburgh con un pre-
supuesto limitado? Qué dicen los expertos sobre las cámaras digitales SLR?
Qué predicciones sobre el mercado del acero fueron hechas por comentaristas
creíbles la semana pasada? Conseguir que una computadora responda auto-
máticamente implica una variedad de tareas de procesamiento del lenguaje,
incluida la extracción de información, la inferencia y el resumen, y debería
43
Capítulo 5. Comprensión automática del lenguaje natural
llevarse a cabo en una escala y con un nivel de robustez que está aún más allá
de nuestras capacidades actuales.
En un nivel más filosófico, un desafío de larga data dentro de la inteligencia
artificial ha sido construir máquinas inteligentes, y una parte importante del
comportamiento inteligente es la comprensión del lenguaje. Durante muchos
anios este objetivo se ha visto como demasiado difícil. Sin embargo, a medida
que las tecnologías de PNL se vuelven más maduras y los métodos robustos
para analizar el texto no restringido se generalizan, la perspectiva de la com-
prensión del lenguaje natural ha resurgido como un objetivo plausible.
En esta sección describimos algunas tecnologías de comprensión del lenguaje,
para darle una idea de los desafíos interesantes que le esperan.
En una oración que contiene la frase: sirvió el plato , puedes detectar que tanto
el servicio como el plato se usan con los significados de los alimentos. Es poco
probable que el tema de discusión haya pasado de los deportes a la vajilla en
el espacio de tres palabras. Esto te obligaría a inventar imágenes extranas,
como un profesional del tenis que saca sus frustraciones en un juego de té de
porcelana dispuesto al lado de la cancha. En otras palabras, desambiguamos
palabras automáticamente usando el contexto, explotando el simple hecho de
que las palabras cercanas tienen significados estrechamente relacionados. Como
otro ejemplo de este efecto contextual, considere la palabra por , que tiene
varios significados, por ejemplo: el libro de Chesterton (agente - Chesterton
fue el autor del libro); la taza junto a la estufa (locativo - la estufa es donde
está la taza); y enviar antes del viernes (temporal - viernes es el momento de
44
5.2 Resolución del pronombre
do. Los ladrones robaron las pinturas. Ellos fueron posteriormente encontrados
.
45
Capítulo 5. Comprensión automática del lenguaje natural
segundo. Les voleurs ont volé les peintures. Ils ont été trouvés plus tard. (los
ladrones)
do. Les voleurs ont volé les peintures. Elles ont été trouvées plus tard. (las
pinturas)
46
5.4 Traducción automática
47
Capítulo 5. Comprensión automática del lenguaje natural
Nota
Tu turno: prueba esto usando http://translationparty.com/
La traducción automática es difícil porque una palabra dada podría tener va-
rias traducciones posibles (dependiendo de su significado), y porque el orden
de las palabras debe cambiarse de acuerdo con la estructura gramatical del
idioma de destino. Hoy se enfrentan estas dificultades al recopilar cantidades
masivas de textos paralelos de sitios web de noticias y del gobierno que pu-
blican documentos en dos o más idiomas. Dado un documento en alemán e
inglés, y posiblemente un diccionario bilingà 14 e, podemos emparejar automá-
ticamente las oraciones, un proceso llamado alineación de texto . Una vez que
tenemos un millón o más pares de oraciones, podemos detectar las palabras
y frases correspondientes, y crear un modelo que se pueda usar para traducir
texto nuevo.
48
5.5 Sistemas de diálogo hablado
49
Capítulo 5. Comprensión automática del lenguaje natural
Nota
Su turno: para un ejemplo de un sistema de diálogo primitivo, trate
de tener una conversación con un chatbot NLTK. Para ver los chatbots
disponibles, ejecute nltk.chat.chatbots () . (Recuerde importar nltk pri-
mero).
50
5.7 Limitaciones de NLP
ella no ha escrito (todo) ese libro; (iii) si alguien es editor o autor de dieciocho
libros, entonces no se puede concluir que él / ella es autor de dieciocho libros.
A pesar de los avances liderados por la investigación en tareas como RTE, los
sistemas de lenguaje natural que se han implementado para aplicaciones del
mundo real aún no pueden realizar un razonamiento de sentido común o recurrir
al conocimiento del mundo de una manera general y robusta. Podemos espe-
rar a que se resuelvan estos difíciles problemas de inteligencia artificial, pero
mientras tanto es necesario vivir con algunas limitaciones severas en las capaci-
dades de razonamiento y conocimiento de los sistemas de lenguaje natural. En
consecuencia, desde el principio, un objetivo importante de la investigación de
PNL ha sido avanzar en la difícil tarea de construir tecnologías que .entienden
el lenguaje", utilizando técnicas superficiales pero poderosas en lugar de un
conocimiento irrestricto y capacidades de razonamiento. De hecho, este es uno
de los objetivos de este libro,
51
Capítulo 6
Resumen
53
Capítulo 6. Resumen
54
Capítulo 7
Lectura adicional
55
Capítulo 7. Lectura adicional
Para obtener más información sobre los temas cubiertos en 5 , y sobre PNL en
general, le recomendamos consultar uno de los siguientes libros excelentes:
56
Capítulo 8
Ejercicios
12/(4 + 1)
2,4
57
Capítulo 8. Ejercicios
10. Defina una variable my-sent para que sea una lista de palabras, usando
la sintaxis my-sent = [ "My", "sent"] (pero con sus propias palabras o un
dicho favorito).
11. Definir varias variables que contienen listas de palabras, por ejemplo,
PHRASE1 , PHRASE2 , y así sucesivamente. únelos en varias combina-
ciones (usando el operador más) para formar oraciones completas. Cuál es
la relación entre len (phrase1 + phrase2) y len (phrase1) + len (phrase2)
?
12. Considere las siguientes dos expresiones, que tienen el mismo valor. Cuál
será típicamente más relevante en NLP? Por qué?
"Monty Python"[6:12]
58
"Monty", "Python [1]
13. Hemos visto cómo representar una oración como una lista de palabras,
donde cada palabra es una secuencia de caracteres. Qué hace send1 [2]
[2] ? Por qué? Experimente con otros valores de índice.
14. La primera oración del texto3 se le proporciona en la variable enviada3 .
El índice de la en sent3 es 1, porque sent3 [1] nos da ’la’ . Cuáles son los
índices de las otras dos ocurrencias de esta palabra en sent3 ?
15. Revise la discusión de los condicionales en 4 . Encuentre todas las palabras
en el Chat Corpus ( texto5 ) comenzando con la letra b . Muéstrelos en
orden alfabético.
16. Escriba la lista de expresiones (rango (10)) en el indicador del intérprete.
Ahora prueba lista (rango (10, 20)) , lista (rango (10, 20, 2)) , y lista
(rango (20, 10, -2)) . Veremos una variedad de usos para esta función
incorporada en capítulos posteriores.
list(range(10))
1, 2, 3, 4, 5, 6, 7, 8, 9
list(range(10, 20))
11, 12, 13, 14, 15, 16, 17, 18, 19
list(range(10, 20, 2))
12, 14, 16, 18
list(range(20, 10, −2))
59
Capítulo 8. Ejercicios
ordenado(set(w.lower()parawentext1))
ordenado(w.lower()parawenset(text1))
60
len(sorted([w.lower()f orwinset(text2)]))
6833
len(sorted(set([w.lower()f orwintext2])))
6403
N osdaunmayorvalorenlasentencia1.
61
Capítulo 8. Ejercicios
Finalizando en ize
Que contiene la letra z
Que contiene la secuencia de letras pt
62
Tener todas las letras minúsculas a excepción de un capital inicial
(es decir, título )
25. Define enviado como la lista de palabras [ ’ella’ , ’vende’ , ’mar’ , ’capara-
zón’ , ’por’ , ’el’ , ’mar’ , ’orilla’ ] . Ahora escribe el código para realizar
las siguientes tareas:
Imprimir todas las palabras que comienzan con sh
[wf orwinsentif w[0 : 2]==0 sh0 ] [0 she0 ,0 shells0 ,0 shore0 ]
Imprimir todas las palabras que comienzan con sh Imprimir todas las pa-
labras de más de cuatro caracteres
26. Qué hace el siguiente código de Python? sum (len (w) for w en text1) Se
puede usar para calcular la longitud de palabra promedio de un texto?
una función llamada vocab-size (texto) que tiene un único parámetro para
el texto y que devuelve el tamañodevocabulariodeltexto.
27. Defina un porcentaje de función (palabra, texto) que calcula la frecuencia con
que aparece una palabra determinada en un texto y expresa el resultado como
un porcentaje.
28. Hemos estado usando juegos para almacenar vocabularios. Pruebe la siguiente
expresión de Python: set (sent3) <set (text1) . Experimenta con esto usando
diferentes argumentos para set () . Qué hace? Puedes pensar en una aplicación
práctica para esto?
63