A comprehensive evaluation toolkit for Arabic image captioning models with advanced text preprocessing, multiple metrics, and LLM-as-a-Judge capabilities.
- Advanced Arabic Text Processing: Diacritics removal, letter normalization, and intelligent tokenization
- Comprehensive Metrics: BLEU, ROUGE, cosine similarity, Jaccard, Lin similarity, and semantic similarity
- LLM-as-a-Judge: Optional evaluation using large language models (GPT-4, etc.)
- Rich Visualizations: Distribution plots, correlation matrices, performance analysis
- Multiple Output Formats: CSV, JSON, Excel with detailed results
- Performance Analysis: Best/worst examples, category analysis, length correlation
pip install -r requirements_evaluation.txt# Simple evaluation with auto-detected columns
python run_evaluation.py results.csv
# Specify column names
python run_evaluation.py results.csv Description arabic_captionfrom evaluation_main import evaluate_arabic_captions
import pandas as pd
# Load your data
df = pd.read_csv('your_results.csv')
# Run evaluation
results = evaluate_arabic_captions(
df=df,
ref_col='Description', # Ground truth column
cand_col='arabic_caption', # Generated caption column
save_results=True,
create_visualizations=True
)
# Access results
metrics_df = results['results_df']
summary = results['summary']
print(f"Average BLEU-4: {summary['bleu4_mean']:.4f}")from evaluation_main import evaluate_arabic_captions
# Configure LLM judge
llm_config = {
'api_key': 'your-openai-api-key',
'base_url': 'https://api.openai.com/v1', # or OpenRouter, etc.
'model_id': 'gpt-4o',
'max_samples': 100,
'run_evaluation': True
}
results = evaluate_arabic_captions(
df=df,
ref_col='Description',
cand_col='arabic_caption',
llm_judge_config=llm_config
)python evaluation_main.py results.csv \
--ref_col Description \
--cand_col arabic_caption \
--output_dir ./my_evaluation/ \
--llm_judge \
--api_key your-api-key \
--model_id gpt-4o \
--max_samples 50from arabic_text_processor import ArabicTextProcessor
from evaluation_metrics import EvaluationMetrics
from llm_judge import LLMJudge
# Text processing
processor = ArabicTextProcessor()
normalized_text = processor.normalize_arabic_text("النص العربي")
tokens = processor.advanced_tokenize_arabic("النص العربي")
# Metrics calculation
calculator = EvaluationMetrics()
scores = calculator.evaluate_single_pair("المرجع", "المُولد")
# LLM judge
judge = LLMJudge(api_key="your-key", base_url="url", model_id="gpt-4")
score = judge.judge_single_pair("المرجع", "المُولد")Your CSV file should contain at least two columns:
| Description (Reference) | arabic_caption (Generated) |
|---|---|
| صورة تاريخية تظهر مدينة القدس | صورة للمدينة القديمة |
| مشهد من الحياة اليومية | الناس في الشارع |
The evaluation automatically detects common column names:
Reference columns: Description, reference, ground_truth, caption
Candidate columns: arabic_caption, generated_caption, candidate, prediction
- BLEU-1 to BLEU-4: Precision-based metrics measuring n-gram overlap
- Higher values indicate better lexical similarity
- ROUGE-1: Unigram overlap
- ROUGE-2: Bigram overlap
- ROUGE-L: Longest common subsequence
- Character Cosine: Character-level TF-IDF similarity
- Word Cosine: Word-level TF-IDF similarity
- Jaccard: Set intersection over union
- Lin Similarity: Dice coefficient (2×intersection/total)
- Semantic: Weighted word overlap with frequency consideration
- Score Range: 1-10 scale
- Criteria: Semantic similarity, meaning preservation
- Models: Supports any OpenAI-compatible API
When save_results=True, the following files are created:
evaluation_output/
├── detailed_arabic_caption_evaluation_results.csv # Full results + metrics
├── metrics_only_evaluation_results.csv # Just the metrics
├── enhanced_evaluation_summary.json # Summary statistics
├── comprehensive_evaluation_results.xlsx # Multi-sheet Excel
└── plots/ # Visualizations
├── metrics_distribution.png
├── correlation_matrix.png
├── performance_categories.png
├── metric_comparison.png
└── length_analysis.png
- Diacritics Removal: Removes Tashkeel marks (ً ٌ ٍ َ ُ ِ ّ ْ)
- Letter Normalization:
- أإآا → ا (Alef variants)
- يى → ي (Yeh variants)
- ةه → ة (Teh Marbuta)
- Punctuation Cleaning: Removes Arabic and Latin punctuation
- Tokenization: Advanced Arabic-aware word splitting
processor = ArabicTextProcessor()
original = "هٰذِهِ صُورَةٌ جَمِيلَةٌ لِلْمَدِينَةِ القَدِيمَةِ"
normalized = processor.normalize_arabic_text(original)
# Result: "هذه صورة جميلة للمدينة القديمة"
tokens = processor.advanced_tokenize_arabic(original)
# Result: ["هذه", "صورة", "جميلة", "للمدينة", "القديمة"]Results are automatically categorized based on BLEU-4 scores:
- Excellent (>0.5): Very high quality matches
- Good (0.3-0.5): Good quality with minor differences
- Fair (0.1-0.3): Moderate quality, some similarity
- Poor (≤0.1): Low quality, little similarity
- Missing Dependencies:
pip install nltk rouge-score scikit-learn matplotlib seaborn- NLTK Data:
import nltk
nltk.download('punkt')-
OpenAI API Issues:
- Verify API key is correct
- Check rate limits
- Ensure model is available
-
Memory Issues:
- Process data in smaller batches
- Disable visualizations for large datasets
- Use
max_samplesparameter
The system validates Arabic text and reports issues:
- No Arabic characters: Text contains no Arabic script
- No meaningful content: Text is empty after normalization
- Insufficient tokens: Text too short for meaningful evaluation
Modify evaluation_config.py to customize:
# Change performance thresholds
PERFORMANCE_CATEGORIES = {
"excellent": 0.6, # Stricter threshold
"good": 0.4,
"fair": 0.2,
"poor": 0.0
}
# Adjust text processing
TFIDF_CONFIG = {
"char_ngram_range": (1, 3), # Shorter n-grams
"min_token_length": 3 # Longer minimum tokens
}evaluate_arabic_captions(df, ref_col, cand_col, save_results=True,
create_visualizations=True, output_dir="./",
llm_judge_config=None)ArabicTextProcessor: Text normalization and tokenizationEvaluationMetrics: Core metric calculationsLLMJudge: LLM-based evaluationEvaluationVisualizer: Plot generationArabicCaptionEvaluator: Main evaluation orchestrator
import glob
import pandas as pd
# Process multiple files
results_files = glob.glob("results_*.csv")
all_results = []
for file in results_files:
df = pd.read_csv(file)
result = evaluate_arabic_captions(df, save_results=False)
all_results.append({
'file': file,
'bleu4': result['summary']['bleu4_mean'],
'rouge_l': result['summary']['rougeL_mean']
})
comparison_df = pd.DataFrame(all_results)
print(comparison_df)from evaluation_metrics import EvaluationMetrics
calculator = EvaluationMetrics()
# Evaluate single pair
scores = calculator.evaluate_single_pair(
reference="صورة جميلة للمدينة القديمة",
candidate="صورة للمدينة التاريخية"
)
print(f"BLEU-4: {scores['bleu4']}")
print(f"Semantic: {scores['semantic_similarity']}")To extend the evaluation suite:
- Add new metrics: Extend
EvaluationMetricsclass - Custom preprocessing: Modify
ArabicTextProcessor - New visualizations: Add methods to
EvaluationVisualizer - Additional LLM providers: Extend
LLMJudgeclass
This evaluation suite is designed for research and educational purposes. Please ensure compliance with API provider terms when using LLM judge features.