Pull to refresh

Хабра-словарь. Часть 1

Reading time3 min
Views5K

Друзья, добрый день.


Решал задачу составления словаря Хабрахабра для целей отслеживания появления новых языков, фреймворков, практик управления и т.п. Короче новых слов.


Результатом стал список английских слов «в именительном падеже и единственном числе».


Делал в окружении Windows 10 x64, использовал язык Python 3 в редакторе Spyder в Anaconda 5.1.0, использовал проводное подключение к сети.


В этой статье получаю словарь английский слов на ограниченной выборке. Если тема окажется интересной, то в дальнейшем планирую получить словарь и английских и русских слов на полной выборке статей Хабра. С русским языком всё сложнее.


Процесс парсинга


Болванку взял отсюда. Чуть ниже код моей версии парсера.


Чтобы собрать словарь Хабра, нужно обойти его статьи и выделить из них текст статей. Метаинформацию статей я не обрабатывал. Статьи на Хабре имею свой «номер», как например https://habr.com/post/346198/. Перебор статей можно делал от 0 до 354366, это была последняя статья на момент проекта.


Для каждого номера пытаемся получить html страницу и, когда это удается, то вытаскиваем из структуры html заголовок и текст статьи. Код обхода получился такой:


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)

Опытным путём установил, что самих статей меньше, чем номеров раза в три. Тренировался на 4366 номерах – такое количество моя система загружает за полчаса.


Оптимизацией скорости не занимался, хотя, говорят, что если запустить обработку в 100 потоков, то будет значительно быстрее.


Я сохранил результат на диск


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

– чтобы потом не повторять медленную загрузку из интернета. Файл получился размером 10 мегабайт.


Меня интересовали английские названия инструментов. Термины в разных формах мне были не нужны, хотелось получить сразу нормальные формы слов. Понятно, что чаще всего встречались слова «в», «на» и «по», их убираем. Для нормализации словаря использовал английский Стиммер Портера из библиотеки ntlk.


Непосредственно для создания списка слов словаря использовал немного непрямой способ, см. код, начиная с «from sklearn.feature_extraction.text import CountVectorizer». Это мне понадобиться позже.


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)

Объект names и есть искомый словарь. Мы его сохранили на диске.


Обзор результатов


Получилось больше 30 тысяч штук уже нормализованных слов. И это только 4366 номеров статей и слова только на английском языке.


Из интересного:


  1. Авторы статей используют множество странных «слов», например: aaaaaaaaaaa, aaaabbbbccccdddd или zzzhoditqxfpqbcwr


  2. Из объекта Х получаем Топ-10 самых популярных английских слов нашей выборки:

Слово Шт
iter 4133
op 4030
return 2866
ns 2834
id 2740
name 2556
new 2410
data 2381
string 2358
http 2304

Tags:
Hubs:
Total votes 14: ↑9 and ↓5+4
Comments2

Articles