Year in Review 2021

2021 was a difficult year for everyone surviving into second year of global pandemic; however for Tamil computing community had much progress; here is my take on it.

EventCommentsDate
1Rust language supportTokenizer for REST rust_v0.1Jan 17th ’21
2open-tamil v1.0Release v1.0 : bug-fix pypi Apr 18th ’21
3tamilinayavaani v0.14Release v0.14 : pypiDec 5th ’21
4Book Translation of ‘Practical
Algorithms and Data Structures’
pending – typeset + copy-edit; 220 page bookNov ’21
5Relaunch Min Madurai Tamil appGoogle Play Store : linkSep 8 ’21
6Tutorial for TIC 20th – Keras AIBeginning AI applications: linkDec 4th ’21
Ezhil Language Foundation related activities in 2021

This year has been tough but we keep our head above the water for another challenging year 2022. I’m also happy to share I’ve volunteered to serve in the steering committee at INFITT organization to share some of open-source view points from my experience and some AI/ML strategies for developing our ecosystem.

Some of the major events by INFITT in 2021 are successful organization of Hackathon for college students at KCT in Kovai; 20th TIC organized virtually with good turnout and contributions from industry and academics.

Hope you are vaccinated, stay healthy, and in positive frame of mind to have a successful year and share some of your contributions to Tamil community.

Sincerely

-Muthu

குட்டி story … ஒரு அலசல்

Screen Shot 2020-04-18 at 12.23.13 PM

சமிபத்திய வெளியாகவுள்ள, லோக்கோஷ் கனகராசு இயக்கத்தில், “Master” திரைப்பட பாடல் ஆல்பத்தில் ஒரு வித்தியாசமான, மனதைக்கவரக்கூடிய தமிழ்/தங்கிலிசு பாடல், “குட்டி story,” இடம் பெற்றது. இதை பிரபல திரைப்பட நடிகர் விஜ்ய் பாடி இசைவாக அமைந்தது. இதை அனுராஜா காமராஜ் பாடல்வரிகள் எழுதி, அநிருத்ரவிசந்தர் இசைஅமைத்துள்ளார்.

Screen Shot 2020-04-18 at 12.47.56 PM

இந்த பாடல் வரிகளை அலசிப்பார்த்தால் என்ன தெறிகின்றது நமக்கு ? இதில் முதலில் நிறைய ஆங்கில சொற்கள் படத்தின் ஏதோ ஒரு சூழலில் இயற்கையாக வரும் தருணத்தை குறிக்க இப்படி பாடல் எழுதியிருக்காங்க என்று கொள்ளலாம். காப்புரிமம் காரணமாக பாடல்வரிகளை இங்கு முழுதாக இடமுடியாவிட்டாலும், நாம் ஓப்பன் தமிழ் கொண்டு இந்த பாடல்களை அலசினால், சுமார் இருபது சதம் சொற்கள் மட்டுமே தமிழ் வரிகளை கொண்டதாக அமைந்திருக்கிறது.

எதுகை மோனையில் {“happy”,”crappy”} – “மாப்பி” என்று தமிழ்-ஆங்கிலம் தங்கிலிஷில் பூந்து விளையாடுகிறார் பாடலாசிரியர்.

பாடல் சற்று கட்டமைப்பில் (rhyme-scheme) எளிமையாக இருந்தாலும்கூட பாட்டில் ஏதோ ஒரு வாழ்க்கையில் சமரசத்தையும், ஒரு நம்பிக்கையூட்டும் நோக்கில் கருத்துக்கள் வெளிவந்திருக்கின்றன. போராட்ட மனப்பாங்கில் இருந்து வெளிவந்தும், மன அவதிகளில் இருந்தும் ஒரு ஓய்வெடுக்க பாடகர் வலியுருத்துகிறார்.

முழு நிரல் இங்கு பார்க்கலாம்:

#!/bin/env python3
from codecs import open
from tamil import utf8
import re
with open('kuttistory.txt','r','utf-8') as fp:
data = fp.readlines()
class Stats:
__fields__ = ('total_words','tamil_words')
stats = Stats()
stats.total_words=0.0
stats.tamil_words=0.0
for line in data:
all_words = re.split('\s+',line.strip())
ta_words = list(utf8.get_tamil_words(utf8.get_letters(line)))
print(all_words,len(ta_words))
stats.tamil_words += len( ta_words )
stats.total_words += len(all_words)
#tamil fraction
taf = float(stats.tamil_words)/stats.total_words
print('English = {0}%, Tamil = {1}%'.format(100.0*(1-taf),100.0*(taf)))

தமிழ் உரை சம்பந்தமான சில புதிர்கள் (3) – மறைந்த மெய் புள்ளிகள்

இந்த வார பகுதியில் ஒரு வித்தியாசமான சிக்கலைப்பற்றி பேசலாம், முன்னரே எழுதிய பகுதிகளை இங்கு காண்க; அதாவது ஒரு எழுத்துணரியின் வழியாக தயாரிக்கப்பட்ட தமிழ் சொற்றொடரில் சில சமயம் மெய் புள்ளிகள் மறைந்துவிடுகின்றன. இது சற்றி இயந்திர கால சிக்கல் என்றால் அப்போது கல்வெட்டுக்களிலும் நூற்றாண்டின் நாளடைவில் இப்படிப்பட்ட சிக்கல்கள் தோன்றுகின்றன; ஆகவே இது தனிப்பட்ட ஒரு சிக்கல் இல்லை என்பதும் புலப்படுகின்றது. இந்த வலைப்பதிவில் உள்ள அல்கோரிதத்தை இங்கு ஓப்பன் தமிழ் நிரலாக காணலாம்.

1. அறிமுகம்

எனக்கு இந்த சிக்கல் இருப்பதன் காரணம், 1910-இல் ஆர்டன் பாதரியார் இயற்றிய “A progressive grammar of common Tamil,” என்ற நூலின் மறுபதிப்பு பிரதியில் சில/பல சொற்கள் விட்டுப்போயிருந்தன. மறுபதிப்பு செய்யும் நிறுவனமோ, கலிபோர்னியா லாசு ஏஞ்சலஸ் பல்கலைக்கழகத்தில் உள்ள பிரதியினில் இருந்து எப்படியோ (கூகிள் புத்தகங்கள் வழியாகவா?) ஒரு புத்தகத்தின் மின்வடிவத்தை சரிபார்க்காமல் அப்படியே அச்சு செய்து அமேசான் சந்தையில் விற்று அதுவும் என் கைக்கு கிடைத்தது. பல இடங்களில் மெய் புள்ளிகளின் மறைவு – சொற்பிழைப்போல் பாவிக்கும் இந்த பிழைகள் இந்திர வழி செயல்திருத்தத்தால் நுழைக்கப்பட்டவை. நுழககபபடடவை!

