Spaces:
Runtime error
Runtime error
from flask import Flask, request, jsonify | |
from flask_cors import CORS | |
import os | |
from dotenv import load_dotenv | |
from transformers import pipeline | |
import feedparser | |
import json | |
from dateutil import parser | |
import re | |
load_dotenv() | |
# Load Setiment Classifier | |
sentiment_analysis = pipeline( | |
"sentiment-analysis", model="siebert/sentiment-roberta-large-english") | |
app = Flask(__name__, static_url_path='/static') | |
CORS(app) | |
def index(): | |
return app.send_static_file('index.html') | |
def get_news(): | |
feed_url = request.args.get('feed_url') | |
# check if string is a valid | |
# file name for cache | |
file_name = "".join(re.split(r"https://|\.|/", feed_url)) | |
feed_entries = get_feed(feed_url) | |
# filter only titles for sentiment analysis | |
try: | |
with open(f'{file_name}_cache.json') as file: | |
cache = json.load(file) | |
except: | |
cache = {} | |
# if new homepage is newer than cache, update cache and return | |
print("new date", feed_entries['last_update']) | |
print("old date", cache['last_update'] | |
if 'last_update' in cache else "None") | |
if not cache or parser.parse(feed_entries['last_update']) > parser.parse(cache['last_update']): | |
print("Updating cache with new preditions") | |
titles = [entry['title'] for entry in feed_entries['entries']] | |
# run sentiment analysis on titles | |
predictions = [sentiment_analysis(sentence) for sentence in titles] | |
# parse Negative and Positive, normalize to -1 to 1 | |
predictions = [-prediction[0]['score'] if prediction[0]['label'] == | |
'NEGATIVE' else prediction[0]['score'] for prediction in predictions] | |
# merge rss data with predictions | |
entries_predicitons = [{**entry, 'sentiment': prediction} | |
for entry, prediction in zip(feed_entries['entries'], predictions)] | |
output = {'entries': entries_predicitons, | |
'last_update': feed_entries['last_update']} | |
# update last precitions cache | |
with open(f'{file_name}_cache.json', 'w') as file: | |
json.dump(output, file) | |
# send back json | |
return jsonify(output) | |
else: | |
print("Returning cached predictions") | |
return jsonify(cache) | |
def predict(): | |
# get data from POST | |
if request.method == 'POST': | |
# get current news | |
# get post body data | |
data = request.get_json() | |
if data.get('sentences') is None: | |
return jsonify({'error': 'No text provided'}) | |
# get post expeceted to be under {'sentences': ['text': '...']} | |
sentences = data.get('sentences') | |
# prencit sentiments | |
predictions = [sentiment_analysis(sentence) for sentence in sentences] | |
# parse Negative and Positive, normalize to -1 to 1 | |
predictions = [-prediction[0]['score'] if prediction[0]['label'] == | |
'NEGATIVE' else prediction[0]['score'] for prediction in predictions] | |
output = [dict(sentence=sentence, sentiment=prediction) | |
for sentence, prediction in zip(sentences, predictions)] | |
# send back json | |
return jsonify(output) | |
def get_feed(feed_url): | |
feed = feedparser.parse(feed_url) | |
return {'entries': feed['entries'], 'last_update': feed["feed"]['updated']} | |
if __name__ == '__main__': | |
app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 7860))) | |