Una aclaración, cuando se define la función riqueza_lexica(texto), la variable vocabulario esta mal definida deberia ser :
vocabulario=sorted(set(texto)) y no así text1
Introducción al Procesamiento de Lenguaje Natural
Introducción al Procesamiento de Lenguaje Natural
Evolución del NLP
Conceptos básicos de NLP
Fundamentos con NLTK
Configurar ambiente de trabajo
Palabras, textos y vocabularios
Tokenizacion con Expresiones Regulares
Estadísticas básicas del lenguaje
Distribuciónes de frecuencia de palabras
Refinamiento y visualización de cuerpos de texto
N-gramas y Colocaciones del lenguaje
¿Cómo extraer n-gramas de un texto en Python?
Colocaciones en Python
Colocaciones en gráficos de dispersión
Filtros y colocaciones en NLTK
Introducción a los recursos léxicos
Recursos léxicos en NLTK
NLTK para traducción de palabras
Introducción a WordNet
Explorando WordNet
Similitud Semantica con WordNet
Procesamiento de texto plano desde Web
Usando código estructurado: conexión de Drive a Google Colab
Usando código estructurado: Funciones externas
Perspectivas de lo que viene
Continúa con el Curso de Algoritmos de Clasificación de Texto
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Aportes 25
Preguntas 3
Una aclaración, cuando se define la función riqueza_lexica(texto), la variable vocabulario esta mal definida deberia ser :
vocabulario=sorted(set(texto)) y no así text1
Les comparto una forma en la que pueden ver la riqueza lexica de todos los textos del modulo nltk.book
def lexical_affluence(corpus):
vocabulary = sorted(set(corpus))
return len(vocabulary) / len(corpus)
texts = [ i for i in dir(nltk.book) if re.search(r'text\d', i)]
for text in texts:
exec(compile(f'print({text}.name, "\\n", lexical_affluence({text}), "\\n" )',
'', 'exec'))
Esto fue lo que se me ocurrio a mi para poder pasar los el nombre los textos como un parametro, si saben otra forma me gustaria saberlo c:
Que buen curso y que excelente profesor.Algo que parece tan complejo, lo presenta de una forma simple.
Una pregunta :Cual es el procedimiento a seguir si tengo un texto que quiero analizar y no esta en la librería de nltk?
Cúal seria una forma eficiente de escribir una función en python en el que solo debamos poner el texto (ya sea text6,text4,etc) y que no tengamos que definir el vocabulario de cada uno?
Nose si me estoy explicando correctamente, me refiero a esta parte
vocabulario = sorted(set(text7))
Algo que entendí en el link sobre el objeto “set” es útil para poder eliminar datos duplicados.
Primer paso
Importar las librerías necesarias; NLTK tiene un paquete. de libros llamado "book" asi que debemos descargarlo
import nltk
nltk.download('book')
from nltk.book import *
import matplotlib.pyplot as plt
import numpy as np
Se puede escoger entre varios libros con text y el numero , ejemplo text3
Riqueza lexica
R1 = total de palabras unicas/ total de palabras = longitud del vocabulario/longitud del texto
vocabulario = sorted(**set**(text3))
print(vocabulario[1000:1050])
set = es una funcion que toma la lista de tks repetidos y los deja una sola vez
Riqueza léxica para un libro
rl = len(vocabulario)/len(text3)
print(rl)
Riqueza lexica general
Podemos general una función para hallar la rl de cualquier libro del dataset
def riqueza_lexica (texto):
vocabulario = sorted(set(texto))
return len(vocabulario)/len(texto)
riqueza_lexica(text3)
porcentaje por palabras
def porcentaje_palabra (palabra,texto):
return 100*texto.count(palabra)/len(texto)
porcentaje_palabra('lord',text3)
Algo que note es la funcion count no hace distincion entre mayusculas y minusculas para solucionar esto lo hice de dos maneras
Usando Regex
search_word = 'tHe'
search = re.compile(search_word, flags=re.IGNORECASE)
count = 0
for word in text1:
if search.fullmatch(word, 0):
count += 1
Usando sets
def transform(word):
return {
word,
word.lower(),
word.upper(),
word.capitalize()
}
search_word = 'tHe'
count = 0
for word in transform(search_word):
count += text1.count(word)
Aunque usando Sets tiene un mejor rendimiento
Estadisticas de los textos
La version actualizada del link de la documentacion de Set es https://docs.python.org/2/library/stdtypes.html#set
La clase es muy similar a este pdf … muy similar
.tsc.uc3m.es/~miguel/MLG/adjuntos/NLTK.pdf
Manejo de la Función Set en Python
Creo que para darle más valor a la métrica de riqueza sería pasar todas las strings a lower para que no nos tome una misma palabra como distinta.
Hola amigos
En el siguiente enlace encontraran algunos cheetset que nos podrían ayudar.
les comparto otra forma de hacerlo con el tokenizador de nltk
<from nltk.tokenize import sent_tokenize, word_tokenize
#Funcion de Riqueza
def riqueza(texto):
vocabulario=set(word_tokenize(texto))
return len(vocabulario)/len(texto)
print(riqueza(data))
>
Para las funciones definidas sería importante eliminar los conectores antes de sacar los indicadores de riqueza lexica o porcentaje de la palabra, pues palabras como preposiciones o artículos no le agregan valor al contenido del texto. Igualmente con el código sorted(set(text1)) se incluyen los signos de puntuación. Por eso la palabra “monster” tiene un porcentaje tan bajo. Si hacemos el ejercicio con la pabra “THE” registra una utilización del 5,26%, o si lo hacemos con “,” este representaría un 7,17%.
Les dejo la riqueza léxica de cada texto:
for text in [text1, text2, text3, text4, text5, text6, text7, text8, text9]:
print (f'{text.name}. Riqueza léxica: {round(riquiza_lexica(text)*100, 2)}%')
Output:
Moby Dick by Herman Melville 1851. Riqueza léxica: 7.41%
Sense and Sensibility by Jane Austen 1811. Riqueza léxica: 4.83%
The Book of Genesis. Riqueza léxica: 6.23%
Inaugural Address Corpus. Riqueza léxica: 6.62%
Chat Corpus. Riqueza léxica: 13.48%
Monty Python and the Holy Grail. Riqueza léxica: 12.77%
Wall Street Journal. Riqueza léxica: 12.32%
Personals Corpus. Riqueza léxica: 22.77%
The Man Who Was Thursday by G . K . Chesterton 1908. Riqueza léxica: 9.83%
Las dos funciones que hemos aprendido en la clase:
def calculate_lexical_enrichment(text):
vocab = sorted(set(text)) # Exclude all duplicated words from the dictionary
return len(vocab) / len(text) # and divide the amount of unique words per total amount of words
def word_occurrences_in_text(word, text):
occurrences = text.count(word) # Count the amount of repeated words in text
return 100 * (occurrences / len(text)) # then divide per amount of words and finally multiply per
# 100 to get the percentual value.
también se puede determinar la cantidad de palabras únicas (exactamente el mismo resultado) utilizando la siguiente linea de comando (vocab ya es una variable interna del cada objeto texto)
< vocabulario = sorted(text1.vocab())
rl = len(vocabulario)/ len(text1)
print(rl)
>
Saludos!
Curso muy interesante, el profesor explica de manera clara.
Muy bueno este curso estoy aprendiendo bastante 😃
excelente clase, las ganas de aprender, llegan hasta altas horas de la noche.
les dejo un código parecido, pero alternativo que arroja los mismos resultados
<
import nltk
nltk.download('book')
from nltk.book import *
def lexical_wealth(text_):
"""
this function compute the lexical wealth of a text
input --> text_: Text object
output --> float
"""
vocabulary = sorted(text_.vocab())
return len(vocabulary)/len(text_)
def word_percentage(word,text_):
"""
this function computes the percentage that a selected word is ocuppied into a text
input --> word: str object
--> text_: Text object
output --> float
"""
vocabulary = text_.vocab()
count = vocabulary[word]
return 100*count/len(text_)
lexical_wealth(text1)
print(word_percentage('monster', text1))
>
¡Saludos!
Les dejo un código para calcular la riqueza léxica usando numpy 😃
tokens_np = np.array(text1.tokens)
t_palasbras_unicas = np.unique(tokens_np).size
t_palabras = tokens_np.size
t_palasbras_unicas/t_palabras
Riqueza Lexica texto 2: 0.04826383002768831
Riqueza Lexica texto 3: 0.06230453042623537
Riqueza Lexica texto 4: 0.06617622515804722
Riqueza Lexica texto 5: 0.13477005109975562
Riqueza Lexica texto 6: 0.1276595744680851
set o Conjunto
Los conjuntos se utilizan para almacenar varios elementos en una sola variable.
Set es uno de los 4 tipos de datos integrados en Python que se utilizan para almacenar colecciones de datos, los otros 3 son List, Tuple y Dictionary, todos con diferentes calidades y usos.
Un conjunto es una colección que está desordenada y no indexada.
Los conjuntos se escriben con llaves.
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?
o inicia sesión.