CoderCastrov logo
CoderCastrov
Питон

Парсинг новостей и создание облака слов на Python

Парсинг новостей и создание облака слов на Python
просмотров
4 мин чтение
#Питон

Простой пошаговый учебник на Python по созданию облака слов на основе новостных тем.

Облака слов - отличный способ быстро визуализировать содержимое веб-сайта. Это также простой способ подвести итоги настроения. Предположим, вы быстро хотите оценить текущее настроение новостей о Bitcoin или фондовом рынке - вы можете легко сделать это, парся результаты поиска новостей Google по указанной теме и создавая облако слов на основе результатов.

Вам не нужно быть отличным программистом, чтобы сделать это. Этот учебник научит вас, как это сделать.

Мы собираемся выполнить две основные задачи на Python:

Шаг 0. Импортирование библиотек

Сначала мы импортируем некоторые библиотеки Python.

import requests
import urllib.request
import time
import spacy
from bs4 import BeautifulSoup
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
import matplotlib.pyplot as plt

Если у вас не установлены библиотеки wordcloud или spaCy, пожалуйста, воспользуйтесь следующими командами:

pip install wordcloud
pip install https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.2.0/en_core_web_sm-2.2.0.tar.gz

Шаг 1. Парсинг текстовых данных с помощью поиска в Google News

Сначала нам нужно получить параметры поиска Google, чтобы вы могли построить свой URL. В блоге есть хорошая статья, которая кратко описывает большинство параметров поиска Google:

Полное руководство по параметрам поиска Google

Да, я действительно верю, что люди, читающие это, могут быть настолько заинтересованы, чтобы ответить "да" на вопрос "Вы когда-нибудь хотели знать...

moz.com

Все URL-адреса поиска Google начинаются с:

https://www.google.com/search?

Затем вы добавляете свои параметры поиска после этого. Вот основные параметры, которые нам понадобятся:

q — это тема запроса, например, q=bitcoin, если вы ищете новости о Bitcoin

hl — язык интерфейса, например, hl=en для английского

tbm — для сопоставления, здесь нам нужно tbm=nws для поиска новостей. Есть еще много других вариантов, например, app для приложений, blg для блогов, bks для книг, isch для изображений, plcs для мест, vid для видео, shop для покупок и rcp для рецептов.

num — контролирует количество показываемых результатов. Если вы хотите видеть только 10 результатов, num=10

Хорошо. Теперь давайте объединим все это. Если вы хотите найти последние 100 новостных статей о Bitcoin, вы должны:

topic="bitcoin"
numResults=100
url ="[https://www.google.com/search?q=](https://www.google.com/search?q=)"+topic+"&tbm=nws&hl=en&num="+str(numResults)

Теперь мы можем распарсить результаты

response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')

Результаты поиска Google дают нам заголовок, ссылку и некоторое основное описание. Мы будем использовать основные описания для создания облака слов в этом учебнике. Конечно, вы можете использовать ссылки для парсинга корпуса новостных статей и создания более полного облака слов. Но здесь, для простоты, мы будем использовать основные описания.

results = soup.find_all(‘div’, attrs = {‘class’: ‘ZINbbc’})
descriptions = []
for result in results:
    try:
        description = result.find(‘div’, attrs={‘class’:’s3v9rd’}).get_text()
        if description != ‘’: 
            descriptions.append(description)
    except:
        continue

Вы должны получить список, который выглядит примерно так:

Чтобы преобразовать его в строку, используйте...

text = ‘’.join(descriptions)

Шаг 2. Анализ текста для создания облака слов

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

  • Приведите все слова к нижнему регистру.
  • Определите все прилагательные... вы также можете добавить существительные и местоимения, если хотите.
  • Удалите все стоп-слова. Это слова, такие как "a", "the", "we"... и т.д. Они часто встречаются и не несут полезной информации. Они просто являются связующим звеном в языке.

Сначала мы загружаем языковую модель из spaCy и разбираем текстовую строку.

sp = spacy.load('en_core_web_sm')
doc = sp(text)

Мы можем сразу же проверить слова и их типы - это очень удобно!

for word in doc:
 print(word.text, word.pos_, word.dep_)

Если у вас возникли проблемы с моделью en_core_web_sm, попробуйте ее перезагрузить. У меня изначально возникли некоторые проблемы.

python -m spacy download en_core_web_sm

Затем мы выбираем только прилагательные и приводим все к нижнему регистру.

newText =’’
for word in doc:
    if word.pos_ in [‘ADJ’]:
        newText = “ “.join((newText, word.text.lower()))

Теперь мы готовы передать его в облако слов!

wordcloud = WordCloud(stopwords=STOPWORDS).generate(newText)
plt.imshow(wordcloud, interpolation=’bilinear’)
plt.axis(“off”)
plt.show()
Прилагательные

Если мы добавим существительные в смесь...

Прилагательные и существительные

Сборка всего вместе

В заключение, мы можем выбрать любую тему, которую хотим, и создать облако слов на основе новостей.

import requests
import urllib.request
import time
import spacy
from bs4 import BeautifulSoup
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
import matplotlib.pyplot as plt

topic = "биткоин"
numResults = 100
url = "https://www.google.com/search?q=" + topic + "&tbm=nws&hl=ru&num=" + str(numResults)
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
results = soup.find_all('div', attrs={'class': 'ZINbbc'})
descriptions = []
for result in results:
    try:
        description = result.find('div', attrs={'class': 's3v9rd'}).get_text()
        if description != '':
            descriptions.append(description)
    except:
        continue

text = ''.join(descriptions)
sp = spacy.load('ru_core_news_sm')
doc = sp(text)
newText = ''
for word in doc:
    if word.pos_ in ['ADJ', 'NOUN']:
        newText = " ".join((newText, word.text.lower()))

wordcloud = WordCloud(stopwords=STOPWORDS).generate(newText)
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()