BakalarskaPraca/T5_slovak_4_3_1/met_sk.py

124 lines
5.6 KiB
Python

import os
from rouge_score import rouge_scorer
from bert_score import score
import nltk
# Automatické stiahnutie 'punkt' ak ešte nie je k dispozícii
try:
nltk.data.find("tokenizers/punkt")
except LookupError:
nltk.download("punkt")
# ----------------------
# Funkcia na načítanie všetkých textových súborov z priečinka
# Používa sa na načítanie referenčných textov pacientov s Alzheimerom
# ----------------------
def load_texts_from_folder(folder_path):
texts = []
for filename in os.listdir(folder_path):
if filename.endswith(".txt"):
with open(
os.path.join(folder_path, filename), "r", encoding="utf-8"
) as file:
texts.append(file.read().strip())
return texts
# Cesta k referenčným textom pacientov
script_dir = os.path.dirname(os.path.abspath(__file__))
project_root = os.path.abspath(os.path.join(script_dir, ".."))
dementia_folder = os.path.join(project_root, "text", "chory_cleaned", "4")
reference_texts_dementia = load_texts_from_folder(dementia_folder)
# Kontrola: či súborový priečinok nie je prázdny
if not reference_texts_dementia:
raise ValueError(" V zložke nie sú žiadne .txt súbory! Skontroluj cestu.")
print(f" Načítaných {len(reference_texts_dementia)} chorých textov na porovnanie.")
# ----------------------
# Manuálne zadaný zdravý (originálny) text
# a text vygenerovaný modelom s "narušenou" štylistikou
# ----------------------
original_text_healthy = """no mamička ktorá má všetko sama na starosť. varí drží plačúce dieťa na rukách. telefonuje čiže asi aj pracuje alebo vybavuje alebo ska a nie rozmýšľa tam. nakupuje topánky cez telefón. na polici nám sedí mačka ktorá vysypala. neviem či sú to klinčeky alebo niečo. padá nám to do na počítač. máme tam rozložené jedlo. mamička samozrejme nestíha. vypráža vajíčka robí hemendex. áno lebo letí tam šunka aj vajíčka tam sú. na polici sú tri knihy. poobede čiže nestíhajú obed. už je po dvanástej hodine. a dieťa je hladné strašne plače. není naň čas. mamička je proste v jednom kole stále."""
generated_text = """na polici sú tri knihy. je tam ešte jedna kniha ktorá sa dá prečítať ale neviem či to má nejaký význam alebo čo to môže byť. a dieťa plače. v ruke drží fľašu s vodou. niečo jej chýba. no nič iné. všetko ostatné je už hotové. deti plačú. spia. mama varí obed."""
# ----------------------
# Výpočet metriky ROUGE (porovnávanie na úrovni slov a fráz)
# ----------------------
def evaluate_text(reference_texts, generated_text):
scorer = rouge_scorer.RougeScorer(["rouge1", "rougeL"], use_stemmer=False)
rouge1_scores = []
rougeL_scores = []
for ref_text in reference_texts:
scores = scorer.score(ref_text, generated_text)
rouge1_scores.append(scores["rouge1"].fmeasure)
rougeL_scores.append(scores["rougeL"].fmeasure)
return {
"ROUGE-1-best": max(rouge1_scores),
"ROUGE-1-mean": sum(rouge1_scores) / len(rouge1_scores),
"ROUGE-L-best": max(rougeL_scores),
"ROUGE-L-mean": sum(rougeL_scores) / len(rougeL_scores),
}
# ----------------------
# Výpočet metriky BERTScore (porovnávanie na úrovni významu)
# Používa sa multilingválny model (napr. XLM-RoBERTa)
# ----------------------
# BERTScore s explicitne zvoleným modelom pre slovenský jazyk
def compute_bert_score(reference_texts, generated_text):
try:
P, R, F1 = score(
cands=[generated_text] * len(reference_texts),
refs=[[ref] for ref in reference_texts],
lang="sk",
model_type="xlm-roberta-large", # 🔥 Multilingválny model s podporou SK
rescale_with_baseline=False,
)
return {
"BERTScore-F1-best": F1.max().item(),
"BERTScore-F1-mean": F1.mean().item(),
}
except Exception as e:
print(f"⚠ Chyba pri výpočte BERTScore: {e}")
return {"BERTScore-F1-best": 0, "BERTScore-F1-mean": 0}
# ----------------------
# Vyhodnotenie vygenerovaného textu:
# - v porovnaní s pacientmi
# - v porovnaní s pôvodným zdravým textom
# ----------------------
results_to_dementia = evaluate_text(reference_texts_dementia, generated_text)
bert_results_dementia = compute_bert_score(reference_texts_dementia, generated_text)
results_to_original = evaluate_text([original_text_healthy], generated_text)
bert_results_original = compute_bert_score([original_text_healthy], generated_text)
# ----------------------
# Výpis výsledkov do konzoly (pre vizuálne vyhodnotenie kvality transformácie)
# ----------------------
print("\n VÝSLEDKY POROVNANIA TEXTU\n")
print(" **Porovnanie s textami pacientov s Alzheimerom** (ČÍM VYŠŠIE, TÝM LEPŠIE):")
print(
f" ROUGE-1: najvyššie = {results_to_dementia['ROUGE-1-best']:.4f} | priemer = {results_to_dementia['ROUGE-1-mean']:.4f}"
)
print(
f" ROUGE-L: najvyššie = {results_to_dementia['ROUGE-L-best']:.4f} | priemer = {results_to_dementia['ROUGE-L-mean']:.4f}"
)
print(
f" BERTScore: najvyššie = {bert_results_dementia['BERTScore-F1-best']:.4f} | priemer = {bert_results_dementia['BERTScore-F1-mean']:.4f}"
)
print("\n **Porovnanie s pôvodným zdravým textom** (ČÍM NIŽŠIE, TÝM LEPŠIE):")
print(f" ROUGE-1: {results_to_original['ROUGE-1-best']:.4f}")
print(f" ROUGE-L: {results_to_original['ROUGE-L-best']:.4f}")
print(f" BERTScore: {bert_results_original['BERTScore-F1-mean']:.4f}")