04.06.2018       Выпуск 233 (04.06.2018 - 10.06.2018)       Статьи

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

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

 

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

Читать>>




Экспериментальная функция:

Ниже вы видите текст статьи по ссылке. По нему можно быстро понять ссылка достойна прочтения или нет

Просим обратить внимание, что текст по ссылке и здесь может не совпадать.

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

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

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

Делал в окружении 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











Лучшая Python рассылка




Разместим вашу рекламу

Пиши: mail@pythondigest.ru

Нашли опечатку?

Выделите фрагмент и отправьте нажатием Ctrl+Enter.

Система Orphus