மெய் புள்ளிகளின்றி செம்புலப்பொயல்நீரார் கூற்றி சங்க இலக்கியத்தில் இருந்து இப்படியே தோன்றும்,

யாயும ஞாயும யாராகியரோ

எநதையும நுநதையும எமமுறைக கேளிர

இதனை எப்படி நாம் சீர் செய்வது? இதுதான் நமது இன்றைய சிக்கல்.

2. அல்கோரிதம்

உள்ளீடு

  • சொல் என்பதை எழுத்துச் சரமாக தறப்படுகிறது. இதனை சொ என்ற மாறியில் குறிக்கின்றோம்.

வெளியீடுகள்

  • மறைந்த மெய்கள் இருந்தால் அவற்றை மற்றும் திருத்தி புதிய சொல் வெளியீடு செய்வதற்கு.

அல்கோரிதம்  முன்-நிபந்தனைகள்

  1. உள்ளீட்டு சரம் என்பதில் வேறு எந்த சொற்பிழைகளும் இல்லை
  2. சரம் என்பதின் இடம் ‘‘ என்பதில், சரம் எழுத்து சொ[இ] என்ற நிரலாக்கல் குறியீட்டில் சொல்கின்றோம்.
  3. சரம் எழுத்து சொ[இ], தமிழ் எழுத்தாக இல்லாவிட்டால் அதனை நாம் பொருட்படுத்துவதில்லை
  4. சரம் எழுத்து சொ[இ], உயிர், மெய், உயிர்மெய் (அகர வரிசை தவிர்த்து), ஆய்த எழுத்து என்றாலும் அவற்றில் எவ்வித செயல்பாடுகளையும் செய்யப்போவதில்லை
  5. ஆகவே, சரம் எழுத்து சொ[இ] என்பது உயிர்மெய் எழுத்தாக அதுவும் அகரவரிசையில் {க, ச, ட, த, ப, ர, .. } இருந்தால் மட்டும் இதனை செயல்படுத்துகின்றோம்.

அல்கோரிதம்  செயல்பாடு

  1. மேல் சொன்னபடி, நாம் கண்டெடுக்க வேண்டியது உள்ளீட்டு சரத்தில் அகரவரிசை உயிர்மெய்களில்  சரியான உயிர்மெய் எழுத்து வருகிறதா அல்லது மெய் புள்ளி மறைந்து வருகிறதா என்பது மட்டுமே!
  2. இதனை சறியாக செய்தால் அடுத்த கட்டமாக பிழைஉள்ள இடங்களில் புள்ளிகளை சேற்றுக்கொள்ளலாம்
  3. மேல் உள்ள 1-2 படிகளை அனைத்து சொல்லின் அகரவரிசை உயிமெய்களிலும் சயல்படுத்தினால் நமது தீர்வு கிடைக்கின்றது.

இதன் மேலோட்டமான ஒரு முதற்கண் தீற்வை பார்க்கலாம் (இதனை மேலும் சீர்மை செய்ய வேண்டும்),

அல்கோரிதம் இதற்கு ஒத்தாசை செய்ய மேலும் கூடிய அல்கோரித செயல்முறைகளான “அகரவரிசை_மெய்”, “புள்ளிகள்_தேவையா” மற்றும் “புள்ளிகள்_சேர்” என்றவற்றையும் நாம் சேரக்க்வேண்டும்.

நிரல்பாகம் மறைந்த_மெய்_புள்ளியிடல்( சொல் )

திருத்தம்_சொல் = ""

@(சொல் இல் எழுத்து) ஒவ்வொன்றாக
   விடை = 0
   @( அகரவரிசை_உயிர்மெய்( எழுத்து ) ) ஆனால்  
      விடை = புள்ளிகள்_தேவையா( சொல், எழுத்து )
   முடி
   @( விடை ) ஆனால்
      திருத்தம்_சொல் += புள்ளிகள்_சேர்( எழுத்து )
   இல்லை
      திருத்தம்_சொல் += எழுத்து
   முடி
முடி
பின்கொடு திருத்தம்_சொல்
முடி

நிரல்பாகம் அகரவரிசை_உயிர்மெய்( எழுத்து )
   அகரவரிசை_உயிர்மெய்கள் = 'கசடதபறயரலவழளஞஙனநமண'
   பின்கொடு அகரவரிசை_உயிர்மெய்கள்.இடம்(எழுத்து) != -1
முடி

நிரல்பாகம் புள்ளிகள்_சேர் ( எழுத்து )
   அகரவரிசை_உயிர்மெய்கள் = 'கசடதபறயரலவழளஞஙனநமண'
   அகரவரிசைக்குள்ள_மெய் = ['க்','ச்','ட்','த்','ப்','ற்',
                         'ய்', 'ர்','ல்','வ்','ழ்','ள்',
                         'ஞ்', 'ங்', 'ன்','ந்','ம்','ண்']
   இடம் = அகரவரிசை_உயிர்மெய்கள்.இடம்( எழுத்து )
   பின்க்கொடு அகரவரிசைக்குள்ள_மெய்[ இடம் ]
முடி

பொதுவாக நம்மால் புள்ளிகள்_தேவையா என்ற செயல்பாட்டை சரிவர முழு விவரங்களுடன் எழுதமுடயாது. இது கணினிவழி உரைபகுப்பாய்வுக்கு ஒரு தனி கேடு. அதனால் நாம் புள்ளியியல் வழி செயல்படுவது சிறப்பானது/சராசரியாக சரிவர விடையளிக்கக்கூடிய செயல்முறை.

3. மாற்று அல்கோரிதம்

மேல் சொன்னபடி உள்ள கட்டமைப்பில் புள்ளிகள் தேவையா என்பதன் ஓட்ட நேரம் (runtime), கணிமை சிக்கலளவு (computational complexity) பற்றி பார்க்கலாம்.

