Друзья, добрый день.
Решал задачу составления словаря Хабрахабра для целей отслеживания появления новых языков, фреймворков, практик управления и т.п. Короче новых слов.
Результатом стал список английских слов «в именительном падеже и единственном числе».
Делал в окружении 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 номеров статей и слова только на английском языке.
Из интересного:
Авторы статей используют множество странных «слов», например: aaaaaaaaaaa, aaaabbbbccccdddd или zzzhoditqxfpqbcwr
- Из объекта Х получаем Топ-10 самых популярных английских слов нашей выборки:
Слово Шт
iter 4133
op 4030
return 2866
ns 2834
id 2740
name 2556
new 2410
data 2381
string 2358
http 2304
