<jupyter_start><jupyter_text>Mineria de Texto  *Una brevísima introducción*  Minería de Texto: una brevísima introducción* Qué es?* Y qué se hace con eso?* Qué no es?* Más o menos, cómo funciona?  Minería de Texto: una brevísima introducción* Temás prácticos: * Fuentes de texto * Datos estructurados, semi-estructurados y no estructurados * Mojibake! * RegEx: Cómo resolver un problema con _otro_ problema  Minería de Texto: una brevísima introducción* Conceptos fundamentales* Representación del texto para análisis * bag of words * tf-idf* Similaridad entre documentos  Qué es _Minería de Texto_?Destilar conocimiento a partir del textoDesde 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.  Y qué se hace con eso?* Búsqueda (Information Retrieval)* Clasificación de texto (SPAM! SPAM!)* Modelado de tópicos (temas)* Clustering* Analisis de sentimiento* etc... etc... etc...  Qué *no* es _Minería 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*](http://www.nltk.org/). Dos ejemplos famosos de NLP son: _chatbots y Siri_  Más o menos, cómo funciona?      Temas prácticos - Fuentes de texto* Redes sociales (tweets, posts)* Articulos, libros, periódicos* Bases de datos* ...  Temas Prácticos - Tipos de datos como fuentes de texto      Temas Prácticos - Codificación de caracteres (encodings, encodings)La codificación de caracteres determina cómo se convierten los bits en caracteres legibles y viceversa.    Se hace vital conocer la codificación usada durante la creación de un documento para poder incluirlo en un proceso de _minería de texto_.Lamentablemente, no siempre se sabe esto. Pero, se puede _adivinar_ con mucho exito y se puede convertir de una codificación a otra.  Temas Prácticos - Mojibakeeeee???          Esto le puede pasar a usted si procesa texto con la codificación de caracteres (_character encoding_) equivocada:       Cómo salgo de un lío mojibake?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  Temas Prácticos - RegEx Cómo resolver un problema con [_otro_](http://regex.info/blog/2006-09-15/247) problemaEn esencia las expresiones regulares permiten:* Encontrar instancias de un término* ...Aún cuando este escrito de formas ligeramente diferentes cada vez* Convertirlo en otra cosa* Convertir frases enteras en otras* Hacer cambios a un documento de una sola vez* ... lograr que estos cambios sean consistente y repetibles a otros documentos  Temas Prácticos - RegEx: Ejemplo<jupyter_code># 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.
    -- <NAME> (Usenet) 1997   o fue 1999??
"""

print(cleanup_str(my_str))<jupyter_output>some people when confronted with a problem think i know i ll use regular expressions now they have two problems <NAME> o fue<jupyter_text>Visite https://regexr.com/ para aprender y practicar. Pero, recuerde:Las expresiones regulares son una herramienta extremadamente poderosa, **uselas con moderación y cuidado**  Conceptos Fundamentales de _Mineria de Texto_  Documento  Unidad mínima de texto sobre la cual se quiere realizar analisis, inferencias y responder preguntas  Corpus  Conjunto de documentos que será minado (piense _training data_)  Conceptos Fundamentales de _Mineria de Texto_  Token  Serie de caracteres de texto con significado propio, resultante de dividir un documento por un _separador_: tipicamente palabras.  Separador  Serie de caraceteres utilizadas para dividir un documento en _tokens_: tipicamente _whitespace_ ( )<jupyter_code>nltk.word_tokenize("conceptos fundamentales de mineria de texto")<jupyter_output><empty_output><jupyter_text>Conceptos Fundamentales de _Mineria de Texto_  Vocabulario  Conjunto de todos los tokens presentes en un _corpus_    n-gram  Secuencia continua de una o más partes de un documento, tipicamente tokens<jupyter_code>helpers.get_bigrams(nltk.word_tokenize("conceptos fundamentales de mineria de texto"))<jupyter_output><empty_output><jupyter_text>Conceptos Fundamentales de _Mineria de Texto_  Stopwords  Palabras en un idioma particular que pueden eliminarse de los documentos durante preprocesamiento (palabras muy comunes, preposiciones, etc.)    Stemming  Proceso de extracción y sustitución de palabras por su _"raíz"_<jupyter_code>helpers.remove_stopwords("This is not the stopword")
helpers.stem("natural language processing and text mining")<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.06404199475065617, 'fraction_numerical': 0.004199475065616798, 'mean_word_length': 5.100320170757738, 'pattern_counts': {'":': 0, '<': 18, '<?xml version=': 0, '>': 18, 'https://': 3, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '642091', 'license': 'MIT', 'n_tokens_mistral': 1853, 'n_tokens_neox': 1825, 'n_words': 722, 'path': 'intro_text_mining/notebooks/Text Mining.ipynb', 'repo_name': 'pyrdr/charlas', 'size': '5729'}