| import numpy as np |
| import pandas as pd |
| from sklearn.metrics.pairwise import cosine_similarity |
| from sklearn.feature_extraction.text import CountVectorizer |
|
|
| from datasets import load_metric |
|
|
| import nltk |
| from nltk.tokenize import wordpunct_tokenize |
| from nltk.corpus import stopwords |
| import nltk.translate.bleu_score as bleu |
| from nltk.translate.bleu_score import SmoothingFunction |
| import nltk.translate.gleu_score as gleu |
| import nltk.translate.meteor_score as meteor |
|
|
| from jiwer import wer, mer |
|
|
| import re |
| import math |
| from collections import Counter |
| import string |
| from tqdm import tqdm |
|
|
|
|
| nltk.download('stopwords') |
| stopwords = stopwords.words("english") |
|
|
|
|
| df = pd.read_csv("./test_generated.csv", sep="\t") |
| true_recipes = df["true_recipe"].values.tolist() |
| generated_recipes = df["generated_recipe"].values.tolist() |
|
|
| def cleaning(text, rm_sep=True, rm_nl=True, rm_punk_stopwords=True): |
| if rm_sep: |
| text = text.replace("--", " ") |
| |
| if rm_nl: |
| text = text.replace("\n", " ") |
|
|
| if rm_punk_stopwords: |
| text = " ".join([word.strip() for word in wordpunct_tokenize(text) if word not in string.punctuation and word not in stopwords and word]) |
| else: |
| text = " ".join([word.strip() for word in wordpunct_tokenize(text) if word.strip()]) |
|
|
| text = text.lower() |
| return text |
|
|
| X, Y = [], [] |
| for x, y in tqdm(zip(true_recipes, generated_recipes), total=len(df)): |
| x, y = cleaning(x, True, True, True), cleaning(y, True, True, True) |
|
|
| if len(x) > 16 and len(y) > 16: |
| X.append(x) |
| Y.append(y) |
|
|
|
|
| print(f"Sample X: {X[0]}") |
| print(f"Sample Y: {Y[0]}") |
|
|
| def get_cosine(vec1, vec2): |
| intersection = set(vec1.keys()) & set(vec2.keys()) |
| numerator = sum([vec1[x] * vec2[x] for x in intersection]) |
|
|
| sum1 = sum([vec1[x]**2 for x in vec1.keys()]) |
| sum2 = sum([vec2[x]**2 for x in vec2.keys()]) |
| denominator = math.sqrt(sum1) * math.sqrt(sum2) |
|
|
| if not denominator: |
| return 0.0 |
| else: |
| return float(numerator) / denominator |
|
|
| def text_to_vector(text): |
| word = re.compile(r'\w+') |
| words = word.findall(text) |
| return Counter(words) |
|
|
| def get_result(content_a, content_b): |
| text1 = content_a |
| text2 = content_b |
|
|
| vector1 = text_to_vector(text1) |
| vector2 = text_to_vector(text2) |
|
|
| cosine_result = get_cosine(vector1, vector2) |
| return cosine_result |
|
|
|
|
| cosim_scores = [] |
| for i in tqdm(range(len(X))): |
| cosim_scores.append(get_result(X[i], Y[i])) |
|
|
| cosim_score = np.array(cosim_scores).mean() |
| print(f"Cosine similarity score: {cosim_score}") |
|
|
| X, Y = [], [] |
| for x, y in tqdm(zip(true_recipes, generated_recipes), total=len(df)): |
| x, y = cleaning(x, True, True, False), cleaning(y, True, True, False) |
|
|
| if len(x) > 16 and len(y) > 16: |
| X.append(x) |
| Y.append(y) |
| |
| |
| wer = load_metric("wer") |
| wer_score = wer.compute(predictions=Y, references=X) |
| print(f"WER score: {wer_score}") |
|
|
| |
| rouge = load_metric("rouge") |
| rouge_score = rouge.compute(predictions=Y, references=X, use_stemmer=True) |
| rouge_score = {key: value.mid.fmeasure * 100 for key, value in rouge_score.items()} |
| print(f"Rouge score: {rouge_score}") |
|
|
| bleu = load_metric("bleu") |
| def postprocess_text(preds, labels): |
| preds = [wordpunct_tokenize(pred) for pred in preds] |
| labels = [[wordpunct_tokenize(label)] for label in labels] |
|
|
| return preds, labels |
|
|
| Y, X = postprocess_text(Y, X) |
| bleu_score = bleu.compute(predictions=Y, references=X)["bleu"] |
| print(f"BLEU score: {bleu_score}") |