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

Beginning AI Applications in Tamil – Keras Tutorial

Starting from my first AI application, tamil/english word classification to transitioning into a full-time AI compiler/performance engineer today I have made a career transformation of sorts; I am sharing some information from my learnings here at INFITT-2021 workshop on Keras and beginning AI apps in Tamil.

#infitt2021 தமிழ் கணிமை மாநாட்டிற்கு பயிற்சி பட்டறை அளிக்கிறேன்

  • Download Presentation below:

Key points:

  • தமிழ் இணைய மாநாடு தொடர்பான பட்டறைக்கு உருவாக்கிய iPython புத்தகங்களை பொதுவளியில் இங்கு வைக்கிறேன்; ஆர்வமுள்ளவர்கள் பயன்படுத்தியும், பின்னூட்டங்கள் தரலாம். Notebooks and exercises can be found here https://github.com/Ezhil-Language-Foundation/open-tamil/tree/main/examples/keras-payil-putthagangal
  • AI can be biased based on training algorithms, or data, or both:

“Coded Bias” – சமுகத்தில் உள்ள ஒடுக்குமுறைகளை செயற்கையறிவில் வரையறுப்பது சரியா? #aiethics #ai-side-effects;

குப்பம்மா – உளிவீரன் அப்படின்னு பெயர்வெச்சா கடன் அட்டை கிடைக்காமல் போகவும் ராகுல், ப்ரியா என்று பெயர் வைத்தால் கிடைப்பதற்கும் உள்ள வித்தியாசம் தான் “Coded Bias” – எனில் செயற்கைஅறிவு உங்களுக்கு இது கிடைக்குமா என்ற தீர்வை கணிக்கும் நிலையில் உள்ளோம்! யாரிடம்திறவுகோல் உள்ளது?

நன்றி

-முத்து

அனிமா – ♀ – தமிழ் கணிமைக்கு மகளிர் பங்களிப்புகள்

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

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

  1. அடா லவ்லேஸ் – முதல் கணினி நிரலர் – சார்ல்ஸ் பாபேஜுடன் பணியாற்றினார். காண்க
  2. கிரேஸ் ஹொப்பர் – முதல் கணினி கம்பைலரை (தொகுப்பான்) – உருவாக்கினார். காண்க
  3. பிரான்சஸ் அலன் – கணினி கம்பைலர்களில் SSA, CFG போன்ற பல சாதனை கண்டுபிடிப்புகளையும் நடைமுறை செயலிகளையும் உருவாக்கியவர். காண்க
  4. பார்பரா லிஸ்காவ் – கணினி மொழிகள் / நிரலாக்கத்தில் SOLID என்ற தத்துவார்த்த அடிப்படை கட்டமைப்புகளை கண்டெடுத்து இன்றும் அனைவரும் பயன்படுத்தும் கோட்பாடுகளை உருவாக்கியவர். காண்க
  5. ஷாபி கோல்டுவாஸ்ஸர் – கணினி ரகசிய தகவல் பரிமாற்றம், தகவல் தொடர்பாடல் போன்ற துறைகளில் சாதனையாளர். காண்க
கணிமை எனும் பூந்தோட்டம்; (C) 2021, முத்து அண்ணாமலை. இடம்: வட கலிபோர்னியா, மார்ச்சு 2021.

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

பெயர்முக்கிய பணிகள்நிறுவனம்ஆய்வுகட்டுரைகள், களப்பணிகள் தொடுப்பு
வி எஸ் ராஜம்தமிழ் மொழியியலில் தொல்காப்பியம் மற்றும் வடமொழி இலக்கண மரபுகளை ஒப்பிட்டு ஆய்வுகள் செய்தார். தமிழின் சிறப்பை மேற்கத்திய பல்கலைகளில் வெளிக்கொனற செய்தவர்ஓய்வு பெற்றவர்.
UPenn
A Reference Grammar of Tamil Classical Poetry
காண்க
டிவி கீதாதமிழ் கணினி ஆய்வுக்கூடம் (TACOLA) என்ற அமைப்பை அண்ணா பல்கலைக்கழகத்தில் தொடங்கி பல சிறந்த ஆய்வுகளை மேற்கொண்டார்; முக்கிய பங்களிப்புகளாக விளங்குவது சொல்திருத்தி, தமிழ் வேர்ச்சொல் பகுப்பாய்வு என்பதன் ஆய்வுகளை நடத்தியும் வெளியிட்டார்.அண்ணா
பல்கலைகழகம்
பொறியியலாளர்.
காண்க
ரஞ்சனி
பார்த்தசாரதி
TACOLA ஆய்வு கூடம் நிறுவனர் – முக்கிய பங்களிப்புகளாக விளங்குவது சொல்திருத்தி, தமிழ் வேர்ச்சொல் பகுப்பாய்வு என்பதன் ஆய்வுகளை நடத்தியும் வெளியிட்டார். தொடர்ந்து ஒரு பெரிய ஆய்வு பரம்பரையையும் உருவாக்கியவர்.அண்ணா
பல்கலைகழகம்
காண்க
சோபா லலிதா தேவிAU-KBC. உரை பெயர்/வினை சொல் பாகுபாட்டிற்கு பொன்னியின் செல்வன் காப்பியத்தை POS tagger ஆக உருவாக்கியவர். தமிழ், இந்தி, மலயாளம் கணிமையில் வல்லமை பெற்றவர். மேலும் தொடர்ந்து ஒரு பெரிய ஆய்வு பரம்பரையையும் உருவாக்கியவர்.AU-KBCகாண்க
நித்யா துரைசாமிதமிழ் சந்திப்பிழைதிருத்தியை உருவாக்கியவர். கணியம் நிறுவனர். திறமூல தமிழ்க்கணிமை பங்களிப்பாளர், தொழில் நுட்ப நூலாசிரியர் “எளிய தமிழில் .. ” என்ற நூல்வரிசையின் ஆசிரியர்.தனியார் நிறுவனம்காண்க
சுபலலிதா சி என்தமிழ் இலக்கணம் நன்னூல் வழி இயந்திர உரை ஆய்வுகள், செயற்கையறிவு வழி (AI/ML) சொல்-பொருட்பெயர் தரவகம் (NER) மற்றம் பல ஆய்வுகளை தமிழில் தொடர்ந்து நடத்தி வரும் ஆய்வாளர். TACOLA, KaReFo நிறுவனங்களுடன் இணைந்து ஆய்வுகள் நடத்துபவர்.SRM பல்கலைக்கழகம்காண்க