உதாரணமாக, “கண்னன்” என்று எடுத்துக்கொண்டால் அது அச்சாகுமபொழுது “கணனன” என்று அச்சாகிறது என்றும் கொள்ளலாம். நமது அல்கோரிதத்தின்படி இதில் நான்று இடங்களில், அதாவது அத்துனை எழுத்துக்களுமே அகரவரிசை உயிமெயகளாக அமைகின்றன. இவற்றில் எந்த ஒது எழுத்தும் உயிர்மெய்யாக இருக்கலாம் (அச்சிட்டபடியே), அல்லது மாறியும் புள்ளி மறைந்த மெய்யாகவும் இருக்கலாம்.

அதாவது, “கணனன” என்ற சொல்லை மொத்தம் உள்ள வழிகளாவது இவற்றின் பெருக்கல்:

என்ற எழுத்தில் இரண்டு வழிகள்

என்ற எழுத்தில் இரண்டு வழிகள்

என்ற எழுத்தில் இரண்டு வழிகள்

என்ற எழுத்தில் இரண்டு வழிகள்

மொத்தம் 2 x 2 x 2 x 2 = 24 = 16 வழிகள் உள்ளன.

இதனை பொதுப்படுத்தி சொன்னால்,

  • நீ என்ற எண் நீளம் உள்ள சொல்லில் (அதாவது, நீ = |சொல்|) என்ன நடக்கின்றது என்றால்,
  • நீ1 என்ற எண் சொல்லின் உள்ள அகரவரிசை உயிர்மெய்களை குறிக்கும் என்றால், 
  • நீ1 ⩽  நீ,
  • மொத்தம் நாம் பரிசோதிக்க வேண்டிய வழிகள், 2நீ1

இது விரைவில் பொறிய அளவு வளரும் ஒரு தொகை, இதனை exponentially fast, அதிவேகமாக வளரும் கணிமை என்றும் சொல்லாம். இதற்கு என்ன செய்ய வேண்டும் என்றால் இதனை எளிதாக வழிகள் தோன்றும் படி மட்டும் விடைகள் தேடினால் நமது செயல்பாடு விரைவில் முடியவே முடியாது – இதற்காக branch and bound என்ற செயல்முறைகளை பயன்படுத்தவேண்டும்.

#இந்த நிரல்பாகம், 2நீ1 என்ற ஓட்ட நேரத்தில் இயங்கும்
நிரல்பாகம் புள்ளிகள்_தேவையா_உதவியாளர்( முதல்_ஒட்டு, சந்தித்காதவை )
   @( நீளம்( சந்தித்காதவை ) == 0 )
         பின்கொடு [முதல்_ஒட்டு]
   முடி
   விடைகள் = []
   எழுத்து = சந்தித்காதவை[0]
   @( அகரவரிசை_உயிர்மெய்( எழுத்து ) ) ஆனால்
         #உள்ளபடியே இந்த இடத்தில் மெய் இல்லை என்றவழியில் யுகிக்க
         விடைகள்1 = புள்ளிகள்_தேவையா_உதவியாளர்(முதல்_ஒட்டு + எழுத்து, சந்தித்காதவை[1:])
         விடைகள்.நீட்டிக்க( விடைகள்1 )

         #உள்ளபடியே இந்த இடத்தில் மெய் வந்தால் எப்படி இருக்கும் என்ற்வழியில் யுகிக்க
         மெய்எழுத்து = புள்ளிகள்_சேர்( எழுத்து )
         விடைகள்2 = புள்ளிகள்_தேவையா_உதவியாளர்(முதல்_ஒட்டு + மெய்எழுத்து, சந்தித்காதவை[1:])
         விடைகள்.நீட்டிக்க( விடைகள்2 )
   இல்லை
         விடைகள்3 = புள்ளிகள்_தேவையா_உதவியாளர்(முதல்_ஒட்டு + எழுத்து, சந்தித்காதவை[1:])
         விடைகள்.நீட்டிக்க( விடைகள்3 )
   முடி
   பின்கொடு விடைகள் 
முடி

நிரல்பாகம் மறைந்த_மெய்_புள்ளியிடல்(சொல்)
    #யுகிப்பு சார்பு என்பது n-gram புள்ளியியல் கொண்டு 
    #சொல்லின் புள்ளிகள் சோர்க்கப்பட்ட மாற்றங்களை மதிப்பிடும்.
    மாற்று_சொற்கள் = புள்ளிகள்_தேவையா_உதவியாளர்( '', list(சொல்) )
    மதிப்பீடுகள் = யுகிப்பு_சார்பு( மாற்று_சொற்கள் )
    இடம் = அதிக_மதிப்பெண்_இடம்( மதிப்பீடுகள் )
    சரியான_மாற்று_சொல் = மாற்று_சொற்கள்[ இடம் ]
    பின்கொடு சரியான_மாற்று_சொல்
முடி

மேல் சொல்லப்பட்டபடி கணினி அல்கோரிதப்படுத்திப்பார்த்தால் ‘கணனன’ என்ற சொல்லிற்கு, 16 மாற்றுகள் கிடைக்கும். அவையாவன,

['கணனன',
 'கணனன்',
 'கணன்ன',
 'கணன்ன்',
 'கண்னன',
 'கண்னன்',
 'கண்ன்ன',
 'கண்ன்ன்',
 'க்ணனன',
 'க்ணனன்',
 'க்ணன்ன',
 'க்ணன்ன்',
 'க்ண்னன',
 'க்ண்னன்',
 'க்ண்ன்ன',
 'க்ண்ன்ன்']

இந்த விடையின் மாற்று சொற்களை unigram அல்லது bigram யுகிப்பு சார்புகளின்படி மதிப்பிட்டால் கீழ்கண்டவாறு கிடைக்கின்றது,

[(‘க்ண்ன்ன்‘, 28.0),
(‘க்ணன்ன்’, 24.83912971793407),
(‘க்ண்னன்’, 24.39197168659185),
(‘க்ண்ன்ன’, 24.0),
(‘கண்ன்ன்’, 23.60384297446045),
(‘க்ணனன்’, 21.231101404525926),
(‘க்ணன்ன’, 20.83912971793407),
(‘கணன்ன்’, 20.44297269239452),
(‘க்ண்னன’, 20.39197168659185),
(‘கண்னன்‘, 19.9958146610523),
(‘கண்ன்ன’, 19.60384297446045),
(‘க்ணனன’, 17.231101404525926),
(‘கணனன்’, 16.834944378986375),
(‘கணன்ன’, 16.44297269239452),
(‘கண்னன’, 15.995814661052302),
(‘கணனன’, 12.834944378986375)]
(‘க்ண்ன்ன்’, -11.553147747485053)]

