news-analyzer / app.py
elozano's picture
Model names updated
81a3cd1
from typing import Dict, List, Tuple, Union
import streamlit as st
from annotated_text import annotated_text
from analyzer import NewsAnalyzer
ENTITY_COLOR = {
"PER": "#b2ffff",
"LOC": "#ffffb2",
"ORG": "#adfbaf",
"MISC": "#ffb2b2",
}
def run() -> None:
analyzer = NewsAnalyzer(
category_model_name="elozano/bert-base-cased-news-category",
fake_model_name="elozano/bert-base-cased-fake-news",
clickbait_model_name="elozano/bert-base-cased-clickbait-news",
ner_model_name="dslim/bert-base-NER",
)
st.title("📰 News Analyzer")
with st.form("news-form", clear_on_submit=False):
st.session_state.headline = st.text_input("Headline:")
st.session_state.content = st.text_area("Content:", height=200)
st.session_state.button = st.form_submit_button("Analyze")
if "button" in st.session_state:
if st.session_state.headline == "":
st.error("Please, provide a headline.")
else:
if st.session_state.content == "":
st.warning(
"Please, provide both headline and content to achieve better results."
)
predictions = analyzer(
headline=st.session_state.headline, content=st.session_state.content
)
col1, _, col2 = st.columns([2, 1, 4])
with col1:
st.subheader("Analysis:")
category_prediction = predictions["category"]
st.markdown(
f"{category_prediction['emoji']} **Category**: {category_prediction['label']}"
)
clickbait_prediction = predictions["clickbait"]
st.markdown(
f"{clickbait_prediction['emoji']} **Clickbait**: {'Yes' if clickbait_prediction['label'] == 'Clickbait' else 'No'}"
)
fake_prediction = predictions["fake"]
st.markdown(
f"{fake_prediction['emoji']} **Fake**: {'Yes' if fake_prediction['label'] == 'Fake' else 'No'}"
)
with col2:
st.subheader("Headline:")
annotated_text(
*parse_entities(
st.session_state.headline, predictions["ner"]["headline"]
)
)
st.subheader("Content:")
if st.session_state.content:
annotated_text(
*parse_entities(
st.session_state.content, predictions["ner"]["content"]
)
)
else:
st.error("Content not provided.")
def parse_entities(
text: str, entities: Dict[str, Union[str, int]]
) -> List[Union[str, Tuple[str, str]]]:
start = 0
parsed_text = []
for entity in entities:
parsed_text.append(text[start : entity["start"]])
parsed_text.append(
(
entity["word"],
entity["entity_group"],
ENTITY_COLOR[entity["entity_group"]],
)
)
start = entity["end"]
parsed_text.append(text[start:])
return parsed_text
if __name__ == "__main__":
run()