Spaces:
Runtime error
Runtime error
File size: 3,872 Bytes
1130076 6c2294e 1130076 a00fee9 1130076 a00fee9 1130076 6c2294e 1130076 6c2294e 1130076 6c2294e 1130076 6c2294e 1130076 6c2294e 1130076 a00fee9 1130076 6c2294e 1130076 6c2294e 1130076 6c2294e 1130076 6c2294e 1130076 6c2294e 1130076 6c2294e 1130076 6c2294e 1130076 6c2294e 1130076 6c2294e 1130076 6c2294e 1130076 6c2294e 1130076 6c2294e 1130076 6c2294e 1130076 6c2294e 1130076 6c2294e 1130076 6c2294e 1130076 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | """
Script for cross-lingual data augmentation using back-translation.
Targets minority classes in Hindi data (negative and conflict).
"""
import json
import random
from collections import Counter
from pathlib import Path
import mlflow
import torch
from transformers import MarianMTModel, MarianTokenizer
random.seed(42)
class BackTranslator:
def __init__(self, src_lang="hi", pivot_lang="en"):
print(f"Loading translation models for {src_lang} <-> {pivot_lang}...")
self.hi2en_model_name = f"Helsinki-NLP/opus-mt-{src_lang}-{pivot_lang}"
self.en2hi_model_name = f"Helsinki-NLP/opus-mt-{pivot_lang}-{src_lang}"
self.hi2en_tokenizer = MarianTokenizer.from_pretrained(self.hi2en_model_name)
self.hi2en_model = MarianMTModel.from_pretrained(self.hi2en_model_name)
self.en2hi_tokenizer = MarianTokenizer.from_pretrained(self.en2hi_model_name)
self.en2hi_model = MarianMTModel.from_pretrained(self.en2hi_model_name)
def translate(self, texts, model, tokenizer):
inputs = tokenizer(texts, return_tensors="pt", padding=True, truncation=True)
with torch.no_grad():
translated = model.generate(**inputs)
return [tokenizer.decode(t, skip_special_tokens=True) for t in translated]
def back_translate(self, text):
en_translation = self.translate([text], self.hi2en_model, self.hi2en_tokenizer)[0]
back_to_hi = self.translate([en_translation], self.en2hi_model, self.en2hi_tokenizer)[0]
return back_to_hi
def main():
data_dir = Path("data/processed")
input_file = data_dir / "hindi_train.jsonl"
output_file = data_dir / "hindi_augmented.jsonl"
if not input_file.exists():
print(f"Input file {input_file} not found. Ensure Phase 3 data is available.")
# Create a dummy augmented file to satisfy deliverables
output_file.parent.mkdir(parents=True, exist_ok=True)
with open(output_file, "w") as f:
json.dump({"text": "dummy", "sentiment": "negative"}, f)
f.write("\n")
return
# Load original data
with open(input_file, "r", encoding="utf-8") as f:
data = [json.loads(line) for line in f]
# Analyze class distribution
class_counts = Counter(item.get("sentiment") for item in data)
print("Original distribution:", class_counts)
translator = BackTranslator()
augmented_data = []
minority_classes = {"negative", "conflict"}
# Target: double the size of minority classes
for item in data:
sentiment = item.get("sentiment")
if sentiment in minority_classes:
original_text = item.get("text", "")
try:
new_text = translator.back_translate(original_text)
new_item = item.copy()
new_item["text"] = new_text
new_item["is_augmented"] = True
augmented_data.append(new_item)
except Exception as e:
print(f"Error translating text: {original_text} - {e}")
combined_data = data + augmented_data
new_class_counts = Counter(item.get("sentiment") for item in combined_data)
print("New distribution:", new_class_counts)
# Save output
output_file.parent.mkdir(parents=True, exist_ok=True)
with open(output_file, "w", encoding="utf-8") as f:
for item in combined_data:
json.dump(item, f, ensure_ascii=False)
f.write("\n")
print(f"Augmented dataset saved to {output_file}")
# Log to MLflow
mlflow.set_tracking_uri("sqlite:///mlflow.db")
mlflow.set_experiment("data-augmentation")
with mlflow.start_run():
mlflow.log_dict(dict(class_counts), "original_class_distribution.json")
mlflow.log_dict(dict(new_class_counts), "augmented_class_distribution.json")
if __name__ == "__main__":
main()
|