இந்த சமயம் நமக்கு சரியான விடைகிடைக்கவில்லை; இதனுடன் அகராதிபெயர்கள் அல்லது classification செயற்கைப்பின்னல்களை பயன்படுத்திப்பார்க்கலாம் என்றும் தோன்றுகிறது.

இந்த அல்கோரிதத்தை ஓப்பன்-தமிழ் பைத்தான் நிரலாக எழுதினால் இப்படி:

# -*- coding: utf-8 -*-
# (C) 2020, முத்து அண்ணாமலை.
# இந்த நிரல் துண்டு MIT உரிமத்தில் வெளியிடப்பட்டது
import tamil
from pprint import pprint
import operator
from solthiruthi.scoring import bigram_scores, unigram_score
chol = tamil.utf8.get_letters("கணனன")
def mean(x):
return sum(x)/float(len(x))
def pulligal_helper(prefix,letters):
if len(letters) == 0: return [prefix]
letter = letters[0]
result = []
if letter in tamil.utf8.agaram_letters:
result1 = pulligal_helper( prefix + letter, letters[1:])
mei_letter = letter + tamil.utf8.pulli_symbols[0]
result2 = pulligal_helper( prefix + mei_letter, letters[1:])
result.extend(result1)
result.extend(result2)
else:
result1 = pulligal_helper( prefix + letter, letters[1:])
result.extend(result1)
return result
def pulligal_branch_bound(prefix,letters,அகராதி):
""" we restrict options if its not a prefix in dictionary """
if len(letters) == 0: return [prefix]
letter = letters[0]
result = []
prefer = அகராதி.starts_with(prefix)
if letter in tamil.utf8.agaram_letters:
alternate2 = prefix + mei_letter
if அகராதி.starts_with(alternate2) or prefer:
mei_letter = letter + tamil.utf8.pulli_symbols[0]
result2 = pulligal_branch_bound( alternate2, letters[1:])
result.extend(result2)
alternate1 = prefix + letter
if அகராதி.starts_with(alternate1) or prefer:
result1 = pulligal_branch_bound( alternate1, letters[1:])
result.extend(result1)
return result
#sort in descending order
result_tpl = [("".join(sol),(-1.0*unigram_score(sol))) for sol in pulligal_helper("",chol)]
result_tpl = sorted(result_tpl,key=operator.itemgetter(1),reverse=True)
pprint(result_tpl)
"""
['கணனன',
'கணனன்',
'கணன்ன',
'கணன்ன்',
'கண்னன',
'கண்னன்',
'கண்ன்ன',
'கண்ன்ன்',
'க்ணனன',
'க்ணனன்',
'க்ணன்ன',
'க்ணன்ன்',
'க்ண்னன',
'க்ண்னன்',
'க்ண்ன்ன',
'க்ண்ன்ன்']
#bigram score
[('கணனன', -12.834944378986375),
('கணனன்', -16.834944378986375),
('கணன்ன', -16.44297269239452),
('கணன்ன்', -20.44297269239452),
('கண்னன', -15.995814661052302),
('கண்னன்', -19.9958146610523),
('கண்ன்ன', -19.60384297446045),
('கண்ன்ன்', -23.60384297446045),
('க்ணனன', -17.231101404525926),
('க்ணனன்', -21.231101404525926),
('க்ணன்ன', -20.83912971793407),
('க்ணன்ன்', -24.83912971793407),
('க்ண்னன', -20.39197168659185),
('க்ண்னன்', -24.39197168659185),
('க்ண்ன்ன', -24.0),
('க்ண்ன்ன்', -28.0)]
# unigram score
[('கணனன', -7.5531477474850535),
('கணனன்', -8.553147747485053),
('கணன்ன', -8.553147747485053),
('கணன்ன்', -9.553147747485053),
('கண்னன', -8.553147747485053),
('கண்னன்', -9.553147747485053),
('கண்ன்ன', -9.553147747485053),
('கண்ன்ன்', -10.553147747485053),
('க்ணனன', -8.553147747485053),
('க்ணனன்', -9.553147747485053),
('க்ணன்ன', -9.553147747485053),
('க்ணன்ன்', -10.553147747485053),
('க்ண்னன', -9.553147747485053),
('க்ண்னன்', -10.553147747485053),
('க்ண்ன்ன', -10.553147747485053),
('க்ண்ன்ன்', -11.553147747485053)]
"""

மேலும், செம்புலப்பெயல்நீரார் கூற்றை மெய்கள் சேர்த்தால், இப்படி வருகின்றது. இதில் 7-இல் ஆறு சொற்கள் சரியாவருகிறது.

  1. [(‘யாயும்‘, 20.0), (‘யாயும’, 16.0)]
  2. [(‘ஞாயும்‘, 20.0), (‘ஞாயும’, 16.0)]
  3. [(‘யாராகிய்ரோ‘, 36.0), (‘யாராகியரோ‘, 31.94703511524359)]
  4. [(‘எந்தையும்‘, 32.0),(‘எநதையும்’, 28.83912971793407),(‘எந்தையும’, 28.0),(‘எநதையும’, 24.83912971793407)]
  5. [(‘நுந்தையும்‘, 36.0),
    (‘நுநதையும்’, 32.83912971793407),
    (‘நுந்தையும’, 32.0),
    (‘நுநதையும’, 28.83912971793407)]
  6. [(‘எம்முறைக்‘, 32.181004231607204),
    (‘எமமுறைக்’, 28.543012694821613),
    (‘எம்முறைக’, 28.181004231607204),
    (‘எமமுறைக’, 24.543012694821613)]
  7. [(‘கேளிர்‘, 20.0), (‘கேளிர’, 16.0)]

மேலும் தொடர்புக்கு உங்கள் விவரங்களை இங்கு சேர்க்கவும்.

வெளியுறவுத்துரை அமைச்சர் – Linguistic Diversity

