Dicionário Habra. Parte 1

Amigos, boa tarde.


Resolvi o problema de compilar o dicionário Habrahabr com o objetivo de rastrear o surgimento de novas linguagens, estruturas, práticas de gerenciamento etc. Em suma, novas palavras.


O resultado foi uma lista de palavras em inglês "no caso nominativo e singular".


Ele fez isso no ambiente Windows 10 x64, usou a linguagem Python 3 no editor Spyder no Anaconda 5.1.0 e usou uma conexão de rede com fio.


Neste artigo, recebo um dicionário de palavras em inglês em uma amostra limitada. Se o tópico for interessante, no futuro planejo obter um dicionário de palavras em inglês e russo em uma seleção completa dos artigos de Habr. Com o idioma russo, tudo é mais complicado.


Processo de análise


Peguei o disco daqui . Abaixo está o código para minha versão do analisador.


Para coletar o dicionário de Habr, você precisa ignorar os artigos dele e selecionar o texto deles. Não processei a meta-informação dos artigos. Os artigos sobre Habré têm meu "número", como https://habr.com/post/346198/ . A enumeração de artigos pode ser feita de 0 a 354366, este foi o último artigo na época do projeto.


Para cada edição, tentamos obter uma página html e, quando isso ocorre, extraímos o título e o texto do artigo da estrutura html. O código de desvio é o seguinte:


import pandas as pd import requests from bs4 import BeautifulSoup dataset = pd.DataFrame() for pid in range(350000,354366): r = requests.get('https://habrahabr.ru/post/' +str(pid) + '/') soup = BeautifulSoup(r.text, 'html5lib') if soup.find("span", {"class": "post__title-text"}): title = soup.find("span", {"class": "post__title-text"}).text text = soup.find("div", {"class": "post__text"}).text my_series = pd.Series([pid, title, text], index=['id', 'title', 'text']) df_new = pd.DataFrame(my_series).transpose() dataset = dataset.append(df_new, ignore_index = True) 

Empiricamente estabelecido que os artigos em si são menos de três vezes o número. Treinei em números 4366 - é o quanto meu sistema carrega em meia hora.


Não fiz a otimização da velocidade, embora eles digam que, se você começar a processar em 100 threads, será muito mais rápido.


Salvei o resultado no disco


 dataset.to_excel(directory+'dataset.xlsx', sheet_name='sheet1', index=False) 

- para não repetir o download lento da Internet. O arquivo acabou tendo 10 megabytes de tamanho.


Eu estava interessado nos nomes em inglês dos instrumentos. Não precisava de termos de formas diferentes, queria obter imediatamente formas normais de palavras. É claro que as palavras mais comuns são "in", "on" e "by", nós as removemos. Para normalizar o dicionário, usei o English Stimmer Porter da biblioteca ntlk.


Eu usei o método indireto para criar uma lista de palavras do dicionário, consulte o código começando com "from sklearn.feature_extraction.text import CountVectorizer". Eu vou precisar disso mais tarde.


 import re import nltk nltk.download('stopwords') from nltk.corpus import stopwords from nltk.stem.porter import PorterStemmer corpus = [] for i in range(0, len(dataset.index)): review = re.sub('[^a-zA-Z]', ' ', dataset['text'][i]) review = review.lower() review = review.split() ps = PorterStemmer() review = [ps.stem(word) for word in review if not word in set(stopwords.words('english'))] review = ' '.join(review) corpus.append(review) from sklearn.feature_extraction.text import CountVectorizer cv = CountVectorizer() X = cv.fit_transform(corpus).toarray() names = cv.get_feature_names() dfnames = pd.DataFrame(names).transpose() dfnames.to_excel(directory+'names.xlsx', sheet_name='sheet1', index=False) 

O objeto de nomes é o dicionário que você está procurando. Nós o salvamos no disco.


Visão geral dos resultados


Foram mais de 30 mil peças de palavras já normalizadas. E estes são apenas 4366 números e palavras de artigos somente em inglês.


Do interessante:


  1. Os autores do artigo usam muitas "palavras" estranhas, por exemplo: aaaaaaaaaaaaa, aaaabbbbccccdddd ou zzzhoditqxfpqbcwr


  2. Do objeto X, obtemos as 10 principais palavras em inglês mais populares em nossa amostra:

Word pc
iter 4133
op 4030
retorno 2866
ns 2834
id 2740
nome 2556
novo 2410
dados 2381
corda 2358
http 2304

Source: https://habr.com/ru/post/pt413223/


All Articles