பத்மாவதி எஸ்
Pattern Recognition; பிரெயிலில் இருந்து தமிழ், ஆங்கிலம், இந்தி மொழிகளுக்கு தானியங்கி மாற்றி.ஆமிர்தா விஸ்வபீடம் பல்கலைக்கழகம்காண்க
மலர்கொடிகணினிவழி மொழியில் ஆய்வாளர். NER. பேரா. சோபா அவருடன் இணைந்து செயல்படுபவர்.AU-KBCகாண்க
தனலெஷ்மி விதமிழ் இலக்கணம், தமிழ் கணிமை, எந்திரவழி கற்றல், சங்க இலக்கியம் உரை ஆய்வுகள்கிருஷ்ணகிரி மகளிர் கலைக்கல்லூரி காண்க
அனிதா இரா.தமிழ் கணினிவழி மொழியியல், சொல்தேடல், சொல்பின்னல், செயற்கையறிவு கொண்டு சொற்றொடர் உணர்ச்சி கண்கானிப்பு,SRM பல்கலைக்கழகம்காண்க
தமிழ் கணிமைக்கு பங்காற்றிய பெண்களில் ஒரு பட்டியல்.

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

-முத்து

கீழ்குறிப்பு: இந்த கட்டுரை எழுத உதவிய பேரா. சுபலலிதா அவர்களுக்கு நன்றி.

மென்பொருளுடன் உறவாட

2004-05 வாக்கில் திருச்சியில் படித்த காலம்; 2004-இல் எங்கள் திருச்சி GLUG என்பதை வழிநடத்திவந்த திரு. பி. விஜயகுமார் அவர்கள் பட்டம் பெற்று வேறு பணிகளுக்கு சென்றார். எங்களது கூட்டாளிகள் ஒரு நிரலாக்கம் போட்டியில் சேரலாம் என்று எண்ணி, பொறியியல் கல்லூரி படிப்பில் நெருக்கமான ஒரு மென்பொருளை தேர்வு செய்தோம்; அதாவது கனு-ஆக்டேவ் GNU Octave – இது MATLAB என்ற மென்பொருளுக்கு தோராயமான மாற்றாக விளங்கும் என்று எண்ணினோம். திட்டம் தொடங்க, அச்சமயத்தில் Octave-இக்கு ஒரு நல்ல திரை இடைமுகம் கிடையாத காலம் – அதில் வந்து GTK என்ற GUI Toolkitஐ இணைக்கலாம் என்பது திட்டம்; எங்கள் குழுவில் யாருமே கணினி பொறியியலில் வல்லுநர் கிடையாது – ஏதோ தட்டுத்தடுமாரி எப்படியோ படிப்படியாக மென்பொருளை “language bindings” என்ற தொழில் நுட்பம் கொண்டு செயல்படுத்திவிட்டோம்.

Octave-GTK, Octave-libglade bindings

அன்று திருச்சியில் மிகப் பெரிய பொறியியல் கல்லூரி என்றாலும், சிற்றுந்தில் ஏரி நெட்கபேயில் அருகிலுள்ள திருவெரும்பூரில் சென்று மட்டும் தான் SSH பொர்ட் 22 firewall தாண்டிய அனுமதி பெற்று இந்த திறமூல மென்பொருளை இணையத்தில், sourceforge-இல் தரவேற்றம் செய்ய வாய்ப்பு இருந்தது. இளங்கலை முடிந்த வாக்கில் இந்த போட்டியில் இரண்டாவது இடம் கொடுத்து அதில் கணிசமான (ஒன்றறை இலட்சம்) பரிசு தொகை குழுவிற்கு கொடுத்தார்கள்! நான் அன்றே அடுத்த விமானத்தில் அமெரிக்கா கிளம்பி ஒடியாந்துட்டேன். இன்றும் இதை நினைத்தால் வேடிக்கையாக இருக்கிறது.

