Los libros de dominio público son un gran recurso para generar un pequeño corpus del español gracias a la variedad de los textos. En este artículo os explicamos cómo generarlo de una manera muy sencilla a partir de los documentos indexados en la web de textos.info.
En textos.info hay más de 4000 libros disponibles para leer y/o descargar. Desde clásicos como "La Ilíada", "La Biblia" o "El Quijote" a libros más "modernos" (comienzos del s.XX) como son "Poeta en Nueva York", "Niebla" o "La Metamorfosis".
Requisitos
- Python 3.8 - Todos los ejemplos que usan python se han ejecutado con esta versión.
- PyEnv o Conda - Recomendamos el uso de alguna de estas herramientas para la gestión de versiones de Python y los entornos virtuales.
- Pandoc 2.14 - Herramienta que permite convertir entre varios formatos como puede ser de ePub a texto plano.
Requisitos para los scripts de Python
Para que los scripts de Python se ejecuten correctamente es necesario instalar los siguientes paquetes con pip:
Puedes copiar el listado anterior y meterlo en un fichero requirements.txt para instalarlos de golpe. Por ejemplo, supongamos que el directorio de trabajo es "corpuslibros" y el mencionado archivo ya tiene el listado de paquetes:
Con esto quedarían todas las dependencias instaladas. Ahora viene la parte más interesante.
Descarga de libros
Lo primero de todo es descargarnos los libros que tenemos a disposición en textos.info para lo que nos ayudaremos del catálogo OPDS que tienen implementado y este pequeño crawler que se descargará de manera automática todos los libros disponibles:
import urllib.request | |
import httpx | |
import pypandoc | |
import os | |
from bs4 import BeautifulSoup | |
from tqdm import tqdm | |
TITLES = 'https://www.textos.info/titulos.atom' | |
EPUB_DOWNLOAD_DIR = 'textos.info' | |
def get_feed(url): | |
atom_feed = urllib.request.urlopen(url) | |
doc = BeautifulSoup(atom_feed, "xml") | |
return doc | |
def process_titles(entry_header, titles): | |
print(f"Processing '{entry_header}'") | |
for title in tqdm(titles, total=len(titles)): | |
link = title.find('link', {"type": "application/epub+zip"}) | |
url = link.attrs["href"] + "-sin-imagenes" | |
epub_file_name = EPUB_DOWNLOAD_DIR + "/" + title.id.text.split('/')[-1] + ".epub" | |
epub_file_name_txt = EPUB_DOWNLOAD_DIR + "/" + title.id.text.split('/')[-1] + ".txt" | |
if not os.path.exists(epub_file_name_txt): | |
with open(epub_file_name, 'wb') as download_file: | |
with httpx.stream("GET", url, timeout=None) as response: | |
for chunk in response.iter_bytes(): | |
download_file.write(chunk) | |
try: | |
pypandoc.convert_file( | |
epub_file_name, | |
"plain", | |
format="epub", | |
outputfile=epub_file_name_txt, | |
extra_args=["--wrap=none"] | |
) | |
os.remove(epub_file_name) | |
except Exception: | |
pass | |
doc = get_feed(TITLES) | |
titles_index = doc.find_all("entry") | |
titles_batch = [] | |
for entry in titles_index: | |
doc = get_feed(entry.id.text) | |
next_page = doc.find('link', {"title": "Página siguiente"}) | |
titles_batch.extend(doc.find_all("entry")) | |
while next_page: | |
next_page_doc = get_feed(next_page.attrs["href"]) | |
next_page = next_page_doc.find('link', {"title": "Página siguiente"}) | |
next_page_entries = next_page_doc.find_all("entry") | |
titles_batch.extend(next_page_entries) | |
process_titles(entry.title.text, titles_batch) | |
titles_batch = [] |
Puedes descargar el archivo, después de comprobar lo que hace, y ejecutarlo de la siguiente manera:
~/corpuslibros$ python textos_info_donwload.py
Tras un rato tendrás todos los libros descargados en el directorio "textos.info" en formato de texto plano.
Limpieza
#!/usr/bin/env bash | |
RAW_DOCS_DIR=textos.info | |
CLEANED_DOCS_DIR=textos.info_cleaned | |
for f in ./${RAW_DOCS_DIR}/*.txt; do | |
echo $f | |
f_name=`basename $f` | |
START_LINE=$(awk '{if ($0 == "Más textos disponibles en https://www.textos.info/") print NR}' $f) | |
END_LINE=$(awk '/^Otros textos de .*$/ {print NR}' $f) | |
awk -v start="$START_LINE" -v end="$END_LINE" '{if (NR > start && NR < end) print $0}' $f | tr "\n" " " > $CLEANED_DOCS_DIR/$f_name | |
echo "" >> $CLEANED_DOCS_DIR/$f_name | |
done |
- Ocupa ~400MB
- Mas de 4000 libros en español de diferentes temáticas y estilos.
- Contiene 73,9 Millones de palabras
- De los cuales 525.492 son palabras únicas.
Comentarios
Publicar un comentario