From d6bbdc37670242d6dbb95a8137eaba5284e15d52 Mon Sep 17 00:00:00 2001 From: Falko Habel Date: Tue, 8 Oct 2024 12:48:13 +0200 Subject: [PATCH 1/5] updated the system prompt --- src/Ai/llm.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/Ai/llm.py b/src/Ai/llm.py index 8343f19..dac625e 100644 --- a/src/Ai/llm.py +++ b/src/Ai/llm.py @@ -15,7 +15,7 @@ class ArticleRater: "base_url": self.client, "model": "mistral-nemo:12b-instruct-2407-q8_0", "headers": self.headers, - "system": "Give a short explanation max 1-3 sentence why this article is rated like that" + "system": "Give a short explanation max 1-3 sentence why this article is rated like that. Begin the RESPONSE ALWAYS with the RESULT and the confidence" } message = (f"A Machine Learning Model labeled an article the following: " @@ -28,11 +28,23 @@ class ArticleRater: return llm.stream(message) # Usage -if __name__ == "main": +if __name__ == "__main__": article_rater = ArticleRater() - article = "Example article content." - result = {"result": "REAL", "confidence": 0.754} + article = """Butler (dpo) - Erneutes Totalversagen beim Secret Service: Ausgerechnet in Butler, dem Ort des vorigen Anschlags auf Donald Trump, ist es gestern zu einem schweren Cringe-Attentat auf den republikanischen Präsidentschaftskandidaten gekommen. Einem Schwerbeknackten gelang es, die Bühne zu stürmen und neben Trump mehrere Luftsprünge zu machen. + +Es sind Szenen, die sich nur schwer ertragen lassen: Zweimal hüpfte der 53-jährige Elon R. Musk manisch-euphorisch neben Trump in die Luft und präsentierte den Zuschauern dabei seinen Bauch. Danach hielt er eine extrem peinliche Rede, in der er Trump in den höchsten Tönen lobte. + +Nach den verstörenden Bildern steht nun erneut der Secret Service in der Kritik. Nach Einschätzung vieler Experten hätten die Agenten die zahlreichen Red Flags hinsichtlich der Cringe-Gefahr für Trump sofort erkennen und Elon Musk mit gezielten Schüssen niederstrecken müssen. + +"Wenn das nicht gelungen wäre, hätten sie sich spätestens, als Musk zum Luftsprung ansetzte, schützend vor den Kandidaten werfen müssen, um peinliche Pressebilder zu vermeiden", erklärt Sicherheitsanalyst Marc Tiede. "Das Versagen wiegt umso schwerer, weil es offenbar einzelne Zuschauer gab, die noch verzweifelt versuchten, die Agenten rechtzeitig vor Musk zu warnen, bevor die fatalen Sprünge fielen – vergeblich." + +Derzeit ist noch unklar, wie es nach dem schweren Cringe-Attentat um den Präsidentschaftskandidaten steht. Laut Medienberichten steht jedoch zu befürchten, dass sich Trumps Rizz bis zur Wahl nicht wieder von diesem Anschlag erholen wird. + +Der Secret Service und das FBI wollen jetzt Untersuchungen einleiten, wie es zu dem für alle Beteiligten höchst unangenehmen Vorfall kommen konnte. + +Bizarr: Elon Musk befindet sich trotz seiner Tat nach wie vor auf freiem Fuß und könnte jederzeit wieder auf republikanischen Wahlkampfveranstaltungen für peinliche Momente sorgen.""" + result = {"result": "FAKE", "confidence": 0.9996} # Capture the stream response response_stream = article_rater.get_response(article, result) From 2436eab591f1602d2763c5ebd16fa9bfe36b63cc Mon Sep 17 00:00:00 2001 From: Falko Habel Date: Tue, 8 Oct 2024 17:17:30 +0200 Subject: [PATCH 2/5] working llm response and changed to response in the articel language --- src/Ai/llm.py | 12 ++--- src/controller/mainFrameController.py | 78 +++++++++++++++++++++++++-- 2 files changed, 81 insertions(+), 9 deletions(-) diff --git a/src/Ai/llm.py b/src/Ai/llm.py index dac625e..da4396e 100644 --- a/src/Ai/llm.py +++ b/src/Ai/llm.py @@ -10,16 +10,15 @@ class ArticleRater: token = f.read().strip() return {"Authorization": f"Token {token}"} - def get_response(self, article, result): + def get_response(self, article, result, confidence): ollama_params = { "base_url": self.client, "model": "mistral-nemo:12b-instruct-2407-q8_0", "headers": self.headers, - "system": "Give a short explanation max 1-3 sentence why this article is rated like that. Begin the RESPONSE ALWAYS with the RESULT and the confidence" + "system": "ANTWORTE in der SPRACHE, die auch der ARTIKEL hat. Erkläre in 1-3 Sätzen, warum es sich um solch einen Artikel handeln könnte und woran man es erkennen kann. Beginne die NACHRICHT immer mit dem Resultat under Wahrscheinlichkeit" } - message = (f"A Machine Learning Model labeled an article the following: " - f"Result: {result['result']}, Confidence: {result['confidence']}, The Article: {article}") + message = (f"A Machine Learning Model labeled an article the following, but RESPOND in the LANGUAGE FROM the ARTICLE: Result: {result} Confidence: {confidence}, The Article: {article}") # Initialize the Ollama object with the prepared parameters llm = Ollama(**ollama_params) @@ -44,9 +43,10 @@ Derzeit ist noch unklar, wie es nach dem schweren Cringe-Attentat um den Präsid Der Secret Service und das FBI wollen jetzt Untersuchungen einleiten, wie es zu dem für alle Beteiligten höchst unangenehmen Vorfall kommen konnte. Bizarr: Elon Musk befindet sich trotz seiner Tat nach wie vor auf freiem Fuß und könnte jederzeit wieder auf republikanischen Wahlkampfveranstaltungen für peinliche Momente sorgen.""" - result = {"result": "FAKE", "confidence": 0.9996} + result = "FAKE" + confidence = 0.9996 # Capture the stream response - response_stream = article_rater.get_response(article, result) + response_stream = article_rater.get_response(article, result, confidence=confidence) for chunk in response_stream: print(chunk, end='', flush=True) diff --git a/src/controller/mainFrameController.py b/src/controller/mainFrameController.py index 762fa99..2aab57f 100644 --- a/src/controller/mainFrameController.py +++ b/src/controller/mainFrameController.py @@ -1,6 +1,7 @@ from views.mainScreen import MainFrame from models.data import TextData from Ai.interence import VeraMindInference +from Ai.llm import ArticleRater class MainFrameController: @@ -8,7 +9,7 @@ class MainFrameController: def __init__(self,frame:MainFrame) -> None: self.frame = frame self.model_inference = VeraMindInference('VeraMind-Mini') - + self.rater = ArticleRater() def get_textdata(self) -> TextData: text_data = TextData() @@ -20,12 +21,83 @@ class MainFrameController: def press_check_button(self): text_data = self.get_textdata() - print(f"text:{text_data.text}") + print(f"text:{text_data}") self.prediction(text_data) self.frame.output_textbox.configure(state="normal") self.frame.output_textbox.delete("0.0", "end") - self.frame.output_textbox.insert("0.0",f"{text_data.get_output()}") + + response_stream = self.rater.get_response(text_data.text, text_data.confidence, text_data.result) + display_chunks = [] + highlight_chunks = [] + + DISPLAY_CHUNK_SIZE = 1 # Display as each chunk arrives + HIGHLIGHT_BATCH_SIZE = 5 + OVERLAP_SIZE = 2 + + for chunk in response_stream: + display_chunks.append(chunk) + highlight_chunks.append(chunk) + + # Display chunk + if len(display_chunks) == DISPLAY_CHUNK_SIZE: + start_index = self.frame.output_textbox.index("end-1c") + self.frame.output_textbox.insert("end", ''.join(display_chunks)) + self.frame.output_textbox.see("end") # Scroll to the end + self.frame.update_idletasks() # Update the textbox immediately + display_chunks = [] + + # Process highlighting + if len(highlight_chunks) >= HIGHLIGHT_BATCH_SIZE: + start_index = self.frame.output_textbox.index(f"end-{sum(len(c) for c in highlight_chunks)}c") + end_index = self.frame.output_textbox.index("end-1c") + self.highlight_words(start_index, end_index) + + # Maintain overlap and reset for next batch + highlight_chunks = highlight_chunks[-OVERLAP_SIZE:] + + # Highlight remaining chunks if any + if highlight_chunks: + start_index = self.frame.output_textbox.index(f"end-{sum(len(c) for c in highlight_chunks)}c") + end_index = self.frame.output_textbox.index("end-1c") + self.highlight_words(start_index, end_index) + self.frame.output_textbox.configure(state="disabled") + + + def highlight_words(self, start_index, end_index): + content = self.frame.output_textbox.get(start_index, end_index) + print(content) + current_index = start_index + + while True: + # Find "FAKE" + fake_index = content.find("FAKE") + if fake_index != -1: + fake_pos_start = f"{current_index}+{fake_index}c" + fake_pos_end = f"{fake_pos_start}+4c" + self.frame.output_textbox.tag_add("fake_color", fake_pos_start, fake_pos_end) + self.frame.output_textbox.tag_config("fake_color", foreground="red") + content = content[fake_index + 4:] + current_index = fake_pos_end + else: + break + + current_index = start_index + content = self.frame.output_textbox.get(start_index, end_index) + + while True: + # Find "REAL" + real_index = content.find("REAL") + if real_index != -1: + real_pos_start = f"{current_index}+{real_index}c" + real_pos_end = f"{real_pos_start}+4c" + self.frame.output_textbox.tag_add("real_color", real_pos_start, real_pos_end) + self.frame.output_textbox.tag_config("real_color", foreground="green") + content = content[real_index + 4:] + current_index = real_pos_end + else: + break + def prediction(self, text_data:TextData) -> TextData: result = self.model_inference.predict(text_data.text) From 16f3bf00a47a08a644b3c4a5841942a5755397da Mon Sep 17 00:00:00 2001 From: Falko Habel Date: Tue, 8 Oct 2024 17:36:08 +0200 Subject: [PATCH 3/5] code improvement --- src/controller/mainFrameController.py | 104 +++++++++++--------------- src/views/mainScreen.py | 4 +- 2 files changed, 45 insertions(+), 63 deletions(-) diff --git a/src/controller/mainFrameController.py b/src/controller/mainFrameController.py index 2aab57f..2fdd2a0 100644 --- a/src/controller/mainFrameController.py +++ b/src/controller/mainFrameController.py @@ -1,9 +1,14 @@ +from collections import deque from views.mainScreen import MainFrame from models.data import TextData from Ai.interence import VeraMindInference from Ai.llm import ArticleRater - +BAD_WORDS = ["FAKE", "SATIRE"] +GOOD_WORDS = ["REAL"] +BAD_COLOR = "#ff8080" +GOOD_COLOR = "#80ff8f" +WORDS = BAD_WORDS + GOOD_WORDS class MainFrameController: def __init__(self,frame:MainFrame) -> None: @@ -21,82 +26,59 @@ class MainFrameController: def press_check_button(self): text_data = self.get_textdata() - print(f"text:{text_data}") self.prediction(text_data) self.frame.output_textbox.configure(state="normal") self.frame.output_textbox.delete("0.0", "end") - + response_stream = self.rater.get_response(text_data.text, text_data.confidence, text_data.result) - display_chunks = [] - highlight_chunks = [] - - DISPLAY_CHUNK_SIZE = 1 # Display as each chunk arrives - HIGHLIGHT_BATCH_SIZE = 5 - OVERLAP_SIZE = 2 + + highlight_buffer = deque(maxlen=5) for chunk in response_stream: - display_chunks.append(chunk) - highlight_chunks.append(chunk) + # Display the chunk immediately + self.frame.output_textbox.insert("end", chunk) + self.frame.output_textbox.see("end") + self.frame.update_idletasks() - # Display chunk - if len(display_chunks) == DISPLAY_CHUNK_SIZE: - start_index = self.frame.output_textbox.index("end-1c") - self.frame.output_textbox.insert("end", ''.join(display_chunks)) - self.frame.output_textbox.see("end") # Scroll to the end - self.frame.update_idletasks() # Update the textbox immediately - display_chunks = [] + # Add to highlight buffer + highlight_buffer.append(chunk) - # Process highlighting - if len(highlight_chunks) >= HIGHLIGHT_BATCH_SIZE: - start_index = self.frame.output_textbox.index(f"end-{sum(len(c) for c in highlight_chunks)}c") - end_index = self.frame.output_textbox.index("end-1c") - self.highlight_words(start_index, end_index) + # Process highlighting when buffer is full + if len(highlight_buffer) == 5: + self.process_highlighting(highlight_buffer) - # Maintain overlap and reset for next batch - highlight_chunks = highlight_chunks[-OVERLAP_SIZE:] - - # Highlight remaining chunks if any - if highlight_chunks: - start_index = self.frame.output_textbox.index(f"end-{sum(len(c) for c in highlight_chunks)}c") - end_index = self.frame.output_textbox.index("end-1c") - self.highlight_words(start_index, end_index) + # Process any remaining chunks in the buffer + if highlight_buffer: + self.process_highlighting(highlight_buffer) self.frame.output_textbox.configure(state="disabled") + def process_highlighting(self, highlight_buffer): + start_index = self.frame.output_textbox.index(f"end-{sum(len(c) for c in highlight_buffer)}c") + end_index = self.frame.output_textbox.index("end") + self.highlight_words(start_index, end_index) + + # Keep overlap of 2 chunks + highlight_buffer = deque(list(highlight_buffer)[-2:], maxlen=5) def highlight_words(self, start_index, end_index): content = self.frame.output_textbox.get(start_index, end_index) - print(content) - current_index = start_index - while True: - # Find "FAKE" - fake_index = content.find("FAKE") - if fake_index != -1: - fake_pos_start = f"{current_index}+{fake_index}c" - fake_pos_end = f"{fake_pos_start}+4c" - self.frame.output_textbox.tag_add("fake_color", fake_pos_start, fake_pos_end) - self.frame.output_textbox.tag_config("fake_color", foreground="red") - content = content[fake_index + 4:] - current_index = fake_pos_end - else: - break - - current_index = start_index - content = self.frame.output_textbox.get(start_index, end_index) - - while True: - # Find "REAL" - real_index = content.find("REAL") - if real_index != -1: - real_pos_start = f"{current_index}+{real_index}c" - real_pos_end = f"{real_pos_start}+4c" - self.frame.output_textbox.tag_add("real_color", real_pos_start, real_pos_end) - self.frame.output_textbox.tag_config("real_color", foreground="green") - content = content[real_index + 4:] - current_index = real_pos_end - else: - break + for word in WORDS: + start = 0 + while True: + pos = content.find(word, start) + if pos == -1: + break + word_start = f"{start_index}+{pos}c" + word_end = f"{word_start}+{len(word)}c" + tag_name = f"{word.lower()}_color" + self.frame.output_textbox.tag_add(tag_name, word_start, word_end) + if word in BAD_WORDS: + self.frame.output_textbox.tag_config(tag_name, foreground=BAD_COLOR) + elif word in GOOD_COLOR: + self.frame.output_textbox.tag_config(tag_name, foreground=GOOD_COLOR) + start = pos + len(word) def prediction(self, text_data:TextData) -> TextData: diff --git a/src/views/mainScreen.py b/src/views/mainScreen.py index ef41506..1a02668 100644 --- a/src/views/mainScreen.py +++ b/src/views/mainScreen.py @@ -20,10 +20,10 @@ class MainFrame(ctk.CTkFrame): self.entry_url = ctk.CTkEntry(self.frame1, placeholder_text='Enter the article link', height=50) self.entry_url.grid(row=0, column=0, padx=10, pady=10, sticky="ew") - self.input_textbox = ctk.CTkTextbox(self.frame1, height=200) + self.input_textbox = ctk.CTkTextbox(self.frame1, height=150) self.input_textbox.grid(row=1, column=0, columnspan=2, padx=10, pady=10, sticky="nsew") - self.output_textbox = ctk.CTkTextbox(self.frame1, height=150, state="disabled") + self.output_textbox = ctk.CTkTextbox(self.frame1, height=200, state="disabled") self.output_textbox.grid(row=2, column=0, columnspan=2, padx=10, pady=10, sticky="nsew") # Mittlerer Button From d46ac83ca96088f6a3a626a90fa8c3efd490a470 Mon Sep 17 00:00:00 2001 From: Falko Habel Date: Wed, 9 Oct 2024 10:55:16 +0200 Subject: [PATCH 4/5] switched confidence with result --- src/controller/mainFrameController.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/controller/mainFrameController.py b/src/controller/mainFrameController.py index 2fdd2a0..81bcbc5 100644 --- a/src/controller/mainFrameController.py +++ b/src/controller/mainFrameController.py @@ -9,6 +9,8 @@ GOOD_WORDS = ["REAL"] BAD_COLOR = "#ff8080" GOOD_COLOR = "#80ff8f" WORDS = BAD_WORDS + GOOD_WORDS + + class MainFrameController: def __init__(self,frame:MainFrame) -> None: @@ -30,7 +32,7 @@ class MainFrameController: self.frame.output_textbox.configure(state="normal") self.frame.output_textbox.delete("0.0", "end") - response_stream = self.rater.get_response(text_data.text, text_data.confidence, text_data.result) + response_stream = self.rater.get_response(text_data.text, text_data.result, f"{text_data.confidence * 100:.2f}") highlight_buffer = deque(maxlen=5) From c1a52b32ad052e53a942f235dcc3a17d4d90fca4 Mon Sep 17 00:00:00 2001 From: Falko Habel Date: Wed, 9 Oct 2024 12:54:30 +0200 Subject: [PATCH 5/5] Verbesserte Text extrahierung --- src/Ai/llm.py | 24 +++++++----------------- src/controller/mainFrameController.py | 9 +++++---- src/utils/webTextExtractor.py | 11 ++++++----- 3 files changed, 18 insertions(+), 26 deletions(-) diff --git a/src/Ai/llm.py b/src/Ai/llm.py index da4396e..792fe91 100644 --- a/src/Ai/llm.py +++ b/src/Ai/llm.py @@ -15,10 +15,12 @@ class ArticleRater: "base_url": self.client, "model": "mistral-nemo:12b-instruct-2407-q8_0", "headers": self.headers, - "system": "ANTWORTE in der SPRACHE, die auch der ARTIKEL hat. Erkläre in 1-3 Sätzen, warum es sich um solch einen Artikel handeln könnte und woran man es erkennen kann. Beginne die NACHRICHT immer mit dem Resultat under Wahrscheinlichkeit" + "system": """Ein Mashine Learning Model hat einen Text bewertet, ob es sich um FakeNews handelt oder um Reale News. + Erkläre in 1-3 Sätzen warum dieses Modell zu dieser Entscheidung. Beginne die Antwort IMMER mit den Resultaten und Konfidenzen des Models. + DU SOLLST KEINE ÜBERSCHRIFTEN oder ähnliches ERKLÄREN. Du erhählst einen TEXT und sollst erklären wie das RESULTAT zustande kam""" } - message = (f"A Machine Learning Model labeled an article the following, but RESPOND in the LANGUAGE FROM the ARTICLE: Result: {result} Confidence: {confidence}, The Article: {article}") + message = (f"{article}, result: {result}, confidence {confidence}") # Initialize the Ollama object with the prepared parameters llm = Ollama(**ollama_params) @@ -30,21 +32,9 @@ class ArticleRater: if __name__ == "__main__": article_rater = ArticleRater() - article = """Butler (dpo) - Erneutes Totalversagen beim Secret Service: Ausgerechnet in Butler, dem Ort des vorigen Anschlags auf Donald Trump, ist es gestern zu einem schweren Cringe-Attentat auf den republikanischen Präsidentschaftskandidaten gekommen. Einem Schwerbeknackten gelang es, die Bühne zu stürmen und neben Trump mehrere Luftsprünge zu machen. - -Es sind Szenen, die sich nur schwer ertragen lassen: Zweimal hüpfte der 53-jährige Elon R. Musk manisch-euphorisch neben Trump in die Luft und präsentierte den Zuschauern dabei seinen Bauch. Danach hielt er eine extrem peinliche Rede, in der er Trump in den höchsten Tönen lobte. - -Nach den verstörenden Bildern steht nun erneut der Secret Service in der Kritik. Nach Einschätzung vieler Experten hätten die Agenten die zahlreichen Red Flags hinsichtlich der Cringe-Gefahr für Trump sofort erkennen und Elon Musk mit gezielten Schüssen niederstrecken müssen. - -"Wenn das nicht gelungen wäre, hätten sie sich spätestens, als Musk zum Luftsprung ansetzte, schützend vor den Kandidaten werfen müssen, um peinliche Pressebilder zu vermeiden", erklärt Sicherheitsanalyst Marc Tiede. "Das Versagen wiegt umso schwerer, weil es offenbar einzelne Zuschauer gab, die noch verzweifelt versuchten, die Agenten rechtzeitig vor Musk zu warnen, bevor die fatalen Sprünge fielen – vergeblich." - -Derzeit ist noch unklar, wie es nach dem schweren Cringe-Attentat um den Präsidentschaftskandidaten steht. Laut Medienberichten steht jedoch zu befürchten, dass sich Trumps Rizz bis zur Wahl nicht wieder von diesem Anschlag erholen wird. - -Der Secret Service und das FBI wollen jetzt Untersuchungen einleiten, wie es zu dem für alle Beteiligten höchst unangenehmen Vorfall kommen konnte. - -Bizarr: Elon Musk befindet sich trotz seiner Tat nach wie vor auf freiem Fuß und könnte jederzeit wieder auf republikanischen Wahlkampfveranstaltungen für peinliche Momente sorgen.""" - result = "FAKE" - confidence = 0.9996 + article = """die wöchentliche Glosse von Stefan Kuzmany Thüringer Landtag: AfD will stören - sichert stattdessen Stabilität der Regierung Ramelow Suche starten Suche öffnen Zur Ausgabe Artikel 79 / 79 Eklat bei Landtagssitzung Thüringer Demokratwurst Eine Glosse von Stefan Kuzmany Ordnungsrufe! Mikros aus! Sitzung unterbrochen! Der Thüringer Alterspräsident Jürgen Treutler (AfD) sichert mit kreativer Sitzungsleitung die Stabilität der Regierung Ramelow. 27.09.2024, 13.00 Uhr • aus DER SPIEGEL 40/2024 Zur Merkliste hinzufügen Artikel anhören (2 Minuten) 2 Min X.com Facebook E-Mail Link kopieren Weitere Optionen zum Teilen X.com Facebook E-Mail Messenger WhatsApp Link kopieren Bild vergrößern Jürgen Treutler (AfD) Foto: Bodo Schackow / dpa Sämtliche Sorgen, die AfD könnte nach ihrem dortigen Wahlerfolg die Demokratie in dem osthessischen Bundeslandstrich Thüringen abschaffen, erweisen sich als unbegründet. Tatsächlich zeigte sich auf der konstituierenden Sitzung des Erfurter Landtags am Donnerstag eindrucksvoll die Stabilität des bewährten Systems. Zu verdanken ist diese beruhigende Entwicklung dem wackeren Alterspräsidenten Jürgen Treutler (73), der bei seinem furiosen Debüt als Landesparlamentarier alle Möglichkeiten ausschöpfte, die ihm in seiner Rolle als Sitzungsleiter zustanden – und sogar noch einige mehr. DER SPIEGEL 40/2024 Foto: Melina Mara / The Washington Post / Getty Images Was kommt, falls sie gewinnt?Als Präsidentin würde Kamala Harris in einer krisengeschüttelten Welt regieren. Öffentlich beteuert sie, in die Fußstapfen von Joe Biden zu trreten, aber in der Außenpolitik will Harris eigene Akzente setzen. Für Europa ist das nicht nur eine gute Nachricht – in Sachhen Protektionismus ist sie eine Schülerin Trumps.Lesen Sie unsere Titelgeschichte, weitere Hintergründe und Analysen im digiitalen SPIEGEL. """ + result = "REAL" + confidence = 0.67 # Capture the stream response response_stream = article_rater.get_response(article, result, confidence=confidence) diff --git a/src/controller/mainFrameController.py b/src/controller/mainFrameController.py index 81bcbc5..fb1b8c9 100644 --- a/src/controller/mainFrameController.py +++ b/src/controller/mainFrameController.py @@ -4,8 +4,8 @@ from models.data import TextData from Ai.interence import VeraMindInference from Ai.llm import ArticleRater -BAD_WORDS = ["FAKE", "SATIRE"] -GOOD_WORDS = ["REAL"] +BAD_WORDS = ["FAKE", "SATIRE", "Fake", "fake"] +GOOD_WORDS = ["REAL", "real", "Real"] BAD_COLOR = "#ff8080" GOOD_COLOR = "#80ff8f" WORDS = BAD_WORDS + GOOD_WORDS @@ -28,11 +28,12 @@ class MainFrameController: def press_check_button(self): text_data = self.get_textdata() + print(text_data.text) self.prediction(text_data) self.frame.output_textbox.configure(state="normal") self.frame.output_textbox.delete("0.0", "end") - response_stream = self.rater.get_response(text_data.text, text_data.result, f"{text_data.confidence * 100:.2f}") + response_stream = self.rater.get_response(text_data.text, text_data.result, float(f"{text_data.confidence * 100:.2f}")) highlight_buffer = deque(maxlen=5) @@ -78,7 +79,7 @@ class MainFrameController: self.frame.output_textbox.tag_add(tag_name, word_start, word_end) if word in BAD_WORDS: self.frame.output_textbox.tag_config(tag_name, foreground=BAD_COLOR) - elif word in GOOD_COLOR: + elif word in GOOD_WORDS: self.frame.output_textbox.tag_config(tag_name, foreground=GOOD_COLOR) start = pos + len(word) diff --git a/src/utils/webTextExtractor.py b/src/utils/webTextExtractor.py index 3603160..97e2713 100644 --- a/src/utils/webTextExtractor.py +++ b/src/utils/webTextExtractor.py @@ -34,20 +34,21 @@ class WebTextExtractor: raise Exception("Kein Text extrahiert. Bitte zuerst extract_text() aufrufen.") def resize_article(self, article): - """Resizes the article by removing the first 30 words and the last 10%.""" + """Resizes the article by removing the first 30 words and limiting the length to 512 words.""" # Split the article into a list of words words = article.split() # Remove the first 30 words words = words[30:] - # Calculate the number of words to remove from the end (10% of the total words) - num_to_remove = int(len(words) * 0.1) + # Calculate the number of words to keep (up to 512 words) + num_to_keep = min(512, len(words)) - # Remove the last 10% of words - words = words[:-num_to_remove] + # Slice the list of words to keep only the first num_to_keep words + words = words[:num_to_keep] # Join the remaining words back into a single string resized_article = ' '.join(words) return resized_article +