{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Obtener conjuntos de datos para NLP\n", "===============================" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
PRECAUCIÓN 😱: El tema presentado en esta sección está clasificado como avanzado. El entendimiento de este contenido es totalmente opcional.
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Introducción\n", "------------\n", "\n", "Obtener un conjunto de datos para tareas de NLP puede ser un tarea compleja dependiendo del problema a realizar. Muchas compañias tienen políticas de adquisición de datos específicas para resolver problemas complejos o muy de nicho. Sin embargo, en muchos casos, la información que necesitamos está disponible, solo que en el formato incorrecto.\n", "\n", "Veamos algunas de las formas que tenemos para automatizar la extracción de datos de diferentes origenes:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Extraer texto de imágenes o escaneos" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Podemos extraer texto de imagenes aplicandole técnicas de OCR a las mismas. Esta técnica puede ofrecer resultados muy variados dependiendo de la librería o servicio que se utiliza. Proveedores de nube como Google, Microsoft y Amazon AWS ofrecen servicios de OCR de alta performance utilizando modelos del estado-del-arte.\n", "\n", "Sin embargo, podemos obtener resultados aceptables utilizando librerias en Python, como `pytesseract`. Puede instalar esta libreria siguiendo la guía de instalación en la página del autor: https://github.com/madmaze/pytesseract. Los pasos de instalación dependen del sistema operativo que utilice.\n", "\n", "En ubuntu:\n", "\n", "```\n", "sudo apt-get install python3-pil tesseract-ocr libtesseract-dev tesseract-ocr-eng tesseract-ocr-script-latn\n", "pip install pytesseract\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "!sudo apt install python3-pil tesseract-ocr libtesseract-dev tesseract-ocr-eng tesseract-ocr-script-latn\n", "!pip install pytesseract" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Descargamos un modelo para la librería `pytesseract` en español:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "!mkdir -p ./Models/tessdata\n", "!wget https://github.com/tesseract-ocr/tessdata/raw/main/spa.traineddata \\\n", " --quiet --no-clobber --directory-prefix ./Models/tessdata" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Configuramos `pytesseract` para buscar el modelo que descargamos" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "env: TESSDATA_PREFIX=Models/tessdata\n" ] } ], "source": [ "%env TESSDATA_PREFIX=Models/tessdata" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para probar el funcionamiento de esta librería, descargaremos una imagen de internet que tiene texto en español:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "!wget https://s2.favim.com/orig/151226/frases-en-espanol-textos-en-espanol-Favim.com-3808330.jpg -O sample.jpg --quiet" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\"sample.png\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Utilicemos la librería `pytesseract` para extraer el texto desde este documento:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Por esto no tengo novio:\n", "\n", "No tengo ganas de pensar en\n", "alguien todo el dia. No tengo ganas\n", "de enojarme por que no me\n", "contesta los mensajes, no tengo\n", "ganas de encelarme. No tengo\n", "ganas de privarme de cosas por\n", "alguien. No tengo ganas de dejar\n", "amistades. No tengo ganas de\n", "tener tiempo para una persona. No\n", "tengo ganas de ser cursi. No tengo\n", "ganas de dar explicaciones. No\n", "tengo ganas de llorar por una\n", "pelea. No tengo las mas minimas\n", "ganas de enamorarme.\n", "\f\n", "\n", "\n" ] } ], "source": [ "from PIL import Image\n", "from pytesseract import image_to_string\n", "\n", "filename = \"sample.jpg\"\n", "text = image_to_string(Image.open(filename), lang='spa')\n", "print(text)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La misma técnica puede utilizarce con archivos PDF" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Extraer texto desde la web\n", "---------------------------------" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Utilizando la libería `BeautifulSoap`:\n", "\n", "```\n", "pip install bs4\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Obtenemos la URL de donde queremos extraer el texto, en este caso son noticias de Google News para Argentina en la categoría Ciencia y Tecnología:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "url = \"https://news.google.com/topics/CAAqLQgKIidDQkFTRndvSkwyMHZNR1ptZHpWbUVnWmxjeTAwTVRrYUFrRlNLQUFQAQ?hl=es-419&gl=AR&ceid=AR%3Aes-419\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Obtenemos el texto:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "import requests \n", "\n", "req = requests.get(url)\n", "web_content = req.text" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Extraemos los diferentes títulares. Noten que para hacerlo, debemos indicar la **clase** del objeto HTML `` que representa los vínculos a las diferentes noticias. En este caso este valor es \"VDXfx\". Para saber cual es este valor, puede utilizar la herramienta de desarrolladores de su navegador. En general, accede a la misma con la opción `F12`:\n", "\n", "" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "from bs4 import BeautifulSoup\n", "\n", "soup = BeautifulSoup(web_content,'html.parser')\n", "title = soup.find_all('a', class_='VDXfz')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Obtenemos el link a la primera noticia:" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "first_art_link = title[0]['href'].replace('.','https://news.google.com', 1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Obtenemos el contenido de la primera noticia:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "art_request = requests.get(first_art_link)\n", "art_request.encoding='utf8'\n", "\n", "soup_art = BeautifulSoup(art_request.text,'html.parser')\n", "art_content = soup_art.find_all('p')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Obtenemos todo el texto de la noticia:" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['El pasado 14 de septiembre Apple presentó la nueva generación de su smartphone, el iPhone 13, y aunque no se esperaba un cambio al respecto (al menos no este año), para muchos fue una sorpresa ver que seguía ahí el notch, esa muesca, pestaña, ceja o como quieran llamarla en la parte superior de la pantalla. ¿Cómo puede ser posible en pleno año 2021?', 'Bueno, parece que afortunadamente Apple comenzará a deshacerse del notch el próximo año 2022. Así lo ha asegurado Ming-Chi Kuo, uno de los analistas más conocidos y relevantes en materia de Apple y sus productos. Sin embargo, no serán todos los modelos de iPhone los que por fin se librarán de esa franja negra en sus pantallas, solo los modelos “Pro” y “Pro Max”. Dicho de otro modo, el que por ahora llamaremos iPhone 14 en su versión base o estándar, seguirá teniendo notch.', 'La primera vez que vimos al notch en un iPhone fue en el año 2017, cuando llegó el iPhone X y generación en la que Apple se deshizo del botón de inicio o Home en sus iPhones más actuales, reemplazando el sistema Touch ID (lector de huellas dactilares) por el sistema Face ID que, según la compañía, utiliza una serie de sensores que se encuentran en ese notch. Ahora, 4 años después, el notch ha reducido mínimamente su tamaño, pero sigue ahí y Face ID sigue siendo el método de seguridad por defecto en el iPhone, incluso tras más de un año de muchos usando mascarillas y sin poder desbloquear sus iPhones.', 'Se espera que Apple vuelva a ofrecer Touch ID en modelos futuros del iPhone, ubicando el lector de huellas directamente debajo de la pantalla, pero para eso tendremos que esperar un poco más, posiblemente hasta 2023. Mientras tanto, al menos los próximos iPhone de gama más alta ya no tendrán ese horrible notch sino que lo reemplazarán por un pequeño agujero en la pantalla para la cámara. Esto es, por ahora, solo una filtración, pero una que tarde o temprano se cumplirá sin lugar a dudas. La pregunta es si realmente el notch comenzará a desaparecer en 2022. Ojalá. [vía 9to5Mac]']\n" ] } ], "source": [ "art_texts = [p.text for p in art_content]\n", "print(art_texts)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.8.10 64-bit", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" }, "vscode": { "interpreter": { "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6" } }, "nbsphinx": { "execute": "never" } }, "nbformat": 4, "nbformat_minor": 2 }