நிங்க. ஆமா. நீங்களேதான். தமிழ் மொழி, கலை, பாரம்பரியம், கலாச்சாரம், பண்பாடு, இயல்-இசை-நாடகம், வெற்றி-தோல்விகள், சமூக சிக்கல்கள், வறலாறு, அதன்வழி வந்த கோளருகள் … எல்லாத்தையும் மற்ற மொழியினருக்கு, மற்ற நாட்டவர்களுக்கு சொல்ல வெளியுறவுத்துரை அமைச்சர் நீங்கதான். சமயத்தில் அடுத்த தலைமுரையினருக்கும் சொல்ல வேண்டிய பொருப்பும் இருக்கிரது.

Spiderman : சிலந்திகளின் பலம் கொண்டபோதிலும், அவன் அதிக பொருப்பின் சுமையால் பாதிக்கப்படுகிரான். படம் உரிமம்: விக்கிப்பீடியா.

சென்ற வாரம் எனது அலுவலகத்தில் எனது Microsoft Office செயலி Word வழி எதைப்பற்றியோ WebEx வழி தொலைபேசி-நேரலைபகிர்தல் வழியில் மற்றோரு மாகானத்தில் உள்ள ஊழியரிடத்தில் வேலை தொழில்னுட்பம் பற்றி பேசிக்கொண்டிருந்தேன். [ஏற்கண்வே, நான் ஒரு ஆண்டுக்கு முன்பு (இதை பார்க்கவும்) இதனைப்போல் 40-மணிக்கும் மேலாக செயல்படும் வேலைமடிக்கணினியில் தமிழ் இடைமுகங்களை (localization) செயல்படுமாரு செய்தேன்.]

எனது திரையில் தமிழ் வட்டெழுத்துக்களைக்க கண்ட இவர் உடனே: இது என்ன முத்து, “Is it sanskrit?” அப்படின்னு கேட்டார். இல்லை இப்படி ‘தமிழ்’ என்றும், இந்தமாதிரி என்றும் சொன்னேன்.

‘அப்படியா! இதை சிலோனில் அல்லவா பேசுவார்கள்?’ என்றும் வினவினார். இல்லை சாமி, சிங்கை, சிலோன் மற்றும் முதன்மையாக தென்னிந்தியாவிலும் 3500 இந்திய மொழிகளில் முதன்மையான் 20-25 மொழிகளில் தமிழும் ஒன்று என்று சொன்னேன். அடுத்து நேபாள் நாட்டை சேர்ந்த நண்பர் ஒருவரின் பணித்திட்டம் பற்றியும் பேசிக்கொண்டிருக்கும் நேரத்தில், இவர் “So is Nepalese same as Tamil?,” அப்படின்னு கேட்டார். நமக்குத்தான் லெக்சரடிக்க பிடிக்குமே – இன்னார் இன்னபடி என்றும் திராவிட மொழி, ஆரிய/வட மொழி என்றும், தேவனாகிரி மொழிகள் என்றும் உள்ளதைப்பற்றி சொன்னேன் – அவருக்கு ஒரே வியப்பு.

என்னவோ – இங்கு நான் வாழும்ஊரில் இந்தியர்களிடத்தில் ஆங்கில மொழிப்பற்று மட்டுமே உள்ளது. சிலிக்கன் சமவெளியில் [Silicon Valley] இந்தியர்கள் பத்தில் ஒருவரிம் கூட மற்றொரு மொழி – தமிழ்/இந்தி/தெலுங்கு/மலையாளம் விசைப்பலகைகளை பயன்படுத்துவதில்லை. செருமன், பிரெஞ்சு இருக்கலாமோ என்னவே கேட்டுப்பார்க்கிரேன்.

இந்திய மொழிகளை வேற்றுமைகளும்-வளமைகளும் [Linguistic Diveristy] ஒரு விளிம்பு நிலையில் தள்ளப்படுமா என்றும் ஒரு சிரிய அச்சம் என்னிடம் இருக்கிறது. இந்தியாவில் பிறந்து வளர்ந்ததினால் மட்டுமே பல மொழிகளின் தாக்கத்தில் வளந்ததில் பெருமை கொள்ளும் சமயம் [சட்டென்று யொசித்தால் – திராவிடம் என்பது கூட ஒரு வடமொழி சொல் என்றும் படும்] கணினியின் யுகத்தில் நமது மொழிகளின் அனுகுதல், வாசிப்பு, ஆக்கம், மற்றும் வளர்ச்சி என்பதை நாம் மறுபரிசீலனை செய்யவேண்டும் என்றும் கருதுகிறேன்.

400-ஆண்டு பிரிட்டீஷ் காலனித்துவத்தினால் கூட அழிவடையும் அளவு மாற்றம் அடையாத மொழி வேற்றுமைகளும்-வளமைகளும் கணினிக்குள் மொழியை உள்ளீடும் செய்யமுடியாமல் தவிக்கும் பலராலும், கணினியில் ஆங்கிலத்தின் சுலபமான செயல்பாட்டாலும் மொழி வளமை காலனித்துவத்தை விட அதிகமாக சிதைவடைகிறது என்பதை நான் காண்கிறேன்.

மொழியில் சிந்தனைகள், கேள்வி-பதில்கள், கூச்சல் குழப்பங்கள் இல்லாவிட்டால் அது இறக்கும் – பிரபல அறிஞரும் சம்ஸ்கிருத மேதையான ஸ்டிபேன் போல்லோக் எழுதிய சர்ச்சைக்குள்ளாகிய ‘Death of Sanskrit’ என்பதில் இருந்து கற்றுக்கொள்ள வேண்டியது என்ன என்றால் இதுதான் – மொழியில் புழக்கம் வேண்டும். அதுஇல்லாவிட்டால், நமது இந்தியமொழிகளும் அருங்காட்சியகத்தில் தான் சென்று காண்போமா என்ன ? இல்லை, நமது காலத்தில் இப்படியெல்லாம் நடக்காது. இல்லையா ? இல்லைதானே…

கோமாளி – swearing in Tamil

