Друзья, добрый день.
Решал задачу составления словаря Хабрахабра для целей отслеживания появления новых языков, фреймворков, практик управления и т.п. Короче новых слов.
Результатом стал список английских слов «в именительном падеже и единственном числе».
Делал в окружении 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
Комментарии (2)
Samouvazhektra
04.06.2018 23:37++ Это слова из кода. Для нормализации русских pymorphy2 можно использовать
Непосредственно для создания списка слов словаря использовал немного непрямой способ, см. код, начиная с «from sklearn.feature_extraction.text import CountVectorizer». Это мне понадобиться позже.
Как раз самое интересное и не раскрыли — что делают и как работают эти самые строки. Получилась статья о том как распарсить хабр
Subrisk
Начало норм, но для Хабра, конечно, русский в разы актуальнее. А английские слова содержатся, скорее всего, во фрагментах кода.