ஓப்பன் தமிழ் என்று தொடங்கும் சமயம், அப்படி ஒரு சேவை இல்லையே என்று என்னால் நம்ப முடியவில்லை. சென்ற பத்தாண்டில் open-tamil, தமிழ்பேசு வலைதளம் என்றும் செயல்படுவதில் ஒரு மகிழ்ச்சி; இந்த தளத்தை Python3 என்றும் Django 3 என்றும் மேம்பாடு செய்தமையால் பல நவீன செயலிகள் – தமிழ் சந்திப்பிழைதிருத்தி, தமிழ் இணையவாணி சொல்திருத்தி, GNU Aspell சொல்திருத்தி போன்றவற்றை செயல்படுத்த முடிந்தது. கணியம் சயத் அபூதாகிர், சீனீ அவர்கள் தொடக்கிவைத்த இந்த வலைதளம் சிந்தனை மற்றும் கட்டமைப்பு, மற்ற மென்பொருள்களையும் பொது பயன்பாட்டிற்கு வழங்க உதவிகர்மாக இருக்கிறது. இந்த சமீபத்திய பதிப்பை வழங்க சூரேன் அவர்களும் குறிப்பிடத்தக்க பங்களிப்புகளை வழங்கியுள்ளார்.

இதனை செயல்படுத்தியவகையில் ஒரே கல்லில் இரண்டு மாங்காய் என்ற கதையாக இருக்கிறது; ஒரே{Tamil Sandhi Checker [சீனீ, நித்யா]} x {Spell Checker(s)} அதனை இரண்டு சொல்திருத்திகளுடன் (வாணி மேசைபதிப்பு/பைத்தான் வழி [ நீச்சல்காரன், சீனீ கணியம் குழு]) மற்றும் ஏஸ்பெல் [GNU ASpell, இளஞ்செழியன் தமிழா/மலேசியா குழுவினர்] இவற்றுடன் remix செய்து ஒரு புதிய சேவயை. http://tamilpesu.us அளிக்கமுடிகிறது என்பதுதான் திறமூல சூழலின் ஒரு பெரும்பலமாக இருக்கிறது.

எழில்-open-tamil contributors meetup (2018)

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

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

பொது வீட்டின் முற்றத்தில் வேரேடுக்கும் ஆலமரத்தை, ஊக்குவிப்போம்! ஊர் ஒன்றுபட்டால் உண்டுவாழ்வு.

Aspell, Hunspell for Tamil

Using GNU ASpell

To install in Ubuntu

$ sudo apt-get install aspell

$ sudo apt-get install aspell-ta

which gets the aspell application, and the Tamil dictionary and Tamil affix files for this project.

Usage

$ aspell -l ta {{filename}}

Aspell in action – via Terminal


Using Hunspell

To install in Ubuntu

$ sudo apt-get install hunspell

Navigate to the path, /usr/share/hunspell/ and install the ta_IN.aff and ta_IN.dic files published by Ashok Ramachandran at TamilNLP or by Elanjelian at Thamizha. This package has not been updated in 7 years. Volunteers needed. Saranya Selvaraj, from Kanchi LUG, published a post in 2009, detailing how to generate affix files and dictionary files for hunspell from a raw wordlist; this needs working with hunspell sources.

Usage

$ hunspell -i utf-8 -d ta_IN {{filename}}

Currently, my installation is incomplete on Ubuntu and this is all I could manage:

Hunspell in action – setup affix files are not perfect in my installation.

Programmatic Use

Using the Python subprocess module concept of pipes we can send a text-file into these spell-checker for suggestion/mis-spelling generation from within your application. One example of such use is added recently to Open-Tamil library to connect aspell, which will be published later on tamilpesu.us.

from spell import ASpell
x=ASpell()
q=x.spellcheck("கட்டுரை")

Performance in Python

Simple performance in Python can be measured by the profile module using a command like,

$ python3 -m profile <script.py> {{args to script.py}}

Measuring performance of a simple iteration of Tamil spell checker shows,

python3 -m profile demo.py 
u'இன்பம்',
u'ஆப்பம்',
u'இன்னம்',
u'இன்பன்',
u'அற்பம்',
u'அப்பம்',
u'அற்றம்',
u'அற்கம்',
u'அக்கம்',
u'அட்டம்',
u'அம்மம்',
u'அற்பர்',
u'அப்பன்',
u'அப்பர்',
u'அப்பல்',
u'அம்பர்',
u'அம்பல்',
u'அன்னம்',
u'அன்னன்',
u'அன்னல்',
u'அன்பன்',
L = 21
         3192524 function calls (2736876 primitive calls) in 32.678 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
       39    0.002    0.000    0.022    0.001 :0(__build_class__)
        2    0.000    0.000    0.000    0.000 :0(__contains__)
     17/4    0.000    0.000    0.144    0.036 :0(__import__)
        2    0.000    0.000    0.000    0.000 :0(__new__)
       35    0.000    0.000    0.000    0.000 :0(_fix_co_filename)
        1    0.000    0.000    0.000    0.000 :0(_getframe)
      253    0.001    0.000    0.001    0.000 :0(acquire_lock)
        1    0.000    0.000    0.000    0.000 :0(add)
       94    0.000    0.000    0.000    0.000 :0(allocate_lock)
       44    0.001    0.000    0.002    0.000 :0(any)
   519988    2.090    0.000    2.090    0.000 :0(append)
       11    0.000    0.000    0.000    0.000 :0(bit_length)
        1    0.000    0.000    0.000    0.000 :0(callable)
        4    0.000    0.000    0.000    0.000 :0(cast)
   197036    0.815    0.000    0.815    0.000 :0(chr)
        1    0.000    0.000    0.000    0.000 :0(close)
        1    0.000    0.000    0.000    0.000 :0(cmp_to_key)
        3    0.000    0.000    0.000    0.000 :0(compile)
        1    0.000    0.000    0.000    0.000 :0(create_builtin)
        8    0.005    0.001    0.005    0.001 :0(create_dynamic)
        1    0.000    0.000    0.000    0.000 :0(dir)
       51    0.000    0.000    0.000    0.000 :0(endswith)
     37/1    0.001    0.000   32.675   32.675 :0(exec)
        1    0.000    0.000    0.000    0.000 :0(exec_builtin)
        8    0.000    0.000    0.000    0.000 :0(exec_dynamic)
        1    0.000    0.000    0.000    0.000 :0(exp)
       32    0.000    0.000    0.001    0.000 :0(extend)
       32    0.000    0.000    0.000    0.000 :0(find)
       17    0.000    0.000    0.000    0.000 :0(format)
       70    0.000    0.000    0.000    0.000 :0(from_bytes)
      117    0.001    0.000    0.001    0.000 :0(fspath)
   412207    1.985    0.000    1.985    0.000 :0(get)
      146    0.001    0.000    0.001    0.000 :0(get_ident)
      274    0.001    0.000    0.001    0.000 :0(getattr)
       36    0.001    0.000    0.001    0.000 :0(getcwd)
      168    0.001    0.000    0.001    0.000 :0(getlower)
       14    0.000    0.000    0.000    0.000 :0(globals)
      270    0.001    0.000    0.001    0.000 :0(hasattr)
        1    0.000    0.000    0.000    0.000 :0(index)
       20    0.000    0.000    0.000    0.000 :0(is_builtin)
       44    0.000    0.000    0.000    0.000 :0(is_frozen)
        6    0.000    0.000    0.000    0.000 :0(isidentifier)
      296    0.001    0.000    0.001    0.000 :0(isinstance)
        8    0.000    0.000    0.000    0.000 :0(items)
    64438    0.311    0.000    0.311    0.000 :0(join)
   172718    0.760    0.000    0.760    0.000 :0(keys)
