Uma biblioteca direta que permite rastejar, limpar e desduplicar as páginas da web para criar conjuntos de dados monolíngues maciços. Usando esta biblioteca, você poderá criar conjuntos de dados maiores que os usados pelo OpenAI para GPT-2.
Esta biblioteca usa o Python 3.
git clone https://github.com/chiphuyen/lazynlp.git
cd lazynlp
pip3 install -r requirements.txt
pip3 install .Se você deseja desinstalar a biblioteca, use:
pip3 uninstall lazynlp
Existem vários grandes despejos de URLs disponíveis que você pode usar.
Este é o link para todos os envios ao Reddit por meses. Você pode baixar o despejo e o processo bruto para obter os links. Lembre -se de que cada um desses lixões é enorme (100 MB - 1 GB).
@JCPeterson é gentil o suficiente para fornecer uma lista de links desduplicados com pelo menos 3 karma que você pode baixar aqui.
Existem cerca de 23 milhões de URLs entre 2015 e 2018 e 2018-10, dos quais cerca de 40 e 60 % são URLs ruins (os URLs não existem mais ou não são favoráveis ao raspador). Isso significa que, depois de baixar e limpar todos os URLs bons, você deve ter aproximadamente 10 milhões de páginas da Web ou 50 GB de texto puro.
Você pode baixar a lista de todos os URLs para nós, Gutenberg, livros aqui. Existem 50 mil livros, que se convertem para cerca de 14 GB de texto puro.
Você também pode executar lazynlp.get_us_gutenberg_links() para obter a mesma lista. Por exemplo, se você deseja obter todos os URLs do Gutenberg e armazená -lo no arquivo us_gutenberg.urls , execute o seguinte comando. Isso pode levar meio dia.
lazynlp.get_us_gutenberg_links('us_gutenberg.urls')
Você pode baixar a lista de todos os URLs para os livros australianos da Gutenberg aqui. Existem livros 4K, que se convertem para cerca de 1 GB de texto puro.
Você também pode executar lazynlp.get_aus_gutenberg_links() para obter a mesma lista. Por exemplo, se você deseja obter todos os URLs do Gutenberg e armazená -lo no arquivo aus_gutenberg.urls :
lazynlp.get_aus_gutenberg_links('aus_gutenberg.urls')
Você pode baixar os dumps da Wikipedia aqui.
Você não deseja baixar o mesmo URL várias vezes. Existem duas funções que ajudam a desduplicar todos os URLs:
lazynlp.dedup_lines(files, outfold)
Essa função recebe uma lista de arquivos (em cada arquivo, cada linha é um URLS) e desduplique cada arquivo em todos os arquivos anteriores. Salve todos os arquivos desduplicados no Outfold.
lazynlp.dedup_lines_from_new_file(original_files, new_file, outfile)
Esta função permite que você deduza um novo arquivo contra todos os arquivos deduplicados anteriormente (Original_files)
Se você deseja baixar cada página da web separadamente, ligue para:
lazynlp.download_page(link, context=None, timeout=None)
Se você deseja baixar de um arquivo que contém uma lista de URLs, ligue para:
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.
"""
Se você tiver muitos URLs, poderá dividir a lista em vários arquivos e chamar essa função separadamente. Consegui executar 40 scripts em paralelo. Eu acho que poderia ter paralizado o código. Achei que isso é mais fácil.
Você pode se livrar de todas as tags HTML, decodificar UTF-8 em string, transliterar caracteres estrangeiros, colapsar o espaço em branco, substituir caracteres não imprimíveis, html unescape, etc. usando os métodos disponíveis no lazynlp/limpador.py.
Você também pode chamar a seguinte função para fazer a maior parte do processamento.
lazynlp.clean_page(page)
Nesta biblioteca, a função lazynlp.download_pages() faz a parte rastreadora e de limpeza; portanto, as páginas da web que você tem são texto puro, assim:
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 qualquer texto seja super-representado, você deseja incluir apenas páginas que não se sobrepõem significativamente a outras páginas.
Para estimar a quantidade de sobreposição de arquivos de destino com determinados arquivos de origem, use esta função:
lazynlp.estimate_overlap(source_files, target_files, gran='word', n=8, capacity=10000, error_rate=1e-5, header=0, interval=100000)
gran é o granular dos tokens: 'Char' ou 'Word' nível.
n é o n-grama.
capacity e error_rate são para o BloomFilter usado.
header : Número de linhas de cada arquivo para pular. É porque em nosso formato, a primeira linha é o URL
Para estimar a quantidade de sobreposição de um arquivo de destino com um BloomFilter existente, use esta função:
lazynlp.estimate_overlap_bf(bf, target_file, gran='word', n=8, header=0)
Se tiver uma lista de arquivos, por exemplo, páginas da web limpas, para filtrar todos os arquivos que contêm mais do que threshold sobrepostos a outros arquivos, use esta função:
lazynlp.filter_files(files, threshold=0.5, gran='word', n=8, capacity=100000000, error_rate=1e-7, header=0, interval=1000000)
Os nomes de todos os arquivos que são considerados duplicados são armazenados em dupped_files.list
Os nomes de todos os arquivos usados para o conjunto de dados são armazenados em clean_files.list
1 GB de texto é de cerca de 1b de caracteres. Uma palavra em inglês tem em média 4,5 caracteres, ou 5,5, incluindo espaço em branco. Portanto, 1 GB de texto é de cerca de 181 milhões de palavras.
Quando corri 30 scripts em paralelo, levou 3 horas para baixar e limpar 1 GB de texto puro. Então, levaria 5 dias para obter 50 GB de texto puro.
O conjunto de dados do OpenAI possui 40 GB, que eu estimo em conter cerca de 7-8 bilhões de palavras. Se você baixar todas as páginas da web dos bons URLs do Reddit e dos livros Gutenberg, você deve ter um conjunto de dados maior que o WebText do OpenAI.
O Openai, em seu artigo para o GPT-2, não incluiu artigos da Wikipedia por medo de se sobrepor. Você pode optar por incluir artigos da Wikipedia que tenham menos de uma certa quantidade de sobreposição ao conjunto de dados existente usando lazynlp.estimate_overlap_bf(bf, target_file, gran='word', n=8 .