Автор оригинала: Prateek Jain.
Цели обучения этого поста:
- Получить новостной корм, используя API на основе отдыха из Newsapi.org
- Получить слова и их частоту
- Визуализируйте слово облако с помощью jqcloud
Мы построим приложение Flask, чтобы поставить все на месте.
Цель-1: Получить новостной корм из Newsapi.org
Newsapi.org предоставляет бесплатно и просто использовать RESTFLAY API. Он обеспечивает две конечные точки, источники и статьи. Использование Источники Конечная точка Мы можем получить список источников новостей и блогов, доступных в API News и использование Статьи Конечная точка мы можем получить список статей для конкретного источника.
Давайте теперь понять URL-адрес запроса на конечную точку статей.
https://newsapi.org/v1/articles?source={source}&apiKey={apikey}
Как, мы можем видеть API требует двух параметров, источника и апикей. Источник – это короткий код, предоставляемый Newsapi.org для каждого источника новостей или блога. Вы можете выбрать любой источник новостей или блог на ваш выбор, некоторые из источников со своими соответствующими кодами Bloomberg (Bloomberg), BBC News (BBC-News), бизнес-инсайдер (бизнес-инсайдер) и т. Д.
Вы можете генерировать свой ключ API из Newsapi.org, когда вы зарегистрируетесь на нем. Итак, запрос будет выглядеть так:
https://newsapi.org/v1/articles?source=bbc-news&apiKey=123456
Давайте напишем код Python, чтобы получить данные новостей
import requests # this we will use to call API and get data import json # to convert python dictionary/list to string format # get API key from NewsAPI.org NEWS_API_KEY = "123456" # url for articles endpoint # I'm using bbc-news source, you can choose a source of your choice # or can pull data from multiple sources url = "https://newsapi.org/v1/articles?source=bbc-news&apiKey="+NEWS_API_KEY # call the api response = requests.get(url) # get the data in json format result = response.json() print(result)
Это ответ JSON, мы получим.
{ "status":"ok", "source":"bbc-news", "sortBy":"top", "articles":[ { "author":"BBC News", "title":"British Airways to resume most flights but delays still expected", "description":"British Airways warns there will still be some delays and cancellations, a day after its IT crash.", "url":"http://www.bbc.co.uk/news/uk-40074751", "urlToImage":"https://ichef.bbci.co.uk/news/1024/cpsprodpb/11F52/production/_96245537_ba_reuters.jpg", "publishedAt":"2017-05-28T07:54:49+00:00" } ] }
Цель-2: получить слова и их частота
Для достижения этого сначала мы получим описание для каждой новостной статьи, возвращенной API. Затем мы разделим описание/предложения в слова, используя NLTK, и после этого мы будем использовать коллекции. Counter, чтобы получить слова и их частоты.
Давайте достигнем этого шага!
from nltk.tokenize import word_tokenize # to split sentences into words from nltk.corpus import stopwords # to get a list of stopwords from collections import Counter # to get words-frequency descriptions = [] # this is in continuation of above code # result variable holds the json response # all the news articles are listed under 'articles' key # we are interested in the description of each news article for each_article in result['articles']: description.append(each_article['description]) # split sentences into words words = [] for description in descriptions: tokens = word_tokenize(description) words.extend(tokens) # remove stopwords from our words list and also remove any word whose length is less than 3 # stopwords are commonly occuring words like is, am, are, they, some, etc. stop_words = set(stopwords.words('english')) words = [word for word in words if word not in stop_words and len(word)>2] # now, get the words and their frequency words_freq = Counter(words) print(words_freq)
Цель-3: визуализировать слово облако с помощью jqcloud
В этой цели мы вернем слово облачных данных из Python на JQCloud для визуализации.
JQCloud требует данных в следующем формате, поэтому перед возвратом данных облачных данных нам придется поставить его в используемый формат.
[ { 'text':'police', 'weight':100 }, { 'text':'parents', 'weight':80 } ]
Код для преобразования данных JQCloud совместимый формат, а также дамп JSON в строковый формат
words_json = [{'text': word, 'weight': count} for word, count in words_freq.items()] # json.dumps is used to convert json object i.e. dictionary or list into a string print(json.dumps(words_freq))
Теперь давайте напишите какой-нибудь код jQuery, чтобы вызвать нашу конечную точку флэкса-приложения, получить данные, а затем построить облако слова
Во-первых, мы напишем наш HTML-код (index.html), чтобы включить CSS и JS для JQCloud, а также включать наш сценарий jQuery.
News Word Cloud
В Script.js мы позвоним нашей конечной точке Flask-App ‘Word_Cloud’, получите данные и визуализируйте его, используя JQCloud
$(document).ready(function () { // on page load this will fetch data from our flask-app asynchronously $.ajax({url: '/word_cloud', success: function (data) { // returned data is in string format we have to convert it back into json format var words_data = $.parseJSON(data); // we will build a word cloud into our div with id=word_cloud // we have to specify width and height of the word_cloud chart $('#word_cloud').jQCloud(words_data, { width: 800, height: 600 }); }}); });
Вот наш полный код приложения
from flask import Flask, render_template from nltk.tokenize import word_tokenize # to split sentences into words from nltk.corpus import stopwords # to get a list of stopwords from collections import Counter # to get words-frequency import requests # this we will use to call API and get data import json # to convert python dictionary to string format app = Flask(__name__) # get API key from NewsAPI.org NEWS_API_KEY = "123456" @app.route('/') def home_page(): return render_template('index.html') @app.route('/word_cloud', methods=['GET']) def word_cloud(): try: # url for articles endpoint # I'm using bbc-news source, you can choose a source of your choice # or can pull data from multiple sources url = "https://newsapi.org/v1/articles?source=bbc-news&apiKey="+NEWS_API_KEY # call the api response = requests.get(url) # get the data in json format result = response.json() # all the news articles are listed under 'articles' key # we are interested in the description of each news article sentences = "" for news in result['articles']: description = news['description'] sentences = sentences + " " + description # split sentences into words words = word_tokenize(sentences) # get stopwords stop_words = set(stopwords.words('english')) # remove stopwords from our words list and also remove any word whose length is less than 3 # stopwords are commonly occuring words like is, am, are, they, some, etc. words = [word for word in words if word not in stop_words and len(word) > 3] # now, get the words and their frequency words_freq = Counter(words) # JQCloud requires words in format {'text': 'sample', 'weight': '100'} # so, lets convert out word_freq in the respective format words_json = [{'text': word, 'weight': count} for word, count in words_freq.items()] # now convert it into a string format and return it return json.dumps(words_json) except Exception as e: return '[]' if __name__ == '__main__': app.run()
Добавлен Jumbotron из Bootstrap, чтобы она выглядела немного лучше! ..
Вы можете вилить полный код из репозитория Git – https://github.com/prateekkrjain/newsapi_word_cloud.