129971/129966    0.664    0.000    0.664    0.000 :0(len)
        5    0.001    0.000    0.001    0.000 :0(listdir)
       35    0.010    0.000    0.010    0.000 :0(loads)
        2    0.000    0.000    0.000    0.000 :0(log)
        1    0.000    0.000    0.000    0.000 :0(lookup)
      101    0.000    0.000    0.000    0.000 :0(lower)
      102    0.000    0.000    0.000    0.000 :0(match)
        4    0.000    0.000    0.000    0.000 :0(max)
       39    0.000    0.000    0.000    0.000 :0(min)
        1    0.000    0.000    0.000    0.000 :0(open)
        1    0.000    0.000    0.000    0.000 :0(openssl_md5)
        1    0.000    0.000    0.000    0.000 :0(openssl_sha1)
        1    0.000    0.000    0.000    0.000 :0(openssl_sha224)
        1    0.000    0.000    0.000    0.000 :0(openssl_sha256)
        1    0.000    0.000    0.000    0.000 :0(openssl_sha384)
        1    0.000    0.000    0.000    0.000 :0(openssl_sha512)
    99429    0.397    0.000    0.397    0.000 :0(ord)
   172717    0.753    0.000    0.753    0.000 :0(pop)
       22    0.001    0.000    0.001    0.000 :0(print)
       37    0.002    0.000    0.002    0.000 :0(read)
      253    0.001    0.000    0.001    0.000 :0(release_lock)
        1    0.000    0.000    0.000    0.000 :0(replace)
        1    0.000    0.000    0.000    0.000 :0(repr)
        1    0.000    0.000    0.000    0.000 :0(rfind)
      354    0.002    0.000    0.002    0.000 :0(rpartition)
      977    0.004    0.000    0.004    0.000 :0(rstrip)
        1    0.000    0.000    0.000    0.000 :0(seed)
       25    0.000    0.000    0.000    0.000 :0(setattr)
        2    0.000    0.000    0.000    0.000 :0(setdefault)
        1    0.003    0.003    0.003    0.003 :0(setprofile)
        2    0.000    0.000    0.000    0.000 :0(sort)
   172718    1.104    0.000    1.104    0.000 :0(sorted)
        9    0.000    0.000    0.000    0.000 :0(split)
        1    0.013    0.013    0.013    0.013 :0(splitlines)
        1    0.000    0.000    0.000    0.000 :0(sqrt)
       14    0.000    0.000    0.000    0.000 :0(startswith)
      187    0.004    0.000    0.004    0.000 :0(stat)
    63896    0.314    0.000    0.314    0.000 :0(strip)
        4    0.000    0.000    0.000    0.000 :0(tolist)
        5    0.000    0.000    0.000    0.000 :0(translate)
        1    0.000    0.000    0.000    0.000 :0(union)
        4    0.000    0.000    0.000    0.000 :0(update)
        1    0.006    0.006    0.006    0.006 :0(utf_8_decode)
       73    0.001    0.000    0.001    0.000 <frozen importlib._bootstrap>:103(release)
       48    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:143(__init__)
       48    0.001    0.000    0.004    0.000 <frozen importlib._bootstrap>:147(__enter__)
       48    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap>:151(__exit__)
       73    0.001    0.000    0.003    0.000 <frozen importlib._bootstrap>:157(_get_module_lock)
       47    0.001    0.000    0.001    0.000 <frozen importlib._bootstrap>:176(cb)
       25    0.000    0.000    0.002    0.000 <frozen importlib._bootstrap>:194(_lock_unlock_module)
     70/4    0.001    0.000    0.149    0.037 <frozen importlib._bootstrap>:211(_call_with_frames_removed)
      488    0.002    0.000    0.002    0.000 <frozen importlib._bootstrap>:222(_verbose_message)
        1    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:232(_requires_builtin_wrapper)
       44    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:307(__init__)
       44    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:311(__enter__)
       44    0.001    0.000    0.002    0.000 <frozen importlib._bootstrap>:318(__exit__)
      176    0.001    0.000    0.001    0.000 <frozen importlib._bootstrap>:321(<genexpr>)
       35    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:35(_new_module)
       45    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:369(__init__)
       78    0.001    0.000    0.006    0.000 <frozen importlib._bootstrap>:403(cached)
       72    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap>:416(parent)
       44    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:424(has_location)
        1    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:433(spec_from_loader)
       44    0.002    0.000    0.010    0.000 <frozen importlib._bootstrap>:504(_init_module_attrs)
       44    0.001    0.000    0.018    0.000 <frozen importlib._bootstrap>:564(module_from_spec)
       47    0.001    0.000    0.001    0.000 <frozen importlib._bootstrap>:58(__init__)
     44/4    0.002    0.000    0.151    0.038 <frozen importlib._bootstrap>:651(_load_unlocked)
       45    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:707(find_spec)
        1    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:728(create_module)
        1    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:736(exec_module)
        1    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:753(is_package)
       73    0.001    0.000    0.001    0.000 <frozen importlib._bootstrap>:78(acquire)
       44    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap>:780(find_spec)
      133    0.001    0.000    0.001    0.000 <frozen importlib._bootstrap>:843(__enter__)
      133    0.001    0.000    0.001    0.000 <frozen importlib._bootstrap>:847(__exit__)
       45    0.002    0.000    0.044    0.001 <frozen importlib._bootstrap>:870(_find_spec)
     48/3    0.001    0.000    0.156    0.052 <frozen importlib._bootstrap>:936(_find_and_load_unlocked)
     48/3    0.002    0.000    0.156    0.052 <frozen importlib._bootstrap>:966(_find_and_load)
    72/24    0.001    0.000    0.139    0.006 <frozen importlib._bootstrap>:997(_handle_fromlist)
        5    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap_external>:1067(_path_hooks)
      106    0.001    0.000    0.003    0.000 <frozen importlib._bootstrap_external>:1080(_path_importer_cache)
       44    0.002    0.000    0.037    0.001 <frozen importlib._bootstrap_external>:1117(_get_spec)
       44    0.000    0.000    0.038    0.001 <frozen importlib._bootstrap_external>:1149(find_spec)
        5    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap_external>:1196(__init__)
       40    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:1202(<genexpr>)
       43    0.001    0.000    0.002    0.000 <frozen importlib._bootstrap_external>:1228(_get_spec)
       89    0.007    0.000    0.031    0.000 <frozen importlib._bootstrap_external>:1233(find_spec)
        5    0.000    0.000    0.002    0.000 <frozen importlib._bootstrap_external>:1281(_fill_cache)
        5    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap_external>:1310(<setcomp>)
        5    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap_external>:1322(path_hook_for_FileFinder)
       70    0.003    0.000    0.009    0.000 <frozen importlib._bootstrap_external>:263(cache_from_source)
       43    0.001    0.000    0.006    0.000 <frozen importlib._bootstrap_external>:361(_get_cached)
       89    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:37(_relax_case)
       35    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap_external>:393(_check_name_wrapper)
       35    0.001    0.000    0.003    0.000 <frozen importlib._bootstrap_external>:430(_validate_bytecode_header)
       35    0.001    0.000    0.011    0.000 <frozen importlib._bootstrap_external>:485(_compile_bytecode)
       70    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap_external>:52(_r_long)
       43    0.001    0.000    0.001    0.000 <frozen importlib._bootstrap_external>:524(spec_from_file_location)
      453    0.005    0.000    0.016    0.000 <frozen importlib._bootstrap_external>:57(_path_join)
      453    0.006    0.000    0.009    0.000 <frozen importlib._bootstrap_external>:59(<listcomp>)
       70    0.001    0.000    0.002    0.000 <frozen importlib._bootstrap_external>:63(_path_split)
       35    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:669(create_module)
     35/4    0.001    0.000    0.149    0.037 <frozen importlib._bootstrap_external>:672(exec_module)
       35    0.002    0.000    0.024    0.001 <frozen importlib._bootstrap_external>:743(get_code)
      187    0.001    0.000    0.005    0.000 <frozen importlib._bootstrap_external>:75(_path_stat)
       35    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:800(__init__)
       35    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:825(get_filename)
       35    0.002    0.000    0.003    0.000 <frozen importlib._bootstrap_external>:830(get_data)
       35    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap_external>:840(path_stats)
       63    0.001    0.000    0.002    0.000 <frozen importlib._bootstrap_external>:85(_path_is_mode_type)
        8    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:908(__init__)
        8    0.000    0.000    0.006    0.001 <frozen importlib._bootstrap_external>:919(create_module)
        8    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:927(exec_module)
       58    0.000    0.000    0.002    0.000 <frozen importlib._bootstrap_external>:94(_path_isfile)
        5    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:99(_path_isdir)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 <string>:5(DictionaryWithPredicate)
        1    0.000    0.000    0.000    0.000 TextSummaryExtractor.py:19(SummaryTool)
        1    0.000    0.000    0.000    0.000 TextSummaryExtractor.py:3(<module>)
        1    0.000    0.000    0.000    0.000 __future__.py:48(<module>)
        1    0.000    0.000    0.000    0.000 __future__.py:78(_Feature)
        9    0.000    0.000    0.000    0.000 __future__.py:79(__init__)
        1    0.000    0.000    0.000    0.000 __init__.py:1(<module>)
        1    0.000    0.000    0.004    0.004 __init__.py:3(<module>)
        1    0.000    0.000    0.002    0.002 __init__.py:357(namedtuple)
        2    0.000    0.000    0.023    0.012 __init__.py:4(<module>)
        2    0.000    0.000    0.000    0.000 __init__.py:420(<genexpr>)
        2    0.000    0.000    0.000    0.000 __init__.py:422(<genexpr>)
        1    0.000    0.000    0.120    0.120 __init__.py:6(<module>)
       43    0.000    0.000    0.000    0.000 _compat_pickle.py:165(<genexpr>)
       85    0.000    0.000    0.000    0.000 _compat_pickle.py:167(<genexpr>)
        1    0.000    0.000    0.001    0.001 _compat_pickle.py:9(<module>)
       14    0.000    0.000    0.000    0.000 abc.py:9(abstractmethod)
        1    0.000    0.000    0.003    0.003 bisect.py:1(<module>)
        1    0.000    0.000    0.000    0.000 codecs.py:347(__init__)
        1    0.000    0.000    0.000    0.000 codecs.py:422(__init__)
        1    0.000    0.000    0.007    0.007 codecs.py:450(read)
        1    0.000    0.000    0.020    0.020 codecs.py:603(readlines)
        1    0.000    0.000    0.000    0.000 codecs.py:678(__init__)
        1    0.000    0.000    0.020    0.020 codecs.py:704(readlines)
        1    0.000    0.000    0.000    0.000 codecs.py:744(__enter__)
        1    0.000    0.000    0.000    0.000 codecs.py:747(__exit__)
        1    0.000    0.000    0.000    0.000 codecs.py:862(open)
        5    0.000    0.000    0.000    0.000 copy.py:66(copy)
        1    0.000    0.000    0.000    0.000 datastore.py:115(Node)
   172718    1.404    0.000    1.404    0.000 datastore.py:116(__init__)
        1    0.000    0.000    0.000    0.000 datastore.py:122(DTrie)
        1    0.000    0.000    0.000    0.000 datastore.py:126(__init__)
        1    0.000    0.000    0.000    0.000 datastore.py:14(Queue)
      222    0.003    0.000    0.058    0.000 datastore.py:140(isWord)
      222    0.012    0.000    0.055    0.000 datastore.py:146(isWordAndTrie)
    63896    4.643    0.000   18.098    0.000 datastore.py:178(add)
        1    0.000    0.000    0.000    0.000 datastore.py:236(getAllWordsIterable)