பழிக்கும் மொழி – தமிழில் திட்டுவது பற்றி; தமிழில் பழிக்கும் மொழி பல வண்ணங்களாக உள்ளது; இவற்றில் சிலதை இந்த பதிவில் பார்க்கலாம். இந்த தொடரும் தமிழ் வசை சொற்கள் பற்றிய அலசலின் வாயில் அமைந்ததாக இருக்கும். வசை சொற்களுக்கு பொருள் வழ்ங்கப்படவில்லை.

  • சிறுபிள்ளைத்தனமாக [ஏதாவதொரு வினைச்சொல் – எ.கா. பேசுரே, …]
  • வீட்டில் சொல்லீட்டு வந்திட்டியா ?
  • சோறு தான சப்பிடுகின்றாய் ? [ அல்லது: சாப்பாட்டில் உப்பு போட்டு சாப்பிடுரியா ?] அதாவது சூடு, சொரனை இல்லாத விலங்கு போன்ற மனிதனா நீ என்றபடி வசை.
  • நாய்க்குப் பிறந்தவனே/வளே ?
  • எருமை! எருமைமாட்டின் மீது மழை பெய்தமாதிரி!
  • நாயே! தெருநாயே!
  • கடாமாடு
  • வெங்காயம்
  • ஒரு அப்பனுக்கு (தாய்க்கு) பிறந்தவனா/ளா நீ?
  • என்னையப்பார்த்தால் இளிச்சவாயனா தெறியிதா ?
  • கோமாளி
  • அரை கிராக்கு, அரை லூசு
  • வீளங்காமண்டையன்
  • அறிவுகெட்டவனே/ளே!
  • எச்சைக்கள்ள
  • பொருக்கி, தெருப்பொருக்கி
  • உதவாக்கரை
  • ஓட்டவாய்
  • ஓடுதாரி/ஓடுகாரி
  • திருடி/திருடா
  • நாதாரி
  • முண்டம்
  • முந்திரிக்கொட்டை
  • கடன்காரன்/கடன்காரி
  • நொண்டி
  • செவிடு
  • ஊமை
  • குஞ்சு

A bipartite graph structure for Tamil

Remark: Tamil alphabets [which are Abugida or alphasyllabary in nature] can be written as a fully connected bipartite graph G(C+V,E). Both the basic 247 letters [known to have a ring representation] and sequences involving வட மொழி letters can be written in the sequence of two sets, V – vowels [உயிர்] and C – consonants [மெய்], and edges E: C -> V forming a map from each consonant to vowel (e.g.: க் + அ -> க ) are the உயிர்மெய் எழுத்துக்கள். This is a K_{\left[18 \times 12\right]} bipartite graph. Strictly speaking we can add அயுத எழுத்து ‘ஃ’ as a disconnected node and call it a K_{\left[ 18 \times 12\right]} + 1 forest graph. This may be simply extended to cover the வட மொழி எழுத்துக்கள் [Sanskrit letters optionally used in Tamil]. Full alphabet set is obtained by cumulative sum of edges and vertices.

Corollary: Most other alphasyllabary, Abugida languages have a similar bipartite graph representation.


Fig. 1: A fully connected Bipartite graph K(5,3). Credit: Wikipedia.


A group structure for Tamil

We can form a group structure for Tamil alphabets in many ways; simply we may apply residue classes modulo N or symmetric group of permutations modulo N for any cardinality. However, one interesting group structure with applications is the abstraction of 247 Tamil letters written on a torus; in this essay I will attempt to describe it and show that it forms a group.

We consider the 247 Tamil letters formed by 1 ayudha letter and 12 uyir letters for 13 vowels, and 18 mei letters for 18 consonants and 216 uyirmei or conjugate letters [247 = 13 + 18 + 216]. By consider a mapping of 13 vowels to Z13[residue classes modulo 13] and 18 uyirmei letters + ayutha letter to Z19 [residue classes modulo 19].

Fig. 1: The Cayley table for Z13 can represent Uyir letters.
Fig. 2: The Cayley table for Z19 can represent Mei letters (with modification)

Representation

Further we may represent each uyirmei letter as a index into a 2D table formed by rows of mei letters, and columns of uyir letters. So, for example letter ‘கு = க் + ஊ’ can be written as 6 + 1*13 = 19. Uyir letters are all represented from [0-12], Mei letters are represented as multiples of 13, [13, 26, 39, .. 234] for [க், ச், … ல், வ், ழ், ள்]. Uyirmei letters form everything in between.

The general representation of a letter can be: t = a + 13*b, where a goes from [0-12] and b goes from [0-18]. This representation pegs ‘ஃ’ at the origin. In the direct product of Z13 and Z19 this will be represented as (a,b)

Letter representation in the product group: Z13 x Z19

Result

Further since we showed uyir and mei letters can be embedded into the Z13, and Z19 residue classes and we know 247 factors neatly into 2 primes 13 and 19, we may use the Chinese remainder theorem (which guarantees that given two sets of residue classes which are co-prime, we can form a residue class with a unique representation for the direct-sum [direct-product] of the underlying sets). In our case we are guaranteed that Z13 x Z19 direct sum structure forms an isomorphic group in Z247. This is the key result in this easy:

Tamil letters [247] have a direct product representation in group Z247 which is isomorphic to the direct product of Z13, Z19 as mapping the uyir and mei group representations.

Key result – Group representation for Tamil alphabets

While Chinese remainder theorem guarantees a ring structure, I don’t know the second operator which can take role of product to make the ring structure possible at this writing.

Tamil Entry via Keypad – 9XYZ30-த-மி-ழ்

Previously, My initial calculations can be revised in terms of the estimates. I will not go into further detail here; my latest estimate shows the number of realizable keyboards to be 264,250,749,803,040 or 264billion – a bit of an astronomical number.

The money questions are the following:

  1. Given the astronomical size of keyboards possible is there one that is easily decodable than the other ? Yes, or no ?
  2. Is there any decodable keyboard at all?
  3. Is there a ‘1-800-FLOWERS‘ type of representation possible atleast for a few words in Tamil ?

Today, I was toying with some simple designs and made it into software:

Fig 1: Simple 4×3 keypad layout in iOS

One particular realization of the keyboard looks like where 20 Tamil letters are roughly mapped into 1 keypad as shown in the excel sheet below. We also see the canonical 4×3 keypad matrix in the rows 20-23 showing the 12 keypad positions where 20 letters are going to be mapped into.

Fig 2: Mapping first 20 letters of Tamil alphabet set into a 4×3 keypad.

We show how the phone number “9XYZ30477” will mean “9XYZ30-த-மி-ழ்” in this keypad.

Fig. 3: A simple realization of keypad mapping in Tamil; e.g. number “9XYZ30477” would can be advertised as ‘9XYZ30-த-மி-ழ்’.

