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 a02677026c33d217b07506ec99bfea99f20c1d63
parent 9212ccc92b52c0b9d06181648ebc8e5a878eb8a8
Author: Sondre Wold <sondrewold1@gmail.com>
Date:   Tue, 26 Aug 2025 09:00:27 +0200

save distribution to json instead of csv

Diffstat:
Mget_epsilon.py | 47+++++++++++++++++++++++++++++------------------
1 file changed, 29 insertions(+), 18 deletions(-)

diff --git a/get_epsilon.py b/get_epsilon.py @@ -6,6 +6,7 @@ from experiment import Point import matplotlib.pyplot as plt from typing import Any +import json import pandas @@ -21,6 +22,7 @@ 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) + parser.add_argument("-percentile", type=float, default=None, help="The percentile for the epsilon value") return parser.parse_args() @@ -32,25 +34,22 @@ def get_dataset_and_model_name(filename: str) -> tuple[str, str]: def get_epsilons( - word_sims: numpy.ndarray, context_sims: numpy.ndarray, percentile: int = 80 -) -> dict[str, float]: + word_sims: numpy.ndarray, context_sims: numpy.ndarray +) -> dict[str, list[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]) # Equivalent to our formal relaxation - 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)) + original.append(float(1 - context_sims[i] / word_sims[i])) # Equivalent to our formal relaxation) + division.append(float(context_sims[i] / word_sims[i])) + additive.append(float(context_sims[i] - word_sims[i])) return { - "original": final_original, - "divisive": final_division, - "additive": final_additive, + "original": original, + "divisive": division, + "additive": additive, } @@ -59,6 +58,7 @@ def main() -> None: points_folder: str = args.points_path raw_files = list(pathlib.Path(points_folder).glob("*.pkl")) + final_result: dict[str, Any] = { "dataset": [], "model": [], @@ -77,15 +77,26 @@ def main() -> None: context_sims: numpy.ndarray = numpy.array( [point.contextualized_similarity for point in points] ) - tmp_result: dict[str, float] = get_epsilons(word_sims, context_sims) + tmp_result: dict[str, list[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=",", index=False) + if args.percentile is not None: # Save the percentile epsilons to disk as a csv + final_original: Any = float(numpy.percentile(tmp_result["original"], args.percentile)) + final_division: Any = float(numpy.percentile(tmp_result["divisive"], args.percentile)) + final_additive: Any = float(numpy.percentile(tmp_result["additive"], args.percentile)) + else: + final_original = tmp_result["original"] + final_division = tmp_result["divisive"] + final_additive = tmp_result["additive"] + + final_result["original"].append(final_original) + final_result["divisive"].append(final_division) + final_result["additive"].append(final_additive) + + #df: pandas.DataFrame = pandas.DataFrame.from_dict(final_result) + #df.to_csv(args.result_path, sep=",", index=False) + with open(args.result_path, "w") as f: + json.dump(final_result, f) if __name__ == "__main__":