Análisis de texto en Python 3

Análisis de contenido de libros/documentos

Los patrones dentro del texto escrito no son los mismos en todos los autores o idiomas. Esto permite a los lingüistas estudiar el idioma de origen o la autoría potencial de textos donde estas características no se conocen directamente, como los Documentos Federalistas de la Revolución Americana.
Objetivo: En este estudio de caso, examinaremos las propiedades de los libros individuales en una colección de libros de varios autores y varios idiomas. Más específicamente, veremos la longitud de los libros, la cantidad de palabras únicas y cómo estos atributos se agrupan por idioma de o paternidad literaria. 
 

Fuente: Project Gutenberg es la biblioteca digital de libros más antigua. Su objetivo es digitalizar y archivar obras culturales y, en la actualidad, contiene más de 50 000 libros, todos publicados anteriormente y ahora disponibles electrónicamente. Descargue algunos de estos libros en inglés y francés desde aquí y los libros en portugués y alemán de aquí para su análisis. Junte todos estos libros en una carpeta llamada Libros con subcarpetas en inglés, francés, alemán y portugués.
 

Frecuencia de palabras en el texto

Así que vamos a construir una función que cuente la frecuencia de palabras en un texto. Consideraremos un texto de prueba de muestra, y luego reemplazaremos el texto de muestra con el archivo de texto de los libros que acabamos de descargar. Ya que vamos a cuente la frecuencia de las palabras, por lo tanto, las letras MAYÚSCULAS y minúsculas son iguales. Convertiremos todo el texto a minúsculas y lo guardaremos.
 

Python

text = "This is my test text. We're keeping this text short to keep things manageable."
text = text.lower()

La frecuencia de palabras se puede contar de varias maneras. Vamos a codificar, de dos maneras (solo para el conocimiento). Uno usando for loop y el otro usando Counter from collections, que resulta ser más rápido que el anterior. La función devolverá un diccionario de palabras únicas y su frecuencia como un par clave-valor. Entonces, codificamos:
 

Python3

from collections import Counter 
  
# counts word frequency
def count_words(text):                  
    skips = [".", ", ", ":", ";", "'", '"'] 
    for ch in skips: 
        text = text.replace(ch, "") 
    word_counts = {} 
    for word in text.split(" "): 
        if word in word_counts: 
            word_counts[word]+= 1 
        else: 
            word_counts[word]= 1 
    return word_counts 
  
    # >>>count_words(text) You can check the function 
  
# counts word frequency using
# Counter from collections 
def count_words_fast(text):     
    text = text.lower() 
    skips = [".", ", ", ":", ";", "'", '"'] 
    for ch in skips: 
        text = text.replace(ch, "") 
    word_counts = Counter(text.split(" ")) 
    return word_counts 
  
    # >>>count_words_fast(text) You can check the function 

Salida: la salida es un diccionario que contiene las palabras únicas del texto de muestra como clave y la frecuencia de cada palabra como valor. Comparando la salida de ambas funciones, tenemos:
 

{‘eran’: 1, ‘es’: 1, ‘manejable’: 1, ‘a’: 1, ‘cosas’: 1, ‘guardar’: 1, ‘mi’: 1, ‘prueba’: 1, ‘ texto’: 2, ‘mantener’: 1, ‘breve’: 1, ‘esto’: 2}
Counter({‘texto’: 2, ‘esto’: 2, ‘eran’: 1, ‘es’: 1, ‘manejable’: 1, ‘a’: 1, ‘cosas’: 1, ‘manteniendo’: 1, ‘mi’: 1, ‘prueba’: 1, ‘mantener’: 1, ‘breve’: 1})

Lectura de libros en Python: Desde entonces, tuvimos éxito al probar nuestras funciones de frecuencia de palabras con el texto de muestra. Ahora, vamos a probar las funciones con los libros, que descargamos como archivo de texto. Vamos a crear una función llamada read_book() que leerá nuestros libros en Python y los guardará como una string larga en una variable y los devolverá. El parámetro de la función será la ubicación del libro.txt que se leerá y se pasará al llamar a la función. 
 

Python

#read a book and return it as a string
def read_book(title_path):  
    with open(title_path, "r", encoding ="utf8") as current_file:
        text = current_file.read()
        text = text.replace("\n", "").replace("\r", "")
    return text

Total de palabras únicas: vamos a diseñar otra función llamada word_stats(), que tomará el diccionario de frecuencia de palabras (salida de count_words_fast()/count_words()) como parámetro. La función devolverá el número total de palabras únicas (sum /total de claves en el diccionario de frecuencia de palabras) y un dict_values ​​que contiene el recuento total de ellos juntos, como una tupla. 
 