Immediately few things are coming to our attention:

  1. Entering user input in the keypad is easy; we follow a simple natural language suggested representation
  2. However, we have some issues in realizing this keyboard – ambiguity: Does ‘111’ in this keypad entry, with following mapping shown, mean ‘அக்கா’ or ‘கட்சி’ ?
  3. The “obvious” finite ring keypad mapping fails here.

Realizations:

  1. Whereas a simple keyboard realization of this scheme shows words typed of equal length like ‘அக்கா’ and ‘கட்சி’ are completely undecidable/un-decodeable. So our criteria is really the good realizable keyboard maximizes the word decidability, or minimizes word collision.
  2. Ease of user input:
    Also we may want to make ease of user entry into this keyboard simpler [which the ‘obvious choice’ keyboard contains] while still maintaining the decodability.
  3. We identify the mapping used above with a simple algebraic structure similar to a finite semi-group with operations of commutativity, in-group operation and identity formed by ‘ஃ’ ayutha letter. This is a interesting mapping with potential to adapt the operator for creating a full semigroup or group structure for the language.
  4. Finally we discover:

The letters with the high bi-gram frequency may not be co-occurring in the same keypad square. This is an operational principle that will reduce the ambiguity of the model. We will have to balance this with other decidability criteria of user input etc.

Operating Principle – we understand this from our failed experiment.

This type of keyboard design could also equally apply for other Abugida languages – which is most Indian languages.

சொல்திருத்தி – தெறிந்தவை 6

மொழியில் ஆக்க சக்திகளை தோராயமாக, தொல்கப்பியம், இலக்கணம் எல்லாம் தெறியாமலேயே ஒரு மொழியின் மாதிரியில் இருந்து (புள்ளியியல் வழி உருவாக்கியது) சரியான அல்லது பிழையான சொல், வாக்கியம், சொல் அமையும் இடம், இடம்-பொருள் ஒற்றுமை போன்றவற்றை நாம் சரியாக சொல்லலாம். அதற்கு மொழிமாதிரி கேட்குது நம்ம கணினி.

பொது தமிழ் தரவுகள் ஆகியவை

  1. மதுரை திட்டம்
  2. தமிழ் விக்கிப்பீடியா
  3. freetamilebooks மின் புத்தக தரவு
  4. பிரபல நாளிதள், வார இதள், வலை இதள் போன்றவற்றின் தரவு.

இவை ஓவ்வொன்றும் ஒவ்வொரு கால கட்ட தமிழை, அல்லது பல கால கட்ட தமிழ் வழக்கை கொண்டவையாக அமைகின்றன. மென்மேலும், ஒவ்வொன்றும் வெவ்வேறு ‘header information’ மேலான்மை தகவல்களினுள் பொருத்தப்பட்டருக்கின்றன.

இதனை நாம் சரியாக புரிந்து கொண்டதன் பின்னரே ஒரு மொழி மாதிரியை உருவாக்கலாம். மொழி மாதிரி என்பது நிறுத்த சொற்கள் நீக்கப்பட்ட சொல் தரவினில் இருந்து மட்டுமே உருவாக்கியதாகவும், முழுக்க முழுக்க தேவையற்ற மேலான்மை தகவல்கள் இல்லாமல் இருக்க வேண்டும். இவை இருந்தால் சிறப்பாக ஒரு மொழி மாதிரியை தயார் செய்யலாம்; இதனை எனது டுவீட்டில் பார்க்கலாம்:

ஏற்கனவே செய்த வேலைகளில் இந்த குறைபாடுகள் இருந்திருக்கின்றன; இப்போது தான் தெறிந்துகொண்டேன்.

சமீபத்தில் இந்த சிக்கலில் மாட்டினேன்: சரியான தொடக்க நிலையில் இருந்து தொடங்குவது அவசியம். நான் விக்கிபீடியா தரவை அப்படியே header-information உடன் எதையும் துப்புரவு செய்யாமல் 13 இலட்சம் சொற்களை வரிசைடுத்தினேன். எல்லாம் பிரயோஜனத்துக்கிலை.

தவராக வரிசைபடுத்திய மேலான்மை சொற்கள்.

நக்கீரண் வேலை பார்க்க முயன்றால் கொஞ்சமாவது பயபக்தி வேண்டாமா ?

சொல்திருத்தி – தெறிந்தவை 5

கட்டுரைத் தொடரில் இந்த பதிவில் மேலோட்டமான சொல்திருத்தியின் பிழைதிருத்தம் அல்கோரிதம் எப்படி கட்டமைக்கப்பட்டிருக்கு என்றும் பார்க்கலாம்.

படம்1: மெக்சிகோவில் புனித குவடலூப்பே கன்னியின் படம் மிக பிரசித்தி பெற்றதாக அவர்கள் நம்புகின்றனர். எனக்கு பூண்டி மாதா, வேளங்கன்னி மாதா நினைவு. இடம்: பெர்க்கிலி, கலிபொனியா #மக்சிக்கோ #சுவர்ஓவியம் #ourladyofguadalupe

1 பிழைதிருத்தி அல்கோரிதம்

உள்ளீடு : உரையின் சொற்கள் ஒவ்வொன்றாக. இடம்-பொருள் விளங்குவதற்கு [context] நாம் சொல் இடம் பெரும் வரியை சூழலுக்கு உள்ளீடாக கொடுக்கலாம்.

வெளியீடு: தவரான சொற்களின் பட்டியல், மற்றும் இவ்வாறு பிழையான் சொற்களின் வாயில் என்ன வேற்று சொல்லை மற்றாக இணைக்கலாம் என்ற பட்டியல்.

இப்படிப்பட்ட ஒரு அல்கோரிதத்தை செயல்ப்படுத்த நமக்கு ஒரு சொல்பட்டியல் தேவை; இதை நாம் அகராதி என்று வழக்கு மாரி சொல்வோம். அதாவது நமக்கு சொல் மற்றும் அதன் சரியான எழுத்து வடிவம் மற்றுமே தேவை – சொல்லின் பொருள் முதலில் தேவை இல்லை. ஆகையால் இந்த சொல் பட்டியல் மட்டுமே அகராதி என்று நம்மால் கருதப்படும்.

