Une bibliothèque simple qui vous permet de ramper, de nettoyer et de déduir des pages Web pour créer des ensembles de données monolingues massifs. En utilisant cette bibliothèque, vous devriez être en mesure de créer des ensembles de données plus grands que celui utilisé par OpenAI pour GPT-2.
Cette bibliothèque utilise Python 3.
git clone https://github.com/chiphuyen/lazynlp.git
cd lazynlp
pip3 install -r requirements.txt
pip3 install .Si vous souhaitez désinstaller la bibliothèque, utilisez:
pip3 uninstall lazynlp
Il existe plusieurs députés majeurs d'URL disponibles que vous pouvez utiliser.
Ceci est le lien vers toutes les soumissions à Reddit par mois. Vous pouvez télécharger le vidage et le processus bruts pour obtenir les liens. Gardez à l'esprit que chacun de ces décharges est énorme (100 Mo - 1 Go).
@jcpeterson a la gentillesse de fournir une liste de liens dédupliqués avec au moins 3 karma que vous pouvez télécharger ici.
Il y a environ 23 millions d'URL entre 2015-06 et 2018-10, dont environ 40 à 60% sont de mauvaises URL (les URL n'existent plus ou ne sont pas conviviales). Cela signifie qu'après avoir téléchargé et nettoyé toutes les bonnes URL de cela, vous devriez avoir environ 10 millions de pages Web ou 50 Go de texte pur.
Vous pouvez télécharger la liste de toutes les URL pour nous Gutenberg Books ici. Il y a 50 000 livres, qui se convertissent en environ 14 Go de texte pur.
Vous pouvez également exécuter lazynlp.get_us_gutenberg_links() pour obtenir la même liste. Par exemple, si vous souhaitez obtenir toutes les URL Gutenberg et le stocker dans le fichier us_gutenberg.urls , exécutez la commande suivante. Cela pourrait prendre une demi-journée.
lazynlp.get_us_gutenberg_links('us_gutenberg.urls')
Vous pouvez télécharger la liste de toutes les URL vers des livres australiens Gutenberg ici. Il y a des livres 4K, qui se convertissent en environ 1 Go de texte pur.
Vous pouvez également exécuter lazynlp.get_aus_gutenberg_links() pour obtenir la même liste. Par exemple, si vous souhaitez obtenir toutes les URL de Gutenberg et le stocker dans le fichier aus_gutenberg.urls :
lazynlp.get_aus_gutenberg_links('aus_gutenberg.urls')
Vous pouvez télécharger les décharges Wikipedia ici.
Vous ne voulez pas télécharger la même URL plusieurs fois. Il existe deux fonctions qui vous aident à dédupliquer toutes les URL:
lazynlp.dedup_lines(files, outfold)
Cette fonction prend une liste de fichiers (dans chaque fichier, chaque ligne est une URL) et déduplique chaque fichier par rapport à tous les fichiers précédents. Enregistrez tous les fichiers dédupliqués dans Outfold.
lazynlp.dedup_lines_from_new_file(original_files, new_file, outfile)
Cette fonction vous permet de dédupliquer un nouveau fichier par rapport à tous les fichiers précédemment dédupliqués (original_files)
Si vous souhaitez télécharger chaque page Web séparément, appelez:
lazynlp.download_page(link, context=None, timeout=None)
Si vous souhaitez télécharger à partir d'un fichier qui contient une liste d'URL, appelez:
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 vous avez beaucoup d'URL, vous pouvez diviser la liste en plusieurs fichiers et appeler cette fonction séparément. J'ai pu exécuter 40 scripts en parallèle. Je suppose que j'aurais pu paralliser le code. Je viens de trouver que cela était plus facile.
Vous pouvez vous débarrasser de toutes les balises HTML, décoder UTF-8 en chaîne, transliterater des caractères étrangers, effondrer l'espace blanc, remplacer des caractères non imprimables, un espace html, etc. en utilisant des méthodes disponibles dans lazynlp / cleaner.py.
Vous pouvez également appeler la fonction suivante pour effectuer la majeure partie du traitement.
lazynlp.clean_page(page)
Dans cette bibliothèque, la fonction lazynlp.download_pages() fait à la fois la partie rampante et nettoyage, de sorte que les pages Web que vous avez sont du texte pur, comme ceci:
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.
Pour éviter que tout morceau de textes soit surreprésenté, vous voulez uniquement inclure des pages qui ne chevauchent pas de manière significative avec d'autres pages.
Pour estimer la quantité de chevauchement des fichiers cibles avec certains fichiers source, utilisez cette fonction:
lazynlp.estimate_overlap(source_files, target_files, gran='word', n=8, capacity=10000, error_rate=1e-5, header=0, interval=100000)
gran est le granulaire des jetons: le niveau «char» ou «mot».
n est le n-gram.
capacity et error_rate sont utilisées pour le FloomFilter utilisé.
header : nombre de lignes de chaque fichier à sauter. C'est parce que dans notre format, la première ligne est l'URL
Pour estimer la quantité de chevauchement d'un fichier cible avec un BloomFilter existant, utilisez cette fonction:
lazynlp.estimate_overlap_bf(bf, target_file, gran='word', n=8, header=0)
Si vous donnez une liste de fichiers, par exemple, les pages Web nettoyées, pour filtrer tous les fichiers qui contiennent plus que le chevauchement threshold avec d'autres fichiers, utilisez cette fonction:
lazynlp.filter_files(files, threshold=0.5, gran='word', n=8, capacity=100000000, error_rate=1e-7, header=0, interval=1000000)
Les noms de tous les fichiers considérés comme dupliqués sont stockés dans dupped_files.list
Les noms de tous les fichiers utilisés pour l'ensemble de données sont stockés dans clean_files.list
1 Go de texte est d'environ 1b caractères. Un mot anglais a en moyenne 4,5 caractères, ou 5,5, y compris les espaces blancs. Donc, 1 Go de texte est d'environ 181 millions de mots.
Lorsque j'ai exécuté 30 scripts en parallèle, il a fallu 3 heures pour télécharger et nettoyer 1 Go de texte pur. Il faudrait donc 5 jours pour obtenir 50 Go de texte pur.
L'ensemble de données OpenAI a 40 Go, que j'estime contenir environ 7 à 8 milliards de mots. Si vous téléchargez toutes les pages Web à partir des Good Reddit URL et Gutenberg Books, vous devriez avoir un ensemble de données plus grand que le WebText d'Openai.
Openai, dans leur article pour GPT-2, n'incluait pas les articles Wikipedia par peur de se chevaucher. Vous pouvez choisir d'inclure des articles Wikipedia qui ont moins d'une certaine quantité de chevauchement avec l'ensemble de données existant à l'aide de lazynlp.estimate_overlap_bf(bf, target_file, gran='word', n=8 .