518546/63897    8.297    0.000   11.944    0.000 datastore.py:239(getAllWordsIterableHelper)
        1    0.000    0.000    0.000    0.000 datastore.py:252(RTrie)
        1    0.000    0.000    0.000    0.000 datastore.py:285(TamilTrie)
        1    0.000    0.000    0.016    0.016 datastore.py:4(<module>)
        1    0.000    0.000    0.000    0.000 datastore.py:53(Trie)
        1    0.000    0.000    0.000    0.000 datastore.py:56(__init__)
    64097    0.641    0.000    8.865    0.000 datastore.py:60(get_letters_impl)
        1    0.000    0.000   32.675   32.675 demo.py:5(<module>)
        1    0.000    0.000    0.000    0.000 dictionary.py:111(Agarathi)
        1    0.000    0.000    0.000    0.000 dictionary.py:112(__init__)
    63896    0.657    0.000   18.755    0.000 dictionary.py:139(add)
      222    0.002    0.000    0.060    0.000 dictionary.py:145(isWord)
        1    0.000    0.000    0.000    0.000 dictionary.py:151(getDictionaryPath)
    63897    0.496    0.000   12.440    0.000 dictionary.py:157(getAllWordsIterable)
        1    0.000    0.000    0.000    0.000 dictionary.py:16(Dictionary)
        1    0.000    0.000    0.000    0.000 dictionary.py:170(EmptyAgarathi)
        1    0.000    0.000    0.000    0.000 dictionary.py:174(TamilVU)
        1    0.000    0.000    0.000    0.000 dictionary.py:175(__init__)
        1    0.000    0.000    0.000    0.000 dictionary.py:178(EnglishLinux)
        1    0.000    0.000    0.000    0.000 dictionary.py:189(VatamozhiMonierWilliams)
        1    0.000    0.000    0.000    0.000 dictionary.py:193(ParallelDictionary)
        1    0.000    0.000    0.000    0.000 dictionary.py:210(Madurai)
        1    0.000    0.000    0.000    0.000 dictionary.py:217(Wikipedia)
        1    0.000    0.000    0.000    0.000 dictionary.py:225(DictionaryBuilder)
        1    0.000    0.000   32.416   32.416 dictionary.py:226(create)
        1    0.000    0.000    0.023    0.023 dictionary.py:4(<module>)
        1    0.279    0.279   12.719   12.719 dictionary.py:47(getSize)
        1    0.608    0.608   19.697   19.697 dictionary.py:58(loadWordFile)
        1    0.000    0.000    0.000    0.000 dictionary.py:71(SimpleDictionary)
        1    0.000    0.000    0.014    0.014 encode2unicode.py:23(<module>)
        1    0.005    0.005    0.005    0.005 encode2utf8.py:24(<module>)
      166    0.001    0.000    0.003    0.000 enum.py:265(__call__)
      166    0.001    0.000    0.002    0.000 enum.py:515(__new__)
       33    0.000    0.000    0.000    0.000 enum.py:592(name)
        2    0.000    0.000    0.000    0.000 enum.py:597(value)
        2    0.000    0.000    0.001    0.001 enum.py:758(_missing_)
        2    0.000    0.000    0.001    0.001 enum.py:765(_create_pseudo_member_)
        9    0.000    0.000    0.002    0.000 enum.py:795(__or__)
       74    0.001    0.000    0.003    0.000 enum.py:801(__and__)
       11    0.000    0.000    0.000    0.000 enum.py:820(_high_bit)
        2    0.000    0.000    0.001    0.001 enum.py:837(_decompose)
        2    0.000    0.000    0.001    0.000 enum.py:855(<listcomp>)
        5    0.000    0.000    0.000    0.000 enum.py:866(<lambda>)
       15    0.000    0.000    0.000    0.000 enum.py:872(_power_of_two)
       14    0.000    0.000    0.005    0.000 hashlib.py:116(__get_openssl_constructor)
        1    0.000    0.000    0.010    0.010 hashlib.py:54(<module>)
        8    0.000    0.000    0.004    0.001 hashlib.py:73(__get_builtin_constructor)
        1    0.000    0.000    0.000    0.000 ipaconvert.py:24(<module>)
        1    0.000    0.000    0.003    0.003 numeral.py:5(<module>)
        1    0.000    0.000    0.000    0.000 orddic.py:5(<module>)
        1    0.000    0.000    0.005    0.005 pickle.py:181(<listcomp>)
        1    0.000    0.000    0.000    0.000 pickle.py:184(_Framer)
        1    0.000    0.000    0.000    0.000 pickle.py:220(_Unframer)
        1    0.000    0.000    0.013    0.013 pickle.py:24(<module>)
        1    0.000    0.000    0.000    0.000 pickle.py:345(_Pickler)
        1    0.000    0.000    0.000    0.000 pickle.py:64(PickleError)
        1    0.000    0.000    0.000    0.000 pickle.py:68(PicklingError)
        1    0.000    0.000    0.000    0.000 pickle.py:75(UnpicklingError)
        1    0.000    0.000    0.000    0.000 pickle.py:88(_Stop)
        1    0.000    0.000    0.000    0.000 pickle.py:986(_Unpickler)
        1    0.000    0.000    0.000    0.000 posixpath.py:102(split)
        1    0.000    0.000    0.000    0.000 posixpath.py:329(normpath)
        1    0.000    0.000    0.000    0.000 posixpath.py:367(abspath)
        2    0.000    0.000    0.000    0.000 posixpath.py:39(_get_sep)
        1    0.000    0.000    0.000    0.000 posixpath.py:62(isabs)
        1    0.000    0.000    0.000    0.000 pprint.py:35(<module>)
        1    0.000    0.000    0.000    0.000 pprint.py:72(_safe_key)
        1    0.000    0.000    0.000    0.000 pprint.py:98(PrettyPrinter)
        1    0.000    0.000   32.678   32.678 profile:0(<code object <module> at 0x102c77810, file "demo.py", line 5>)
        0    0.000             0.000          profile:0(profiler)
        1    0.000    0.000    0.000    0.000 qwertykbd.py:9(<module>)
        1    0.000    0.000    0.021    0.021 random.py:38(<module>)
        1    0.000    0.000    0.000    0.000 random.py:663(SystemRandom)
        1    0.000    0.000    0.000    0.000 random.py:71(Random)
        1    0.000    0.000    0.000    0.000 random.py:87(__init__)
        1    0.000    0.000    0.000    0.000 random.py:96(seed)
      102    0.001    0.000    0.004    0.000 re.py:169(match)
        2    0.000    0.000    0.020    0.010 re.py:231(compile)
        1    0.000    0.000    0.000    0.000 re.py:249(escape)
      104    0.001    0.000    0.022    0.000 re.py:286(_compile)
        1    0.000    0.000    0.000    0.000 regexp.py:5(<module>)
        1    0.000    0.000    0.000    0.000 resources.py:10(<listcomp>)
        1    0.000    0.000    0.000    0.000 resources.py:13(get_data_dir)
        1    0.000    0.000    0.000    0.000 resources.py:17(get_data_dictionaries)
        1    0.000    0.000    0.000    0.000 resources.py:28(get_data_categories)
       14    0.000    0.000    0.000    0.000 resources.py:42(mk_path)
        1    0.000    0.000    0.001    0.001 resources.py:5(<module>)
        1    0.000    0.000    0.000    0.000 resources.py:9(_make_dict_with_path)
        1    0.000    0.000    0.000    0.000 santhirules.py:4(<module>)
      164    0.001    0.000    0.002    0.000 sre_compile.py:102(fixup)
        8    0.000    0.000    0.005    0.001 sre_compile.py:223(_compile_charset)
        8    0.002    0.000    0.005    0.001 sre_compile.py:250(_optimize_charset)
        5    0.000    0.000    0.000    0.000 sre_compile.py:376(_mk_bitmap)
        5    0.000    0.000    0.000    0.000 sre_compile.py:378(<listcomp>)
        4    0.000    0.000    0.000    0.000 sre_compile.py:381(_bytes_to_codes)
        4    0.000    0.000    0.000    0.000 sre_compile.py:388(_simple)
        2    0.000    0.000    0.000    0.000 sre_compile.py:414(_get_literal_prefix)
        2    0.000    0.000    0.000    0.000 sre_compile.py:441(_get_charset_prefix)
        3    0.000    0.000    0.001    0.000 sre_compile.py:482(_compile_info)
        6    0.000    0.000    0.000    0.000 sre_compile.py:539(isstring)
        3    0.000    0.000    0.012    0.004 sre_compile.py:542(_code)
        3    0.000    0.000    0.022    0.007 sre_compile.py:557(compile)
     16/3    0.001    0.000    0.011    0.004 sre_compile.py:64(_compile)
       16    0.000    0.000    0.000    0.000 sre_parse.py:111(__init__)
       15    0.000    0.000    0.000    0.000 sre_parse.py:159(__len__)
       48    0.000    0.000    0.001    0.000 sre_parse.py:163(__getitem__)
        4    0.000    0.000    0.000    0.000 sre_parse.py:167(__setitem__)
       18    0.000    0.000    0.000    0.000 sre_parse.py:171(append)
    24/11    0.000    0.000    0.001    0.000 sre_parse.py:173(getwidth)
        3    0.000    0.000    0.000    0.000 sre_parse.py:223(__init__)
      329    0.001    0.000    0.001    0.000 sre_parse.py:232(__next)
       51    0.000    0.000    0.000    0.000 sre_parse.py:248(match)
      270    0.002    0.000    0.003    0.000 sre_parse.py:253(get)
        4    0.000    0.000    0.000    0.000 sre_parse.py:266(getuntil)
       24    0.000    0.000    0.000    0.000 sre_parse.py:285(tell)
        1    0.000    0.000    0.000    0.000 sre_parse.py:287(seek)
        3    0.000    0.000    0.000    0.000 sre_parse.py:342(_escape)
      8/3    0.000    0.000    0.009    0.003 sre_parse.py:407(_parse_sub)
     11/3    0.002    0.000    0.009    0.003 sre_parse.py:470(_parse)
        3    0.000    0.000    0.000    0.000 sre_parse.py:76(__init__)
       14    0.000    0.000    0.000    0.000 sre_parse.py:81(groups)
        3    0.000    0.000    0.001    0.000 sre_parse.py:828(fix_flags)
        4    0.000    0.000    0.000    0.000 sre_parse.py:84(opengroup)
        3    0.000    0.000    0.010    0.003 sre_parse.py:844(parse)
        4    0.000    0.000    0.000    0.000 sre_parse.py:96(closegroup)
        1    0.000    0.000    0.021    0.021 string.py:15(<module>)
        1    0.000    0.000    0.000    0.000 string.py:169(Formatter)
        1    0.000    0.000    0.000    0.000 string.py:55(_TemplateMetaclass)
        1    0.000    0.000    0.020    0.020 string.py:65(__init__)
        1    0.000    0.000    0.000    0.000 string.py:77(Template)
        1    0.001    0.001    0.002    0.002 tace16.py:358(<listcomp>)
        1    0.000    0.000    0.002    0.002 tace16.py:4(<module>)
        1    0.000    0.000    0.000    0.000 tamil99kbd.py:11(<module>)
        1    0.000    0.000    0.000    0.000 transliteration.py:23(<module>)
        1    0.001    0.001    0.002    0.002 tscii.py:13(<module>)
      256    0.001    0.000    0.001    0.000 tscii.py:16(<lambda>)
        1    0.000    0.000    0.000    0.000 tweetparser.py:12(TweetParser)
        1    0.000    0.000    0.000    0.000 tweetparser.py:60(TamilTweetParser)
        1    0.000    0.000    0.004    0.004 tweetparser.py:9(<module>)
       35    0.000    0.000    0.000    0.000 types.py:135(__get__)
        1    0.000    0.000    0.147    0.147 typographical.py:14(<module>)
    632/1    0.026    0.000    0.041    0.041 typographical.py:20(oridam_generate_patterns)
        1    0.001    0.001    0.102    0.102 typographical.py:50(corrections)
        1    0.000    0.000    0.000    0.000 unicode2encode.py:25(<module>)
        1    0.000    0.000    0.003    0.003 unicode2ipa.py:23(<module>)
        1    0.003    0.003    0.031    0.031 utf8.py:11(<module>)
        1    0.000    0.000    0.000    0.000 utf8.py:159(<listcomp>)
      288    0.001    0.000    0.001    0.000 utf8.py:234(uyir_len)
      288    0.001    0.000    0.001    0.000 utf8.py:237(mei_len)
      288    0.003    0.000    0.005    0.000 utf8.py:274(uyirmei_constructed)
    98518    1.125    0.000    1.940    0.000 utf8.py:303(<lambda>)
        4    0.000    0.000    0.000    0.000 utf8.py:384(_make_set)
    64097    4.222    0.000    8.224    0.000 utf8.py:393(get_letters)
        1    0.000    0.000    0.000    0.000 utf8.py:758(CacheGetLettersMixin)
        1    0.000    0.000    0.000    0.000 utf8.py:760(__init__)
    64118    0.895    0.000   10.059    0.000 utf8.py:767(get_letters)
        1    0.000    0.000    0.000    0.000 wordutils.py:310(DictionaryFixedWordList)
        1    0.000    0.000    0.029    0.029 wordutils.py:4(<module>)

Basically, this confirms solthiruthi, and similar search based spellers, as a computational problem for Tamil spell checkers claimed in our paper. Performance is all it takes to make the results better, more accurate and faster.