Una biblioteca directa que le permite rastrear, limpiar y deduplicar páginas web para crear conjuntos de datos monolingües masivos. Usando esta biblioteca, debería poder crear conjuntos de datos más grandes que el utilizado por OpenAI para GPT-2.
Esta biblioteca usa Python 3.
git clone https://github.com/chiphuyen/lazynlp.git
cd lazynlp
pip3 install -r requirements.txt
pip3 install .Si desea desinstalar la biblioteca, use:
pip3 uninstall lazynlp
Hay varios vertederos principales de URL disponibles que puede usar.
Este es el enlace a todas las presentaciones a Reddit por meses. Puede descargar el volcado y el proceso sin procesar para obtener los enlaces. Tenga en cuenta que cada uno de estos vertederos es enorme (100 MB - 1 GB).
@JCPeterson tiene la amabilidad de proporcionar una lista de enlaces deduplicados con al menos 3 karma que puede descargar aquí.
Hay alrededor de 23 millones de URL entre 2015 y 06 y 2018-10, de las cuales alrededor del 40 al 60 % son URL malas (las URL ya no existen o no son amigables con el raspador). Significa que después de haber descargado y limpiado todas las URL buenas de esto, debe tener aproximadamente 10 m páginas web o 50 GB de texto puro.
Puede descargar la lista de todas las URL a nosotros los libros de Gutenberg aquí. Hay 50k libros, que se convierten en aproximadamente 14 GB de texto puro.
También puede ejecutar lazynlp.get_us_gutenberg_links() para obtener la misma lista. Por ejemplo, si desea obtener todas las URL de Gutenberg y almacenarlo en el archivo us_gutenberg.urls , ejecute el siguiente comando. Esto podría tomar medio día.
lazynlp.get_us_gutenberg_links('us_gutenberg.urls')
Puede descargar la lista de todas las URL a los libros australianos de Gutenberg aquí. Hay 4K libros, que se convierten en aproximadamente 1 GB de texto puro.
También puede ejecutar lazynlp.get_aus_gutenberg_links() para obtener la misma lista. Por ejemplo, si desea obtener todas las URL de Gutenberg y almacenarlo en el archivo aus_gutenberg.urls :
lazynlp.get_aus_gutenberg_links('aus_gutenberg.urls')
Puede descargar los vertederos de Wikipedia aquí.
No desea descargar la misma URL varias veces. Hay dos funciones que lo ayudan a deduplicar todas las URL:
lazynlp.dedup_lines(files, outfold)
Esta función toma una lista de archivos (en cada archivo, cada línea es una URL) y deduplica cada archivo en todos los archivos anteriores. Guarde todos los archivos deduplicados en Outfold.
lazynlp.dedup_lines_from_new_file(original_files, new_file, outfile)
Esta función le permite deduplicar un nuevo archivo en todos los archivos deduplicados previamente (original_files)
Si desea descargar cada página web por separado, llame:
lazynlp.download_page(link, context=None, timeout=None)
Si desea descargar desde un archivo que contiene una lista de URL, llame:
lazynlp.download_pages(link_file, folder, timeout=30, default_skip=True, extensions=[], domains=[])
"""
link_file:
file contains links to webpages to crawl. Each line contains one URL.
folder:
folder that you want to contain your downloaded pages.
timeout:
seconds to wait for a page to respond before abandoning it.
default_skip:
set to True if you want to automatically skip all URLs that contain domains and extensions that are known to be scraper-unfriendly or NSFW.
You can see the list of excluded domains at lazynlp/exclude_domains.txt.
You can see the list of excluded extensions at lazynlp/exclude_extensions.txt
You can also add your own domains and extensions to skip with domains and extensions and arguments.
In the folder:
Each URL is downloaded into a file, indexed by the order in which it is downloaded. The first line of each file is the URL. The rest is the textual content of the page.
index.urls contains all the URLs that have been successfully downloaded.
bad.urls contains the URLs that are bad.
connection.urls contains the URLs that haven't been downloaded because of connection issues.
non_ascii.urls contains the URLs that haven't been downloaded because of bad encoding issues.
empty.urls contains the URLs that have empty textual content.
"""
Si tiene muchas URL, puede dividir la lista en varios archivos y llamar a esta función por separado. Pude ejecutar 40 scripts en paralelo. Supongo que podría haber paralizado el código. Simplemente encontré que esto es más fácil.
Puede deshacerse de todas las etiquetas HTML, decodificar UTF-8 en una cadena, transliterar caracteres extranjeros, colapsar el espacio en blanco, reemplazar caracteres no imprimibles, unescape HTML, etc. Utilizando métodos disponibles en Lazynlp/Cleaner.py.
También puede llamar a la siguiente función para realizar la mayor parte del procesamiento.
lazynlp.clean_page(page)
En esta biblioteca, la función lazynlp.download_pages() realiza tanto la parte de rastreo como la limpieza, por lo que las páginas web que tiene son texto puro, así: como este:
http://www.thecannabist.co/2017/03/02/jeff-sessions-russia-resign-democrats/74687/
Attorney general nominee Sen. Jeff Sessions, R-Ala., testifies on Capitol Hill in Washington on Jan. 10, 2017, in the first day of his confirmation hearing before the Senate Judiciary Committee. Top Democrats now say that because he misled the committee about his visits to Russia, he should resign. (Andrew Harnik, The Associated Press)
House Oversight and Government Reform Committee Chairman Jason Chaffetz, R-Utah, tweeted early Thursday that "AG Sessions should clarify his testimony and recuse himself."
Later, Sen. Rob Portman, R-Ohio, said in a statement, "Jeff Sessions is a former colleague and a friend, but I think it would be best for him and for the country to recuse himself from the DOJ Russia probe."
House Majority Leader Kevin McCarthy, R-Calif., also initially said during an appearance on MSNBC's "Morning Joe" that Sessions should bow out.
Asked whether Sessions should recuse himself in this situation, McCarthy replied "I think the trust of the American people -- you recuse yourself in these situations, yes."
McCarthy was pressed a second time about whether he was calling for Sessions to recuse himself and he confirmed that he believed the situation required a recusal.
"I think it would be easier from that standpoint, yes," McCarthy said.
But McCarthy later said his comment had been misinterpreted, telling Fox News' "Fox and Friends," "I'm not calling on him to recuse himself. I was asked on 'Morning Joe,' if he needs to recuse himself as going forward. As you just heard, Attorney General Sessions said he would recuse himself going forward -- appropriate, and that's all my answer was."
The comments from prominent Republicans follow revelations that Sessions met with the Russian ambassador during election season. Under oath in front of the Senate Judiciary Committee for his confirmation hearing in January, Sessions had said that he had not met with any Russian officials.
Senate Minority Leader Charles Schumer, D-N.Y., joined growing Democratic calls for Sessions to either resign or at least recuse himself from any investigations into Russia's meddling in U.S. elections.
"Attorney General Sessions cannot possibly lead an investigation into Russian interference in our elections or come anywhere near it. With these revelations, he may indeed become the subject of it," Schumer told reporters. "Better for the country if he resigns, but let's get an investigation going."
Because the Department of Justice should be above reproach, for the good of the country, the Attorney General should resign.
Para evitar que cualquier texto esté sobrerrepresentado, solo desea incluir páginas que no se superpongan significativamente con otras páginas.
Para estimar la cantidad de superposición de los archivos de destino con ciertos archivos de origen, use esta función:
lazynlp.estimate_overlap(source_files, target_files, gran='word', n=8, capacity=10000, error_rate=1e-5, header=0, interval=100000)
gran es el granular de los tokens: nivel de 'char' o 'palabra'.
n es el n-gram.
capacity y error_rate son para el BloomFilter utilizado.
header : número de líneas de cada archivo para omitir. Es porque en nuestro formato, la primera línea es la URL
Para estimar la cantidad de superposición de un archivo objetivo con un BloomFilter existente, use esta función:
lazynlp.estimate_overlap_bf(bf, target_file, gran='word', n=8, header=0)
Si se le da una lista de archivos, por ejemplo, páginas web limpias, para filtrar todos los archivos que contienen más que threshold superpuesto con otros archivos, use esta función:
lazynlp.filter_files(files, threshold=0.5, gran='word', n=8, capacity=100000000, error_rate=1e-7, header=0, interval=1000000)
Los nombres de todos los archivos que se consideran duplicados se almacenan en dupped_files.list
Los nombres de todos los archivos utilizados para el conjunto de datos se almacenan en clean_files.list
1 GB de texto es aproximadamente 1B caracteres. Una palabra en inglés tiene en promedio 4.5 caracteres, o 5.5, incluido el espacio en blanco. Entonces 1 GB de texto es de aproximadamente 181 millones de palabras.
Cuando corrí 30 scripts en paralelo, tardó 3 horas en descargar y limpiar 1 GB de texto puro. Por lo tanto, tomaría 5 días obtener 50 GB de texto puro.
El conjunto de datos Operai tiene 40 GB, que estimo para contener aproximadamente 7-8 mil millones de palabras. Si descarga todas las páginas web de los libros de URL y Gutenberg de Good Reddit, debe tener un conjunto de datos más grande que WebText de OpenAI.
Openai, en su artículo para GPT-2, no incluía artículos de Wikipedia por miedo a la superposición. Puede optar por incluir artículos de Wikipedia que tengan menos de una cierta cantidad de superposición con el conjunto de datos existente utilizando lazynlp.estimate_overlap_bf(bf, target_file, gran='word', n=8 .