Парсинг новостей и создание облака слов на Python
Table Of Content
- Шаг 0. Импортирование библиотек
- Шаг 1. Парсинг текстовых данных с помощью поиска в Google News
- Полное руководство по параметрам поиска Google
- Да, я действительно верю, что люди, читающие это, могут быть настолько заинтересованы, чтобы ответить "да" на вопрос "Вы когда-нибудь хотели знать...
- Шаг 2. Анализ текста для создания облака слов
- Сборка всего вместе
Простой пошаговый учебник на 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()