124 lines
5.6 KiB
Python
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}")
|