diff --git a/fake_news_checker.db b/fake_news_checker.db index e06e263..43543be 100644 Binary files a/fake_news_checker.db and b/fake_news_checker.db differ diff --git a/src/Ai/interence.py b/src/Ai/interence.py index d68e9b6..c7c9bed 100644 --- a/src/Ai/interence.py +++ b/src/Ai/interence.py @@ -34,5 +34,6 @@ class VeraMindInference: return { "result": "FAKE" if is_fake else "REAL", - "confidence": float(confidence) + "confidence": float(confidence), + "is_fake": is_fake } \ No newline at end of file diff --git a/src/models/data.py b/src/models/data.py index 7f8f03b..3f28398 100644 --- a/src/models/data.py +++ b/src/models/data.py @@ -1,10 +1,15 @@ +from urllib.parse import urlparse +from typing import Optional + from utils.webTextExtractor import WebTextExtractor class TextData: - def __init__(self, url: str = "") -> None: + def __init__(self, url: str = "",text: str = "",result: str = "", is_fake_news: bool = False, provider: str = "") -> None: self.url = url - self.text = "" - self.result = "" + self.text = text + self.result = result + self.is_fake_news = is_fake_news + self.provider = provider self.confidence = None self._extractor = None @@ -31,4 +36,34 @@ class TextData: if self.confidence != None: output = f"Prediction: {self.result}" + f" Confidence: {self.confidence:.4f}" print(output) - return output \ No newline at end of file + return output + + def get_provider(self)-> str: + self.extract_provider() + return self.provider + + def extract_provider(self): + """ + Extract the domain (anbieter) from a given URL. + + :param url: The URL to process + :return: The extracted domain or None if the URL is invalid + """ + if not self._is_valid_url(self.url): + self.provider = "None" + parsed_url = urlparse(self.url) + domain_parts = parsed_url.netloc.split('.') + self.provider = f"{domain_parts[-2]}.{domain_parts[-1]}" if len(domain_parts) >= 2 else "None" + + def _is_valid_url(self, url: str) -> bool: + """ + Check if a given URL is valid. + + :param url: The URL to validate + :return: True if the URL is valid, False otherwise + """ + try: + result = urlparse(url) + return all([result.scheme, result.netloc]) + except ValueError: + return False \ No newline at end of file diff --git a/src/models/provider.py b/src/models/provider.py new file mode 100644 index 0000000..3a82610 --- /dev/null +++ b/src/models/provider.py @@ -0,0 +1,24 @@ +class Provider(): + + def __init__(self, title: str, count: int, text_data_list) -> None: + self.title = title + self.count = count + self.text_data_list = text_data_list + + def get_fake_percentage(self) -> float: + + count_all = 0 + count_fake = 0 + for text_data in self.text_data_list: + #print(text_data.provider) + #print("FAKE" if text_data.is_fake_news else "REAL") + count_all += 1 + if text_data.is_fake_news: + count_fake += 1 + + if count_all == 0: + return 0.0 + + return (count_fake / count_all) * 100 + + \ No newline at end of file diff --git a/src/utils/database/database.py b/src/utils/database/database.py index 00ede72..79fb0ad 100644 --- a/src/utils/database/database.py +++ b/src/utils/database/database.py @@ -1,4 +1,4 @@ -import sqlite3 +import duckdb class FakeNewsChecker: def __init__(self, db_name='fake_news_checker.db'): @@ -6,49 +6,50 @@ class FakeNewsChecker: self.create_table() def create_connection(self): - return sqlite3.connect(self.db_name) + return duckdb.connect(self.db_name) def create_table(self): conn = self.create_connection() - cursor = conn.cursor() - cursor.execute(''' + conn.execute(''' CREATE TABLE IF NOT EXISTS url_info ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - url TEXT NOT NULL, - anbieter TEXT NOT NULL, + id INTEGER PRIMARY KEY, + url VARCHAR NOT NULL, + anbieter VARCHAR NOT NULL, is_fake_news BOOLEAN NOT NULL ) ''') - conn.commit() conn.close() + def get_next_id(self): + conn = self.create_connection() + result = conn.execute('SELECT COALESCE(MAX(id), 0) + 1 FROM url_info').fetchone() + conn.close() + return result[0] + def insert_data(self, url, anbieter, is_fake_news): conn = self.create_connection() - cursor = conn.cursor() - cursor.execute(''' - INSERT INTO url_info (url, anbieter, is_fake_news) - VALUES (?, ?, ?) - ''', (url, anbieter, is_fake_news)) - conn.commit() + next_id = self.get_next_id() + conn.execute(''' + INSERT INTO url_info (id, url, anbieter, is_fake_news) + VALUES (?, ?, ?, ?) + ''', [next_id, url, anbieter, bool(is_fake_news)]) conn.close() def fetch_data(self): conn = self.create_connection() - cursor = conn.cursor() - cursor.execute('SELECT * FROM url_info') - rows = cursor.fetchall() + result = conn.execute('SELECT * FROM url_info').fetchall() conn.close() - return rows + return result # Beispielnutzung der Klasse if __name__ == '__main__': checker = FakeNewsChecker() # Daten hinzufügen - checker.insert_data('https://example.com/news/123', 'Example News', 0) - checker.insert_data('https://fakenews.com/article/456', 'Fake News', 1) + checker.insert_data('https://example.com/news/123', 'Example News', False) + checker.insert_data('https://fakenews.com/article/456', 'Fake News', True) # Daten abrufen data = checker.fetch_data() for row in data: - print(f"ID: {row[0]}, URL: {row[1]}, Anbieter: {row[2]}, Fake News: {'Ja' if row[3] else 'Nein'}") + print(f"ID: {row[0]}, URL: {row[1]}, Anbieter: {row[2]}, Fake News: {'Ja' if row[3] else 'Nein'}") \ No newline at end of file diff --git a/src/views/mainScreen.py b/src/views/mainScreen.py index 1a02668..51fa03e 100644 --- a/src/views/mainScreen.py +++ b/src/views/mainScreen.py @@ -38,6 +38,10 @@ class MainFrame(ctk.CTkFrame): self.header = ctk.CTkLabel(self.scrollview, text="Leaderboard", font=("Arial", 24, "bold")) self.header.pack(pady=10, padx=10, anchor="w") + # Container für Provider-Einträge + self.provider_container = ctk.CTkFrame(self.scrollview) + self.provider_container.pack(fill="both", expand=True) + def set_controller(self, controller): self.controller = controller