Python3

# word_counts = count_words_fast(text)
def word_stats(word_counts):      
    num_unique = len(word_counts) 
    counts = word_counts.values() 
    return (num_unique, counts) 

Llamar a las funciones: por último, vamos a leer un libro, por ejemplo, la versión en inglés de Romeo y Julieta, y recopilaremos información sobre la frecuencia de palabras, palabras únicas, recuento total de palabras únicas, etc. de las funciones. 
 

Python

text = read_book("./Books / English / shakespeare / Romeo and Juliet.txt")
  
word_counts = count_words_fast(text)         
(num_unique, counts) = word_stats(word_counts)
print(num_unique, sum(counts)) 
Output: 5118 40776

Con la ayuda de las funciones que creamos, llegamos a saber que hay 5118 palabras únicas en la versión en inglés de Romeo y Julieta y la suma de la frecuencia de las palabras únicas suma 40776. Podemos saber qué palabra ocurrió más en el libro y puede jugar con diferentes versiones de libros, de diferentes idiomas para conocerlos y sus estadísticas con la ayuda de las funciones anteriores. 
 

Trazado de las características características de los libros

Vamos a graficar, (i) Longitud del libro Vs Número de palabras únicas para todos los libros de diferentes idiomas usando matplotlib . Importaremos pandas para crear un marco de datos de pandas, que contendrá información sobre libros como columnas. Clasificaremos estas columnas por diferentes categorías como: «idioma», «autor», «título», «longitud» y «único». Para trazar la longitud del libro a lo largo del eje x y el número de palabras únicas a lo largo del eje y, codificamos: 
 

Python3

import os 
import pandas as pd 
  
book_dir = "./Books"
os.listdir(book_dir) 
  
stats = pd.DataFrame(columns =("language",
                               "author",
                               "title",
                               "length",
                               "unique")) 
  
# check >>>stats 
title_num = 1
for language in os.listdir(book_dir): 
    for author in os.listdir(book_dir+"/"+language): 
        for title in os.listdir(book_dir+"/"+language+"/"+author):
              
            inputfile = book_dir+"/"+language+"/"+author+"/"+title 
            print(inputfile) 
            text = read_book(inputfile) 
            (num_unique, counts) = word_stats(count_words_fast(text)) 
            stats.loc[title_num]= language,
            author.capitalize(),
            title.replace(".txt", ""), 
            sum(counts), num_unique 
            title_num+= 1
import matplotlib.pyplot as plt 
plt.plot(stats.length, stats.unique, "bo-") 
  
plt.loglog(stats.length, stats.unique, "ro") 
  
stats[stats.language =="English"] #to check information on english books 
      
plt.figure(figsize =(10, 10)) 
subset = stats[stats.language =="English"] 
plt.loglog(subset.length,
           subset.unique,
           "o",
           label ="English",
           color ="crimson") 
  
subset = stats[stats.language =="French"] 
plt.loglog(subset.length,
           subset.unique,
           "o",
           label ="French",
           color ="forestgreen") 
  
subset = stats[stats.language =="German"] 
plt.loglog(subset.length,
           subset.unique,
           "o",
           label ="German",
           color ="orange") 
  
subset = stats[stats.language =="Portuguese"] 
plt.loglog(subset.length,
           subset.unique,
           "o",
           label ="Portuguese",
           color ="blueviolet") 
  
plt.legend() 
plt.xlabel("Book Length") 
plt.ylabel("Number of Unique words") 
plt.savefig("fig.pdf") 
plt.show() 

Resultado: Trazamos dos gráficos, el primero que representa cada libro de diferente idioma y autor simplemente como un libro. Los puntos rojos en el primer gráfico representan un solo libro y están conectados por líneas azules. El gráfico logarítmico crea puntos discretos [rojo aquí] y el gráfico lineal crea curvas lineales [azul aquí], uniendo los puntos. El segundo gráfico es un gráfico logarítmico que muestra libros de diferentes idiomas con diferentes colores [rojo para inglés, verde para francés, etc.] como puntos discretos. 
Estos gráficos ayudan a analizar hechos visualmente sobre diferentes libros de origen vívido. A partir del gráfico, llegamos a saber que los libros en portugués son más extensos y tienen una mayor cantidad de palabras únicas que los libros en alemán o inglés. Graficar tales datos demuestra ser de gran ayuda para los lingüistas.
 

Referencia: 
 

Este artículo es una contribución de Amartya Ranjan Saikia . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *