Computación con el lenguaje 5 Día 26, 21 mar 14 Cultura computacional en español SPAN 4350 Harry...
-
Upload
porfirio-nazario -
Category
Documents
-
view
6 -
download
0
Transcript of Computación con el lenguaje 5 Día 26, 21 mar 14 Cultura computacional en español SPAN 4350 Harry...
Computación con el lenguaje 5
Día 26, 21 mar 14
Cultura computacional en españolSPAN 4350
Harry HowardTulane University
Organización del curso
Las grabaciones y las presentaciones están disponibles en:http://www.tulane.edu/~howard/SPAN-NLP/
La versión en inglés del tema es http://www.tulane.edu/~howard/CompCultES/control.html
Las notas están en el Gradebook de Blackboard.
21-mar-14 SPAN 4350 - Harry Howard - Tulane University 2
Repaso
21-mar-14 SPAN 4350 - Harry Howard - Tulane University 3
21-mar-14 SPAN 4350 - Harry Howard - Tulane University 4
Funciones para las distribuciones de frecuencia de NLTKdf = FreqDist(muestras) crear una distribución de frecuencias con 'muestras'
df.inc(muestra) incrementar el recuento de 'muestra' (ver siguiente)
df['amor'] mostrar el número de veces que ocurre 'amor'
df.freq('amor') la frecuencia de 'amor'
df.keys() ordenar las muestras en orden decreciente
for muestra in df: iterar sobre las muestras en orden decreciente
df.N() el número total de muestras
df.max() la muestra con el mayor recuento
df.tabulate(n,m) tabular la distribución de frecuencias
df.plot() cuadro de la distribución de frecuencias
df.plot(cumulative=True) cuadro acumulativa de la distribución de frecuencias
df1 < df2ocurren las muestras en df1 con menos frecuencia que en df2?
Hay dos formas de acceder a ellas
>>> import nltk# La forma directa>>> temp = nltk.corpus.stopwords.words('spanish')# La forma indirecta>>> from nltk.corpus import stopwords>>> temp = stopwords.words('spanish')# El resultado es el mismo para las dos:>>> vacias[:50]['de', 'la', 'que', 'el', 'en', 'y', 'a', 'los', 'del', 'se', 'las', 'por', 'un', 'para', 'con', 'no', 'una', 'su', 'al', 'lo', 'como', 'm\xc3\xa1s', 'pero', 'sus', 'le', 'ya', 'o', 'este', 's\xc3\xad', 'porque', 'esta', 'entre', 'cuando', 'muy', 'sin', 'sobre', 'tambi\xc3\xa9n', 'me', 'hasta', 'hay', 'donde', 'quien', 'desde', 'todo', 'nos', 'durante', 'todos', 'uno', 'les', 'ni']>>> len(temp)313# Convertir a Unicode>>> vacias = [p.decode('utf8') for p in temp]>>> vacias[:50][u'de', u'la', u'que', u'el', u'en', u'y', u'a', u'los', u'del', u'se', u'las', u'por', u'un', u'para', u'con', u'no', u'una', u'su', u'al', u'lo', u'como', u'm\xe1s', u'pero', u'sus', u'le', u'ya', u'o', u'este', u's\xed', u'porque', u'esta', u'entre', u'cuando', u'muy', u'sin', u'sobre', u'tambi\xe9n', u'me', u'hasta', u'hay', u'donde', u'quien', u'desde', u'todo', u'nos', u'durante', u'todos', u'uno', u'les', u'ni']
21-mar-14 SPAN 4350 - Harry Howard - Tulane University 5
21-mar-14 SPAN 4350 - Harry Howard - Tulane University 6
Figura 2.4
Contar palabras que aparecen en una colección de textos (una distribución de frecuencia condicionada).
21-mar-14 SPAN 4350 - Harry Howard - Tulane University 7
Un corpus con categorías
El Corpus de Brown tiene 15 categorías:>>> import nltk>>> from nltk.corpus import brown>>> brown.categories()['adventure', 'belles_lettres', 'editorial',
'fiction', 'government', 'hobbies','humor', 'learned', 'lore', 'mystery', 'news', 'religion', 'reviews', 'romance','science_fiction']
>>> brown.words(categories='news')['The', 'Fulton', 'County', 'Grand', 'Jury',
'said', ...]
21-mar-14 SPAN 4350 - Harry Howard - Tulane University 8
Como procesar por condición
>>> import nltk
>>> from nltk.corpus import brown
>>> from nltk.probability import ConditionalFreqDist
>>> gen = ['news', 'romance']
>>> genero_palabra = [(g, p)
for g in gen
for p in brown.words(categories=g)]>>> dfc = nltk.ConditionalFreqDist(genero_palabra)
21-mar-14 SPAN 4350 - Harry Howard - Tulane University 9
Comprobar el resultado
>>> len(genero_palabra)170576>>> genero_palabra[:4][('news', 'The'), ('news', 'Fulton'), ('news', 'County'), ('news',
'Grand')]>>> genero_palabra[-4:][('romance', 'afraid'), ('romance', 'not'), ('romance', "''"), ('romance',
'.')] >>> dfc<ConditionalFreqDist with 2 conditions>>>> dfc.conditions()['news', 'romance']>>> dfc['news']<FreqDist with 100554 outcomes>>>> dfc['romance']<FreqDist with 70022 outcomes>>>> dfc['romance']['could']193>>> list(dfc['romance'])[',', '.', 'the', 'and', 'to', 'a', 'of', '``', "''", 'was', 'with', 'you',
'for', 'at', 'He', 'on', 'him','said', '!' 'I', 'in', 'he', 'had','?', 'her', 'that', 'it', 'his', 'she', ...]
La computación con el lenguaje: La estadística
http://nltk.org/book/ch01.html, NLPP 1.3
21-mar-14 SPAN 4350 - Harry Howard - Tulane University 10
21-mar-14 SPAN 4350 - Harry Howard - Tulane University 11
Tabular una distribución
can could may might must will
news 93 86 66 38 50 389
religion 82 59 78 12 54 71
hobbies 268 58 131 22 83 264
sci fi 16 49 4 12 8 16
romance 74 193 11 51 45 43
humor 16 30 8 8 9 13
21-mar-14 SPAN 4350 - Harry Howard - Tulane University 12
Como hacerlo
El objetivo es buscar los verbos modales indicados en los géneros indicados del corpus de Brown.
Es una distribución de frecuencia condicionada que toma los géneros como condiciones y los verbos modales como muestra.
21-mar-14 SPAN 4350 - Harry Howard - Tulane University 13
El planteamiento (seudo-código)
# Se crean listas con los géneros y las muestras de interés:>>> gen = ['news', 'religion', 'hobbies', 'science_fiction',
'romance', 'humor']>>> mod = ['can', 'could', 'may', 'might', 'must', 'will']
# Se crea una lista de pares (género, palabra):>>> genero_palabra = [(g, p)
# … revisando cada género en la lista:for g in gen
# … revisando cada palabra en el género:for p in brown.words(categories=g)
# … si la palabra está en la lista de verbos modales:if p in mod]
# Se crea la distribución de la lista de pares:>>> dfc = ConditionalFreqDist(genero_palabra)
21-mar-14 SPAN 4350 - Harry Howard - Tulane University 14
Lo anterior sin comentarios
>>> import nltk
>>> from nltk.corpus import brown
>>> from nltk.probability import ConditionalFreqDist>>> gen = ['news', 'religion', 'hobbies',
'science_fiction', 'romance', 'humor']
>>> mod = ['can', 'could', 'may', 'might', 'must', 'will']
>>> genero_palabra = [(g, p)for g in genfor p in brown.words(categories=g)if p in mod]
>>> dfc = ConditionalFreqDist(genero_palabra)
Visualizar los resultados
En una tabla
>>> dfc.tabulate()En un gráfico
>>> dfc.plot()
21-mar-14 SPAN 4350 - Harry Howard - Tulane University 15
dfc.tabulate()
can could may might must will
news 93 86 66 38 50 389
religion 82 59 78 12 54 71
hobbies 268 58 131 22 83 264
science_fiction 16 49 4 12 8 16
romance 74 193 11 51 45 43
humor 16 30 8 8 9 13
21-mar-14 SPAN 4350 - Harry Howard - Tulane University 16
dfc.plot()
21-mar-14 SPAN 4350 - Harry Howard - Tulane University 17
21-mar-14 SPAN 4350 - Harry Howard - Tulane University 18
Otro ejemplo
El objetivo es encontrar la frecuencia de 'america' y 'citizen' en el corpus de discursos inaugurales que tiene NLTK.
Escogemos el corpus 'inaugural' y miramos sus títulos:>>> from nltk.corpus import inaugural>>> inaugural.fileids()
['1789-Washington.txt', '1793-Washington.txt', '1797-Adams.txt', ..., '2009-Obama.txt']
21-mar-14 SPAN 4350 - Harry Howard - Tulane University 19
El planteamiento (seudo-código)
# Las condiciones son las dos palabras claves:claves = ['america', 'citizen']
# Las muestras son los años, que se van a asignar en la travesía de los discursos.
# Se crea una lista de pares (palabra, año):palabra_anno = [(palabra, discurso[:4])
# … atravesando cada discurso inaugural (por su fileid):for discurso in inaugural.fileids()
# … atravesando cada palabra de cada discurso:for p in inaugural.words(discurso)
# … atravesando cada palabra clave:for palabra in claves
# … si una de las palabras clave empieza la palabra en minúscula:if p.lower().startswith(palabra)]
# Se crea la distribución de la lista de pares:>>> dfc2 = ConditionalFreqDist(palabra_anno)
21-mar-14 SPAN 4350 - Harry Howard - Tulane University 20
Lo anterior sin comentarios
>>> import nltk
>>> from nltk.corpus import inaugural
>>> from nltk.probability import ConditionalFreqDist
>>> claves = ['america', 'citizen']
>>> palabra_anno = [(palabra, discurso[:4])
for discurso in inaugural.fileids()
for p in inaugural.words(discurso)
for palabra in claves
if p.lower().startswith(palabra)]
>>> dfc2 = ConditionalFreqDist(palabra_anno)
Visualizar los resultados
En una tabla
>>> dfc2.tabulate()En un gráfico
>>> dfc2.plot()
21-mar-14 SPAN 4350 - Harry Howard - Tulane University 21
dfc2.tabulate() no se puede leer
1789 1793 1797 1801 1805 1809 1813 1817 1821 1825 1829 1833 1837 1841 1845 1849 1853 1857 1861 1865 1869 1873 1877 1881 1885 1889 1893 1897 1901 1905 1909 1917 1921 1925 1929 1933 1937 1941 1945 1949 1953 1957 1961 1965 1969 1973 1977 1981 1985 1989 1993 1997 2001 2005 2009america 2 1 8 0 1 0 1 1 2 0 0 2 2 7 0 2 2 3 2 1 0 0 1 2 4 6 9 9 7 0 12 4 24 11 12 2 5 12 2 4 6 7 7 10 10 23 5 16 21 11 33 31 20 30 15citizen 5 1 6 7 10 1 4 14 15 3 2 3 7 38 11 2 4 7 7 0 5 3 9 9 13 12 10 10 2 1 6 3 6 5 12 1 2 1 1 1 7 0 5 4 1 1 0 3 6 3 2 10 11 7 221-mar-14 SPAN 4350 - Harry Howard - Tulane University 22
Es algo así como …
1789 1793 1797 1801 1805…
america 2 1 8 0 1
citizen 5 1 9 7 10
21-mar-14 SPAN 4350 - Harry Howard - Tulane University 23
dfc2.tabulate() cambiando los ejes
21-mar-14 SPAN 4350 - Harry Howard - Tulane University 24
21-mar-14 SPAN 4350 - Harry Howard - Tulane University 25
dfc2.plot()
21-mar-14 SPAN 4350 - Harry Howard - Tulane University 26
Resumen de los métodos de ConditionalFreqDist()
dfc = ConditionalFreqDist(pares) crear una distribución de frecuencia condicionada de una lista de pares
dfc.conditions() alistar las condiciones en orden alfabético
dfc[condición] mostrar la distribución de frecuencia de esta condición
dfc[condición][muestra] mostrar la frecuencia de esta muestra por esta condición
dfc.tabulate() tabular la distribución
dfc.tabulate(condition=?, sample=?) tabular las condiciones ? y las muestras ?
dfc.plot() hacer un gráfico de la distribución
dfc.plot(condition=?, sample=?) hacer un gráfico de las condiciones ? y las muestras ?
El próximo díaTráete el portátil a clase.
P6
Análisis de textos con NLTK
21-mar-14 SPAN 4350 - Harry Howard - Tulane University 27