|
import gradio as gr |
|
from newspaper import Article |
|
from modules.online_search import search_online |
|
from modules.validation import calculate_truthfulness_score |
|
from modules.knowledge_graph import search_kg |
|
from modules.generate_explanation import generate_explanation |
|
from dotenv import load_dotenv |
|
import os |
|
from concurrent.futures import ThreadPoolExecutor |
|
|
|
|
|
load_dotenv() |
|
|
|
|
|
KG_INDEX_PATH = "KG/news_category_index.faiss" |
|
KG_DATASET_PATH = "KG/News_Category_Dataset_v3.json" |
|
SEARCH_API_KEY = os.getenv("SEARCH_API_KEY") |
|
SEARCH_BASE_URL = os.getenv("SEARCH_BASE_URL") |
|
SEARCH_MODEL = os.getenv("SEARCH_MODEL") |
|
|
|
|
|
executor = ThreadPoolExecutor(max_workers=3) |
|
|
|
|
|
def evaluate_news(news_input): |
|
|
|
yield "**Processing... Please wait while we analyze the information.** ⏳" |
|
|
|
|
|
if news_input.startswith("http"): |
|
try: |
|
article = Article(news_input) |
|
article.download() |
|
article.parse() |
|
news_text = article.title + ". " + article.text |
|
except Exception as e: |
|
yield f"**Error processing the URL:** {str(e)}" |
|
return |
|
else: |
|
|
|
news_text = news_input |
|
|
|
try: |
|
|
|
future_kg = executor.submit(search_kg, news_text, KG_INDEX_PATH, KG_DATASET_PATH) |
|
future_online = executor.submit(search_online, news_text, SEARCH_API_KEY, SEARCH_BASE_URL, SEARCH_MODEL) |
|
|
|
|
|
kg_content = future_kg.result() |
|
online_search_results = future_online.result() |
|
|
|
|
|
context = online_search_results['message_content'] + '\n' + kg_content + '\n' + 'Device set to use cpu' |
|
|
|
|
|
|
|
truth_score = calculate_truthfulness_score(info=news_text, context=context) |
|
|
|
|
|
if truth_score > 0.7: |
|
status = "likely true" |
|
recommendation = "You can reasonably trust this information, but further verification is always recommended for critical decisions." |
|
elif truth_score > 0.4: |
|
status = "uncertain" |
|
recommendation = "This information might be partially true, but additional investigation is required before accepting it as fact." |
|
else: |
|
status = "unlikely to be true" |
|
recommendation = "It is recommended to verify this information through multiple reliable sources before trusting it." |
|
|
|
|
|
result = f"**News**: \"{news_text[:300]}...\"\n\n" |
|
result += f"**Truthfulness Score**: {truth_score:.2f} (**{status.capitalize()}**)\n\n" |
|
result += f"**Analysis**: {recommendation}\n\n" |
|
yield result |
|
|
|
|
|
future_explanation = executor.submit(generate_explanation, news_text, context, truth_score) |
|
|
|
|
|
explanation = future_explanation.result() |
|
if explanation: |
|
result += f"**Explanation**: {explanation}\n\n" |
|
|
|
|
|
sources = online_search_results.get('sources', []) |
|
if sources: |
|
result += "\n**Sources**:\n" |
|
|
|
for i, source in enumerate(sources[:5]): |
|
result += f"{i + 1}. {source}\n" |
|
result += "\n*Please make sure to do your own research for more confirmation and to cross-check the information.*" |
|
|
|
yield result |
|
|
|
except Exception as e: |
|
yield f"**Error occurred while processing the input:** {str(e)}" |
|
|
|
|
|
|
|
with gr.Blocks() as demo: |
|
gr.Markdown("# 📰 EchoTruth: Verify News Authenticity in Real-Time") |
|
|
|
gr.Markdown(""" |
|
**How to use:** |
|
1. Enter a news article or URL in the box below. |
|
2. Click on **Check Truthfulness**. |
|
3. Receive a **truthfulness score** along with **explanations and sources** to help you assess the authenticity of the content. |
|
""") |
|
|
|
with gr.Row(): |
|
input_box = gr.Textbox( |
|
placeholder="Enter news text or URL here... (e.g., https://example.com)", |
|
label="Input News or URL", |
|
lines=5 |
|
) |
|
|
|
submit_btn = gr.Button("Check Truthfulness") |
|
|
|
output_box = gr.Markdown() |
|
|
|
submit_btn.click( |
|
fn=evaluate_news, |
|
inputs=[input_box], |
|
outputs=[output_box] |
|
) |
|
|
|
gr.Markdown("### **About EchoTruth**") |
|
gr.Markdown("EchoTruth uses AI to help users verify news authenticity in real-time. We recommend checking multiple sources before making decisions based on news.") |
|
|
|
demo.launch() |