In [1]:
import re
import nltk
from prep import helpers
Desde el punto de vista de el analisis de datos, el texto es un desorden. Las técnicas de analisis desde la más sencilla hasta la más avanzada esperan trabajar con datos de entrada con formato bien definido y fijo.
La minería de texto es la colección de métodos, algoritmos y prácticas utilizadas para ordenar este desorden y poder realizar análisis sobre grandes cuerpos de texto.
Procesamiento de Lenguaje Natural o Natural Language Processing es un área de las ciencas computacionales que se ocupa de la interacción entre las computadoras y el lenguaje humano (natural).
Text Mining depende de muchas de las herramientas de NLP, de hecho en los ejemplos estaremos usando la librería NLTK - Natural Language ToolKit. Dos ejemplos famosos de NLP son: chatbots y Siri
La codificación de caracteres determina cómo se convierten los bits en caracteres legibles y viceversa.
Lamentablemente, no siempre se sabe esto. Pero, se puede adivinar con mucho exito y se puede convertir de una codificación a otra.
Esto le puede pasar a usted si procesa texto con la codificación de caracteres (character encoding) equivocada:
StackOverflow al rescate: https://stackoverflow.com/questions/64860/best-way-to-convert-text-files-between-character-sets. En resumen: herramientas de línea de comando (*nix y Windows)
También su librería de R/Python para la manipulación de datos (tidyverse/Pandas) le permite especificar la codificación tanto de lectura como de escritura.
Si algún día se ve en la necesidad de adivinar, empiece por aquí: https://readr.tidyverse.org/reference/encoding.html
En esencia las expresiones regulares permiten:
In [2]:
# Funcion para quitar todo el texto que este entre parentesis,
# lo que no sea letras y sustituir series de espacios en blanco por uno solo
def cleanup_str(raw):
rs = re.sub("\\(.*?\\)|[^a-zA-Z\\s]"," ",raw)
rs = re.sub("\\s+"," ",rs).strip().lower()
return rs
my_str = """
Some people, when confronted with a problem, think
“I know, I'll use regular expressions.” Now they have two problems.
-- Jamie Zawinsk (Usenet) 1997 o fue 1999??
"""
print(cleanup_str(my_str))
Visite https://regexr.com/ para aprender y practicar. Pero, recuerde:
Las expresiones regulares son una herramienta extremadamente poderosa, uselas con moderación y cuidado
In [3]:
nltk.word_tokenize("conceptos fundamentales de mineria de texto")
Out[3]:
In [4]:
helpers.get_bigrams(nltk.word_tokenize("conceptos fundamentales de mineria de texto"))
Out[4]:
In [5]:
helpers.remove_stopwords("This is not the stopword")
Out[5]:
In [6]:
helpers.stem("natural language processing and text mining")
Out[6]:
La formula más comun de TF-IDF:
$$tfidf(t,d,D) = f_{t,d} * \log \frac{N}{n_t}$$donde:
$t =$ termino, token o palabra
$d =$ documento
$f_{t,d} =$ term frequency del termino t en el documento d
$D =$ corpus
$N =$ cantidad de documentos (tamaño del corpus)
$n_t =$ cantidad de documentos donde aparece el termino $t$
Con tan solo convertir un corpus a una de estas dos representaciones se pueden responder preguntas interesantes, como:
Se les ocurren otras?
Habiendolos representado como vectores (BoW o TF-IDF) podemos compararlos directamente en relación de los terminos que los componen con una simple distancia entre dos vectores:
Con lo descrito hasta ahora tenemos los elementos necesarios para un buscador rudimentario: