epsilon-compositionality

Code for our paper Measuring Idiomaticity in Text Embedding Models with 𝜀-compositionality
git clone https://esimon.eu/repos/epsilon-compositionality.git
Log | Files | Refs | Submodules | README

commit 5b41abe6e5efdcfd13c6cf20407422dae40fdd96
parent c40575d579cb4cc46119c52a5d8eb1d381c78796
Author: Sondre Wold <sondrewold1@gmail.com>
Date:   Mon, 18 Aug 2025 14:31:09 +0200

calculate epsilon for all result files

Diffstat:
Aget_epsilon.py | 92+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 92 insertions(+), 0 deletions(-)

diff --git a/get_epsilon.py b/get_epsilon.py @@ -0,0 +1,92 @@ +import sys +import pickle +import numpy +from torch import histogram +from experiment import Point +import matplotlib.pyplot as plt + +from typing import Any + +import pandas + +import argparse +import pathlib + +import warnings + +warnings.filterwarnings("ignore") + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description="Gather epsilon values") + parser.add_argument("-points_path", type=pathlib.Path) + parser.add_argument("-result_path", type=pathlib.Path) + return parser.parse_args() + + +def get_dataset_and_model_name(filename: str) -> tuple[str, str]: + result_arguments: list[str] = filename.split("_") + dataset_name: str = result_arguments[0] + model_name: str = result_arguments[1] + return dataset_name, model_name + + +def get_epsilons( + word_sims: numpy.ndarray, context_sims: numpy.ndarray, percentile: int = 80 +) -> dict[str, float]: + # Epsilons + original: list[float] = [] + division: list[float] = [] + additive: list[float] = [] + for i in range(len(word_sims)): + if word_sims[i] > 0: + original.append(1 - context_sims[i] / word_sims[i]) + division.append(context_sims[i] / word_sims[i]) + additive.append(context_sims[i] - word_sims[i]) + final_original: float = float(numpy.percentile(original, percentile)) + final_division: float = float(numpy.percentile(division, percentile)) + final_additive: float = float(numpy.percentile(additive, percentile)) + + return { + "original": final_original, + "divisive": final_division, + "additive": final_additive, + } + + +def main() -> None: + args = parse_args() + points_folder: str = args.points_path + raw_files = list(pathlib.Path(points_folder).glob("*.pkl")) + + final_result: dict[str, Any] = { + "dataset": [], + "model": [], + "original": [], + "divisive": [], + "additive": [], + } + for raw_file in raw_files: + with open(raw_file, "rb") as file: + points: list[Point] = pickle.load(file) + dataset_name, model_name = get_dataset_and_model_name(raw_file.name) + n: int = len(points) + word_sims: numpy.ndarray = numpy.array( + [point.phrase_similarity for point in points] + ) + context_sims: numpy.ndarray = numpy.array( + [point.contextualized_similarity for point in points] + ) + tmp_result: dict[str, float] = get_epsilons(word_sims, context_sims) + final_result["dataset"].append(dataset_name) + final_result["model"].append(model_name) + final_result["original"].append(tmp_result["original"]) + final_result["divisive"].append(tmp_result["divisive"]) + final_result["additive"].append(tmp_result["additive"]) + + df: pandas.DataFrame = pandas.DataFrame.from_dict(final_result) + df.to_csv(args.result_path, sep=",") + + +if __name__ == "__main__": + main()