multilingual-absa / src /absa /data /dataset.py
Aryan Mishra
Add CI, typed ORM models, and packaging cleanup
a00fee9
Raw
History Blame
2.75 kB
import json
from collections import defaultdict
from datasets import load_from_disk
from absa.data.lang_detect import detect_language
from absa.data.preprocess import clean
from absa.utils.config import RAW_DIR, SEMEVAL_TEST_PATH, SEMEVAL_TRAIN_PATH
def process_semeval():
rest_path = RAW_DIR / "semeval_restaurants"
lap_path = RAW_DIR / "semeval_laptops"
rest_data = load_from_disk(str(rest_path))
lap_data = load_from_disk(str(lap_path))
train_samples: dict[tuple[str, str], list[dict[str, str]]] = defaultdict(list)
test_samples: dict[tuple[str, str], list[dict[str, str]]] = defaultdict(list)
for ds_name, ds, source_name in [
("train", rest_data["train"], "restaurants"),
("test", rest_data["test"], "restaurants"),
("train", lap_data["train"], "laptops"),
("test", lap_data["test"], "laptops"),
]:
target = train_samples if ds_name == "train" else test_samples
for row in ds:
text = row["text"]
span = row["span"]
label = row["label"]
target[(text, source_name)].append({"term": span, "polarity": label})
SEMEVAL_TRAIN_PATH.parent.mkdir(parents=True, exist_ok=True)
for path, data_dict in [
(SEMEVAL_TRAIN_PATH, train_samples),
(SEMEVAL_TEST_PATH, test_samples),
]:
total = 0
lang_counts: defaultdict[str, int] = defaultdict(int)
with open(path, "w", encoding="utf-8") as f:
for (text, source), aspects in data_dict.items():
lang = detect_language(text)
cleaned_text = clean(text, lang)
lang_counts[lang] += 1
final_aspects = []
for aspect in aspects:
term_clean = clean(aspect["term"], lang)
from_idx = cleaned_text.find(term_clean)
to_idx = from_idx + len(term_clean) if from_idx != -1 else -1
final_aspects.append(
{
"term": term_clean,
"polarity": aspect["polarity"],
"from": from_idx,
"to": to_idx,
}
)
sample = {
"text": cleaned_text,
"language": lang,
"aspect_terms": final_aspects,
"source": source,
}
f.write(json.dumps(sample, ensure_ascii=False) + "\n")
total += 1
print(f"SemEval {path.stem} samples: {total}")
print(f"SemEval {path.stem} languages: {dict(lang_counts)}")
if __name__ == "__main__":
process_semeval()