Рубрики
Без рубрики

Визуализируйте новостное слово облако с помощью Python, Flask и jqcloud

В этом посте вы научитесь потреблять спокойную API, постройте облако слова, используя NLTK и ASLO, чтобы визуализировать его с помощью библиотеки JQCloud.

Автор оригинала: Prateek Jain.

Цели обучения этого поста:

  1. Получить новостной корм, используя API на основе отдыха из Newsapi.org
  2. Получить слова и их частоту
  3. Визуализируйте слово облако с помощью 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.