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.")