Download app.py from sofzcc/FakeNews: direct link, hf CLI and curl.
- Browser
- Download file 4.29 kB
-
https://huggingface.co/spaces/sofzcc/FakeNews/resolve/main/app.py
- Command line
-
hf download hf://spaces/sofzcc/FakeNews/app.py
-
curl -L -o app.py https://huggingface.co/spaces/sofzcc/FakeNews/resolve/main/app.py
4.29 kB
| import streamlit as st | |
| import torch | |
| import newspaper | |
| import json | |
| # Load model directly | |
| from transformers import AutoTokenizer, AutoModelForSequenceClassification | |
| tokenizer = AutoTokenizer.from_pretrained("sofzcc/distilbert-base-uncased-fake-news-checker") | |
| model = AutoModelForSequenceClassification.from_pretrained("sofzcc/distilbert-base-uncased-fake-news-checker") | |
| def extract_news_text(url): | |
| article = newspaper.Article(url=url, language='en') | |
| article.download() | |
| article.parse() | |
| article ={ | |
| "title": str(article.title), | |
| "text": str(article.text), | |
| "published_date": str(article.publish_date), | |
| "keywords": article.keywords, | |
| "summary": str(article.summary) | |
| } | |
| return article['text'] | |
| # Function to predict if news is real or fake | |
| def predict_news(news_text): | |
| inputs = tokenizer(news_text, return_tensors="pt", truncation=True, padding=True, max_length=512) | |
| with torch.no_grad(): | |
| outputs = model(**inputs) | |
| logits = outputs.logits | |
| predictions = torch.argmax(logits, dim=-1).item() | |
| return "Real" if predictions == 1 else "Fake" | |
| # Check if a GPU is available and move the model to the appropriate device | |
| device = torch.device("cuda" if torch.cuda.is_available() else "cpu") | |
| model.to(device) | |
| # Define text classification function | |
| def classify_text(text): | |
| # Tokenize the input text | |
| inputs = tokenizer(text, return_tensors="pt", truncation=True, padding=True, max_length=512) | |
| inputs = {key: value.to(device) for key, value in inputs.items()} | |
| # Ensure the model is in evaluation mode | |
| model.eval() | |
| # Perform the forward pass | |
| with torch.no_grad(): | |
| outputs = model(**inputs) | |
| logits = outputs.logits | |
| # Convert logits to probabilities | |
| probabilities = torch.nn.functional.softmax(logits, dim=-1) | |
| # Get the predicted class | |
| predicted_class = torch.argmax(probabilities, dim=1).item() | |
| # Define the label mapping | |
| labels = ['False', 'True'] | |
| # Return the predicted label and probabilities | |
| predicted_label = labels[predicted_class] | |
| probabilities = probabilities.cpu().numpy() | |
| return predicted_label, probabilities | |
| # Streamlit App | |
| st.title("Fake News Detector") | |
| # Add disclaimer | |
| with st.expander("Disclaimer"): | |
| st.markdown(""" | |
| **Important Notice:** | |
| This model was trained exclusively on news articles from Reuters. As a result, the model may be biased towards considering news from Reuters as "True" and may not accurately classify news from other sources. | |
| **Usage Warning:** | |
| - This model is intended for experimental and educational purposes only. | |
| - We do not take any responsibility for the outcomes or decisions made based on the results provided by this model. | |
| - The model should not be used for any critical or real-world applications, especially those that involve significant consequences or decision-making. | |
| - Users are encouraged to apply their own judgment and consult multiple sources when evaluating the credibility of news. | |
| **By using this model, you acknowledge and accept these terms and disclaimers.** | |
| """) | |
| st.write("Enter a news article URL below to check if it's real or fake:") | |
| news_url = st.text_area("News URL", height=100) | |
| if st.button("Evaluate URL"): | |
| if news_url: | |
| try: | |
| news_text = extract_news_text(news_url) | |
| predicted_label, probabilities = classify_text(news_text) | |
| st.write(f"The news article is predicted to be: **{predicted_label}**") | |
| except: | |
| st.write("It wasn't possible to fetch the article text. Enter the news article text below to check if it's real or fake.") | |
| else: | |
| st.write("Please enter some news URL to evaluate.") | |
| st.write("Enter a news article text below to check if it's real or fake:") | |
| news_text = st.text_area("News Text", height=300) | |
| if st.button("Evaluate Text"): | |
| if news_text: | |
| try: | |
| predicted_label, probabilities = classify_text(news_text) | |
| st.write(f"The news article is predicted to be: **{predicted_label}**") | |
| except: | |
| st.write("It wasn't possible to asses the article text.") | |
| else: | |
| st.write("Please enter some news URL to evaluate.") | |