No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Estadísticas básicas del lenguaje

7/24
Recursos

Aportes 23

Preguntas 3

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.

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

    • También podemos ver los tks con text3.tokens[:10]
  • Riqueza lexica

    R1 = total de palabras unicas/ total de palabras = longitud del vocabulario/longitud del texto

    • Vocabulario = Palabras únicas de un 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

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.

https://www.kaggle.com/getting-started/159664

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.