Amigos, buenas tardes.
Resolví el problema de compilar el diccionario Habrahabr con el fin de rastrear la aparición de nuevos lenguajes, marcos, prácticas de gestión, etc. En resumen, nuevas palabras.
El resultado fue una lista de palabras en inglés "en el caso nominativo y singular".
Lo hizo en el entorno Windows 10 x64, usó el lenguaje Python 3 en el editor Spyder en Anaconda 5.1.0 y usó una conexión de red cableada.
En este artículo, obtengo un diccionario de palabras en inglés en una muestra limitada. Si el tema resulta interesante, en el futuro planeo obtener un diccionario de palabras en inglés y ruso en una selección completa de los artículos de Habr. Con el idioma ruso, todo es más complicado.
Proceso de análisis
Tomé el disco de aquí . A continuación se muestra el código para mi versión del analizador.
Para recopilar el diccionario de Habr, debe omitir sus artículos y seleccionar el texto de los artículos de ellos. No procesé la metainformación de los artículos. Los artículos sobre Habré tienen mi "número", como https://habr.com/post/346198/ . La enumeración de los artículos se puede hacer de 0 a 354366, este fue el último artículo en el momento del proyecto.
Para cada número, intentamos obtener una página html y, cuando esto tiene éxito, extraemos el título y el texto del artículo de la estructura html. El código de omisión es el siguiente:
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)
Empíricamente establecido que los artículos en sí son menos de tres veces el número. Me entrené en 4366 números: esta es la cantidad que carga mi sistema en media hora.
No hice la optimización de velocidad, aunque dicen que si comienzas a procesar en 100 subprocesos, será mucho más rápido.
Guarde el resultado en el disco
dataset.to_excel(directory+'dataset.xlsx', sheet_name='sheet1', index=False)
- para no repetir la descarga lenta de Internet. El archivo resultó ser de 10 megabytes de tamaño.
Estaba interesado en los nombres ingleses de los instrumentos. No necesitaba términos en diferentes formas, quería obtener inmediatamente formas normales de palabras. Está claro que las palabras más comunes son "in", "on" y "by", las eliminamos. Para normalizar el diccionario, utilicé el Inglés Stimmer Porter de la biblioteca ntlk.
Utilicé el método indirecto para crear una lista de palabras del diccionario, ver el código que comienza con "from sklearn.feature_extraction.text import CountVectorizer". Necesitaré esto más tarde.
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)
El objeto de nombres es el diccionario que está buscando. Lo guardamos en el disco.
Resumen de resultados
Resultó más de 30 mil piezas de palabras ya normalizadas. Y estos son solo 4366 números de artículos y palabras en inglés solamente.
De lo interesante:
Los autores de artículos usan muchas "palabras" extrañas, por ejemplo: aaaaaaaaaaaa, aaaabbbbccccdddd o zzzhoditqxfpqbcwr
- Del objeto X obtenemos las 10 palabras en inglés más populares de nuestra muestra:
Word pc
iter 4133
op 4030
regreso 2866
ns 2834
id 2740
nombre 2556
nuevo 2410
datos 2381
cuerda 2358
http 2304