Computación con el lenguaje 5 Día 26, 21 mar 14 Cultura computacional en español SPAN 4350 Harry Howard Tulane University
Organización del curso Las grabaciones y las presentaciones están disponibles en: NLP/ NLP/ La versión en inglés del tema es ES/control.html ES/control.html Las notas están en el Gradebook de Blackboard. 21-mar-14SPAN Harry Howard - Tulane University2
REPASO 21-mar-14SPAN Harry Howard - Tulane University3
21-mar-14SPAN Harry Howard - Tulane University4 Funciones para las distribuciones de frecuencia de NLTK df = 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 < df2 ocurren 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-14SPAN Harry Howard - Tulane University5
21-mar-14SPAN Harry Howard - Tulane University6 Figura 2.4 Contar palabras que aparecen en una colección de textos (una distribución de frecuencia condicionada).
21-mar-14SPAN Harry Howard - Tulane University7 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-14SPAN Harry Howard - Tulane University8 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-14SPAN Harry Howard - Tulane University9 Comprobar el resultado >>> len(genero_palabra) >>> genero_palabra[:4] [('news', 'The'), ('news', 'Fulton'), ('news', 'County'), ('news', 'Grand')] >>> genero_palabra[-4:] [('romance', 'afraid'), ('romance', 'not'), ('romance', "''"), ('romance', '.')] >>> dfc >>> dfc.conditions() ['news', 'romance'] >>> dfc['news'] >>> dfc['romance'] >>> 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 NLPP mar-14SPAN Harry Howard - Tulane University10
21-mar-14SPAN Harry Howard - Tulane University11 Tabular una distribución cancouldmaymightmustwill news religion hobbies sci fi romance humor
21-mar-14SPAN Harry Howard - Tulane University12 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-14SPAN Harry Howard - Tulane University13 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-14SPAN Harry Howard - Tulane University14 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 gen for 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-14SPAN Harry Howard - Tulane University15
dfc.tabulate() can could may might must will news religion hobbies science_fiction romance humor mar-14SPAN Harry Howard - Tulane University16
dfc.plot() 21-mar-14SPAN Harry Howard - Tulane University17
21-mar-14SPAN Harry Howard - Tulane University18 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-14SPAN Harry Howard - Tulane University19 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-14SPAN Harry Howard - Tulane University20 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-14SPAN Harry Howard - Tulane University21
dfc2.tabulate() no se puede leer america citizen mar-14SPAN Harry Howard - Tulane University22
Es algo así como … … america21801 citizen mar-14SPAN Harry Howard - Tulane University23
dfc2.tabulate() cambiando los ejes america citizen mar-14SPAN Harry Howard - Tulane University24
21-mar-14SPAN Harry Howard - Tulane University25 dfc2.plot()
21-mar-14SPAN Harry Howard - Tulane University26 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ía Tráete el portátil a clase. P6 Análisis de textos con NLTK 21-mar-14SPAN Harry Howard - Tulane University27