முதல் படியாக உரையில் உள்ள சொற்கள் நேரடியே பட்டியலில் காணப்பட்டால் இதனை நாம் சரியான சொல் என்றும் அவற்றை நீக்கி விடலாம். எ.கா. “அவன் வாத்து முட்டை விருப்பம் கொண்டவளை மட்டுமே சமைக்க தேர்ந்தெடுப்பதாக சீனாவில் அறிவித்திருந்தான்” என்ற 10 சொல் வாக்கியத்தில் ‘அவன்’, ‘வத்து’, ‘முட்டை’, ‘விருப்பம்’, என்ற சொற்கள் சரியாக சொல் பட்டியலில் இருக்கும். தற்போது – 6 சொற்கள் மீதம் உள்ளன.

அடுத்தபடியாக பெயர்சொற்கள் அவற்றின் பட்டியல் கொண்டால் இதனையும் நாம் நீக்கிவிடலாம். மேல் உள்ள செயற்கையான உதாரனத்தில் ‘சீனா’ என்ற பெயர் சொல் நேரடியாக இந்த பட்டியலில் காணப்படும். தற்போது – 5 சொற்கள் மீதம் உள்ளன.

அடுத்தபடியாக வினைச்சொற்கள், மற்றும் இலக்கண வகைபடுத்தப்பட்ட இடைச்சொற்கள், ஆகுபெயர்கள், ஆகியவற்றை சரியாக பகுத்தாய்ந்து விதிகளுடன் உணர்ந்தால் சில அடிச்சொற்கள் கொண்ட பட்டியலின் வழியே மட்டும் அவற்றின் ஆக்கல் தன்மையின் வாயிலாக பல சொற்களை நாம் பகுத்தரியும் வகையில் அனுகலாம். தமிழில், இலத்தின் போல, வினைஎச்சங்கள், வினைச்சொற்கள் அவை வாக்கியத்தில் இடம் பெரும் இடங்கள் கண்டு மருவி வருகிண்ரன. எ.கா. ‘அவன் ஒரு சட்டை வாங்க சென்றான்’, ‘அவள் ஒரு சட்டை வாங்க சொல்வாள்’ என்ற இரு வாக்கியங்களில் ‘செல்’ என்ற சொல் மருவி ஆணுக்கு ‘சென்றான்’ என்றும் பெண்ணுக்கு ‘செல்வாள்’ என்றும் வருகிரது. இது சற்று சிக்கலான ஒரு அல்கொரிதத்தின் கீற்றாகவே அமைகிரது; இதனை அதிகம் மொழியியலாகவும் சற்று கம்மியாக கணினியியலாகவும் கருதலாம்.

 தமிழில் உள்ள இலக்கண விதிகளை பேரா. ராஜம் அவர்கள் letsgrammar.org  என்ற தளத்தில் வினைச்சொற்கள் எப்படி மருவும் என்ற விதிகளை மென்பொருளில் நிருவி அழகாக விளக்கியுள்ளார். இவற்றை ஆங்கிலத்தில் ‘word declension rules’ என்று சொல்வார்கள்.

எண்கள், வடமொழி சொற்கள், நிருத்த சொற்கள், பன்மை சொற்கள், ஆங்கில சொற்கள் ஆகியவற்றையும்  நாம் கண்டறிந்து உரையினை இவற்றிலிருந்து நீக்கம் அல்லது பிழை திருத்தம் செய்யலாம். தட்டுப்பிழைகள், ஒருங்குரி பிழைகள் போன்றவற்றையும் இந்நிலையில்  நாம் நீக்கிவிடலாம்.

2 பிழை வகைகள்

மேல் சொன்னபடி சொல்திருத்திகள் அவைகளின் நான்கு படினிலைகளில் ஏதேனும் ஒரு சொல்லை [உரையில் உள்ள] அந்தந்த வகுப்பில் உள்ளதாகவும் கண்டு, அதே சொல் தவராக உருவெடுத்திருந்தால் அது தவரான சொல் என்றும், அதனை நாம் சரிசெய்து – மாற்றங்களை பரிந்துரைக்கலாம். இதையே ‘wrong word error’ என்று சொல்லாம்.

கடைசியில், இவ்வாரு நான்கு படிகளில் நீக்கம் செய்யப்படாத சொற்களை நாம் அகராதியில் இல்லாத சொற்கள் என்று மட்டுமே கருதலாம். அதாவது இவற்றை ‘non-word error’ என்று கண்டறிந்து சொல்லாம். இவற்றில் நாம் மாற்று சொற்களை தரமுடியாது.

concordance தரவுகள் இருப்பின் ‘அன்பே சிவம் என்பர் சைவ சித்தாந்திகள்‘, மற்றும் ‘அன்பே சவம் என்பர் சைவ சித்தாந்திகள்‘ என்ற இரு வாக்கியங்களுக்கும் மாற்றுகள் மேல் கண்ட சொல்திருத்தியினை மேம்படுத்தி செயல்படுத்த செய்யலாம்.

3. வழங்கல்

இந்த  நிலைகள் முழுதும் ஒரு மேலோட்டமான ஒவ்வொரு சொல்திருத்தியின் கட்டமைப்பிலும் இருப்பதாக நாம் உணரலாம். 

சொல்திருத்தி என்பது உரையினை உள்வாங்கிக்கொண்டு சரியான சொற்களை முழுதும் கண்டுகொள்ளாது. தவரான சொற்களை மட்டுமே மையமாக கொண்டு இயங்குகிரது. என்னடா வாழ்க்கையிது, கால்ஃபு போல் சொல்திருத்திகள், எல்லாமே சரியான ஆட்டத்தினால் நிற்னயிக்கப்படுவதில்லை – பிழையான சொல், பிழையான ஆட்டம் அதே வெற்றியை நிற்னயிக்கிரது. இதன் பணி:

  1. தவரான சொற்களை சுட்டிக்காட்ட வேண்டும்
  2. தவரான சொற்களுக்கு மாற்றங்களை காட்ட வேண்டும்
  3. தவரான் சொல்லுக்கு பயனர் மாற்று தரவிருந்தால் அதனை சொல் பட்டியலில் சேர்த்துக்கொள்ள வேண்டும்; அதனை உரையிலும் மாற்றவேண்டும்.

கடைசியில் அனைத்து உள்ளீடுகளையும் ஒருங்கிணைத்து சரியான உரையை சொல்திருத்தி வழங்கும்.