Dictionnaire Habra. Partie 1

Mes amis, bonjour.


J'ai résolu le problème de la compilation du dictionnaire Habrahabr dans le but de suivre l'émergence de nouveaux langages, cadres, pratiques de gestion, etc. Bref, de nouveaux mots.


Le résultat a été une liste de mots anglais "dans le cas nominatif et au singulier".


Il l'a fait dans l'environnement Windows 10 x64, a utilisé le langage Python 3 dans l'éditeur Spyder dans Anaconda 5.1.0 et a utilisé une connexion réseau filaire.


Dans cet article, je reçois un dictionnaire de mots anglais dans un échantillon limité. Si le sujet s'avère intéressant, je prévois à l'avenir d'obtenir un dictionnaire de mots anglais et russes sur une sélection complète d'articles de Habr. Avec la langue russe, tout est plus compliqué.


Processus d'analyse


J'ai pris le disque d'ici . Voici le code de ma version de l'analyseur.


Pour collecter le dictionnaire Habr, vous devez contourner ses articles et sélectionner le texte des articles à partir d'eux. Je n'ai pas traité les méta-informations des articles. Les articles sur Habré ont mon "numéro", comme https://habr.com/post/346198/ . L'énumération des articles peut se faire de 0 à 354366, c'était le dernier article au moment du projet.


Pour chaque problème, nous essayons d'obtenir une page html et, lorsque cela réussit, nous extrayons le titre et le texte de l'article de la structure html. Le code de contournement est le suivant:


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) 

Empiriquement établi que les articles eux-mêmes sont moins de trois fois le nombre. Je me suis entraîné sur les numéros 4366 - c'est la charge de mon système en une demi-heure.


Je n'ai pas fait d'optimisation de la vitesse, bien qu'ils disent que si vous commencez le traitement dans 100 threads, ce sera beaucoup plus rapide.


J'ai enregistré le résultat sur le disque


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

- afin de ne pas répéter le téléchargement lent depuis Internet. Le fichier s'est avéré être de 10 mégaoctets.


Je m'intéressais aux noms anglais des instruments. Je n'avais pas besoin de termes sous différentes formes, je voulais obtenir immédiatement des formes de mots normales. Il est clair que les mots les plus courants sont «in», «on» et «by», nous les supprimons. Pour normaliser le dictionnaire, j'ai utilisé le Stimmer Porter anglais de la bibliothèque ntlk.


J'ai utilisé la méthode indirecte pour créer une liste de mots du dictionnaire, voir le code commençant par "from sklearn.feature_extraction.text import CountVectorizer". J'en aurai besoin plus tard.


 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) 

L'objet names est le dictionnaire que vous recherchez. Nous l'avons enregistré sur le disque.


Aperçu des résultats


Il s'est avéré plus de 30 000 morceaux de mots déjà normalisés. Et ce ne sont que 4366 numéros d'article et mots en anglais uniquement.


De l'intéressant:


  1. Les auteurs d'articles utilisent beaucoup de «mots» étranges, par exemple: aaaaaaaaaaaa, aaaabbbbccccdddd ou zzzhoditqxfpqbcwr


  2. De l'objet X, nous obtenons le top 10 des mots anglais les plus populaires de notre échantillon:

PC Word
iter 4133
op 4030
retour 2866
ns 2834
id 2740
nom 2556
nouveau 2410
données 2381
chaîne 2358
http 2304

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


All Articles