| """ |
| Ekalavya - Multi-Lingual Tokenizer |
| Supports ALL Indian languages + English |
| """ |
| import json |
| import unicodedata |
| from typing import List, Dict |
|
|
|
|
| class IndianLanguageTokenizer: |
| """ |
| Tokenizer for ALL Indian languages + English |
| Supports: Hindi, Bengali, Telugu, Tamil, Marathi, Gujarati, Kannada, |
| Malayalam, Odia, Punjabi, Urdu, and more |
| """ |
| |
| def __init__(self, vocab_size: int = 150000): |
| self.vocab_size = vocab_size |
| self.stoi: Dict[str, int] = {} |
| self.itos: Dict[int, str] = {} |
| self._build_base_vocab() |
| |
| def _build_base_vocab(self): |
| """Build base vocabulary with all Indian scripts""" |
| idx = 0 |
| |
| |
| special_tokens = ['<pad>', '<unk>', '<s>', '</s>', '<mask>', '<think>', '</think>'] |
| for token in special_tokens: |
| self.stoi[token] = idx |
| self.itos[idx] = token |
| idx += 1 |
| |
| |
| for i in range(32, 127): |
| char = chr(i) |
| self.stoi[char] = idx |
| self.itos[idx] = char |
| idx += 1 |
| |
| |
| for i in range(0x0900, 0x097F): |
| char = chr(i) |
| self.stoi[char] = idx |
| self.itos[idx] = char |
| idx += 1 |
| |
| |
| for i in range(0x0980, 0x09FF): |
| char = chr(i) |
| self.stoi[char] = idx |
| self.itos[idx] = char |
| idx += 1 |
| |
| |
| for i in range(0x0A00, 0x0A7F): |
| char = chr(i) |
| self.stoi[char] = idx |
| self.itos[idx] = char |
| idx += 1 |
| |
| |
| for i in range(0x0A80, 0x0AFF): |
| char = chr(i) |
| self.stoi[char] = idx |
| self.itos[idx] = char |
| idx += 1 |
| |
| |
| for i in range(0x0B00, 0x0B7F): |
| char = chr(i) |
| self.stoi[char] = idx |
| self.itos[idx] = char |
| idx += 1 |
| |
| |
| for i in range(0x0B80, 0x0BFF): |
| char = chr(i) |
| self.stoi[char] = idx |
| self.itos[idx] = char |
| idx += 1 |
| |
| |
| for i in range(0x0C00, 0x0C7F): |
| char = chr(i) |
| self.stoi[char] = idx |
| self.itos[idx] = char |
| idx += 1 |
| |
| |
| for i in range(0x0C80, 0x0CFF): |
| char = chr(i) |
| self.stoi[char] = idx |
| self.itos[idx] = char |
| idx += 1 |
| |
| |
| for i in range(0x0D00, 0x0D7F): |
| char = chr(i) |
| self.stoi[char] = idx |
| self.itos[idx] = char |
| idx += 1 |
| |
| |
| for i in range(0x0D80, 0x0DFF): |
| char = chr(i) |
| self.stoi[char] = idx |
| self.itos[idx] = char |
| idx += 1 |
| |
| |
| for i in range(0x0600, 0x06FF): |
| char = chr(i) |
| self.stoi[char] = idx |
| self.itos[idx] = char |
| idx += 1 |
| |
| self.vocab_size = len(self.stoi) |
| |
| def encode(self, text: str) -> List[int]: |
| """Encode text to token IDs""" |
| tokens = [] |
| for char in text: |
| if char in self.stoi: |
| tokens.append(self.stoi[char]) |
| else: |
| tokens.append(self.stoi['<unk>']) |
| return tokens |
| |
| def decode(self, tokens: List[int]) -> str: |
| """Decode token IDs to text""" |
| chars = [] |
| for token in tokens: |
| if token in self.itos: |
| char = self.itos[token] |
| if char not in ['<pad>', '<unk>', '<s>', '</s>', '<mask>', '<think>', '</think>']: |
| chars.append(char) |
| return ''.join(chars) |
| |
| def save(self, path: str): |
| """Save tokenizer""" |
| data = { |
| 'stoi': self.stoi, |
| 'itos': {str(k): v for k, v in self.itos.items()}, |
| 'vocab_size': self.vocab_size |
| } |
| with open(path, 'w', encoding='utf-8') as f: |
| json.dump(data, f, ensure_ascii=False, indent=2) |
| |
| @classmethod |
| def load(cls, path: str): |
| """Load tokenizer""" |
| with open(path, 'r', encoding='utf-8') as f: |
| data = json.load(f) |
| |
| tok = cls() |
| tok.stoi = data['stoi'] |
| tok.itos = {int(k): v for k, v in data['itos'].items()} |
| tok.vocab_size = data['vocab_size'] |
| return tok |
|
|
|
|
| |
| MULTILINGUAL_DATA = """ |
| # English |
| Hello, how are you? I am fine, thank you. |
| The weather is beautiful today. Let's go for a walk. |
| |
| # Hindi (हिंदी) |
| नमस्ते, आप कैसे हैं? मैं ठीक हूँ, धन्यवाद। |
| आज मौसम बहुत सुंदर है। चलिए सैर पर चलते हैं। |
| |
| # Bengali (বাংলা) |
| নমস্কার, আপনি কেমন আছেন? আমি ভালো আছি, ধন্যবাদ। |
| আজ আবহাওয়া খুব সুন্দর। চলুন হাঁটতে যাই। |
| |
| # Telugu (తెలుగు) |
| నమస్కారం, మీరు ఎలా ఉన్నారు? నేను బాగున్నాను, ధన్యవాదాలు. |
| ఈ రోజు వాతావరణం చాలా అందంగా ఉంది. నడుద్దాం. |
| |
| # Tamil (தமிழ்) |
| வணக்கம், நீங்கள் எப்படி இருக்கிறீர்கள்? நான் நலமாக இருக்கிறேன், நன்றி. |
| இன்று வானிலை மிகவும் அழகாக உள்ளது. நடக்க செல்வோம். |
| |
| # Marathi (मराठी) |
| नमस्कार, तुम्ही कसे आहात? मी बरा आहे, धन्यवाद. |
| आज हवामान खूप सुंदर आहे. चला फिरायला जाऊ. |
| |
| # Gujarati (ગુજરાતી) |
| નમસ્તે, તમે કેમ છો? હું બરાબર છું, આભાર. |
| આજે હવામાન ખૂબ સુંદર છે. ચાલો ફરવા જઈએ. |
| |
| # Kannada (ಕನ್ನಡ) |
| ನಮಸ್ಕಾರ, ನೀವು ಹೇಗಿದ್ದೀರಿ? ನಾನು ಚೆನ್ನಾಗಿದ್ದೇನೆ, ಧನ್ಯವಾದಗಳು. |
| ಇಂದು ಹವಾಮಾನ ತುಂಬಾ ಸುಂದರವಾಗಿದೆ. ನಡೆಯಲು ಹೋಗೋಣ. |
| |
| # Malayalam (മലയാളം) |
| നമസ്കാരം, സുഖമാണോ? ഞാൻ സുഖമായിരിക്കുന്നു, നന്ദി. |
| ഇന്ന് കാലാവസ്ഥ വളരെ മനോഹരമാണ്. നടക്കാൻ പോകാം. |
| |
| # Punjabi (ਪੰਜਾਬੀ) |
| ਸਤਿ ਸ੍ਰੀ ਅਕਾਲ, ਤੁਸੀਂ ਕਿਵੇਂ ਹੋ? ਮੈਂ ਠੀਕ ਹਾਂ, ਧੰਨਵਾਦ। |
| ਅੱਜ ਮੌਸਮ ਬਹੁਤ ਸੁੰਦਰ ਹੈ। ਚੱਲੋ ਸੈਰ ਕਰਨ ਚੱਲੀਏ। |
| |
| # Odia (ଓଡ଼ିଆ) |
| ନମସ୍କାର, ଆପଣ କେମିତି ଅଛନ୍ତି? ମୁଁ ଭଲ ଅଛି, ଧନ୍ୟବାଦ। |
| ଆଜି ପାଗ ବହୁତ ସୁନ୍ଦର ଅଛି। ଚଲନ୍ତୁ ବୁଲିବାକୁ ଯିବା। |
| |
| # Urdu (اردو) |
| السلام علیکم، آپ کیسے ہیں؟ میں ٹھیک ہوں، شکریہ۔ |
| آج موسم بہت خوبصورت ہے۔ چلیں سیر کرتے ہیں۔ |
| |
| # Mathematics |
| 2 + 2 = 4 |
| The area of a circle is πr² |
| Euler's formula: e^(iπ) + 1 = 0 |
| |
| # Science |
| Photosynthesis: 6CO₂ + 6H₂O → C₆H₁₂O₆ + 6O₂ |
| Newton's second law: F = ma |
| Speed of light: c = 299,792,458 m/s |
| |
| # Common phrases across languages |
| Good morning / सुप्रभात / सुप्रভাত / ಶುಭೋದಯ / സുപ്രഭാതം / காலை வணக்கம் |
| Thank you / धन्यवाद / ধন্যবাদ / ధన్యవాదాలు / நன்றி / धन्यवाद / ਧੰਨਵਾਦ |
| """ |
|
|
|
|
| if __name__ == '__main__': |
| print("="*70) |
| print("EKALAVYA MYTHOS - Multi-Lingual Tokenizer") |
| print("="*70) |
| |
| |
| tok = IndianLanguageTokenizer() |
| print(f"\n✅ Tokenizer created: {tok.vocab_size} tokens") |
| |
| |
| test_texts = [ |
| ("English", "Hello, how are you?"), |
| ("Hindi", "नमस्ते, आप कैसे हैं?"), |
| ("Bengali", "নমস্কার, আপনি কেমন আছেন?"), |
| ("Telugu", "నమస్కారం, మీరు ఎలా ఉన్నారు?"), |
| ("Tamil", "வணக்கம், நீங்கள் எப்படி இருக்கிறீர்கள்?"), |
| ("Marathi", "नमस्कार, तुम्ही कसे आहात?"), |
| ("Gujarati", "નમસ્તે, તમે કેમ છો?"), |
| ("Kannada", "ನಮಸ್ಕಾರ, ನೀವು ಹೇಗಿದ್ದೀರಿ?"), |
| ("Malayalam", "നമസ്കാരം, സുഖമാണോ?"), |
| ("Punjabi", "ਸਤਿ ਸ੍ਰੀ ਅਕਾਲ, ਤੁਸੀਂ ਕਿਵੇਂ ਹੋ?"), |
| ] |
| |
| print("\n🌍 Testing Multi-Lingual Support:") |
| for lang, text in test_texts: |
| encoded = tok.encode(text) |
| decoded = tok.decode(encoded) |
| match = "✓" if decoded == text else "✗" |
| print(f" {match} {lang:12s}: {text}") |
| |
| |
| print("\n📚 Training tokenizer on multi-lingual data...") |
| data_tokens = tok.encode(MULTILINGUAL_DATA) |
| print(f" Sample data: {len(MULTILINGUAL_DATA)} chars → {len(data_tokens)} tokens") |
| |
| print("\n" + "="*70) |
| print("✅ Tokenizer ready for ALL Indian languages!") |
| print("="*70) |
|
|