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

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

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

  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)

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

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

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

Vaani SpellChecker

தமிழில் முன்னிலை சொல்திருத்தியாக விளங்கும் வாணி ஆக்கம் / சவால்கள் பற்றி அதன் ஆக்குநர் திரு. நீச்சல்காரன் வழி நடத்திவருகிறார். வலை: http://vaani.neechalkaran.com/

http://vaani.neechalkaran.com/

பல நாட்களாக எதிர்பார்ப்புடன் காத்திருந்த வாணி பிழைதிருத்தி இயக்கம் மற்றும் சவால்கள் பற்றிய அருமையான உரையை திரு நீச்சல்காரன் @Neechalkaran ஜேஎன்யூ பல்கலைகழகத்தில் வழங்கினார்.

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.

2021

இணைமதி எழுத்துரு கொண்டு செய்யப்பட்ட தமிழ் அரிச்சுவடி

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

  1.  சில சிக்கலான தமிழ் மொழிபெயர்ப்புகளை முடிப்பது (compiler பற்றிய கட்டுரை, தமிழில் அல்கொரிதம் பற்றியும் தகவல் தரவமைப்புகள் பற்றியும் புத்தகங்கள்).
  2. நிரல் அளவில் இரண்டு அல்லது மூன்று ஓப்பன் தமிழ் வெளியீடுகளை ஏற்பாடு செய்வது
  3. புதிய திட்டங்கள் அளவில் விட்டர்பீ அல்கொரிதத்தின் வாயிலான தமிழ் சொல்திருத்தி செயல்பாட்டிற்கு தீர்வு காணுதல்.

புடிச்சா புளியங்கொம்பு; முயற்சிகள் வீண்போவதில்லை. சவால்களை சந்திப்போம்.

அன்புடன்

-முத்து

சில பைத்தான் தொகுப்புகளின் வெளியீடு

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

1. தமிழிணையவாணி

Python package released for Tamilinaya-Spellchecker by @tshrinivasan and team’s work (based on @Neechalkaran creation) http://pypi.org/project/tamilinayavaani/0.13/ Windows, Mac and Linux users can get the package by command:

$ pip install tamilinayavaani==0.13

Demo co-lab: here

2. தமிழ்சொற்பிழைதிருத்தி

Packaged tamilspellchecker https://github.com/malaikannan/TamilSpellChecker from @malai_san +team for Python https://pypi.org/project/tamilspellchecker/0.10/ – APACHE 2.0. Get your copy:

$ pip install tamilspellchecker>=0.10

Demo co-lab: here

ஓப்பன் தமிழ் வரிசைஎண்0.98 வெளியீடு

open-tamil v0.9 release.
ஓப்பன் தமிழ் வரிசை எண்: 0.98

வணக்கம் நண்பர்களே!

சென்ற வாரம் நவம்பர் மாதம் 13ஆம் நாள் அன்று open-tamil வரிசை எண் 0.98 வெளியீடு ஆனது; இந்த நிரல் தொகுப்பை பைத்தான் மொழியில் பெற,

$ pip install –upgrade open-tamil >=0.98

என்ற கட்டளைகள கொடுக்கலாம்.

இதில் புதிதாக சிறு வழு நீக்கங்கள் உள்ளன,

  1. தமிழ் மாத்திரை கணக்கிடும் சேவை திருத்தம் செய்யப்பட்டது; (tamil.utf8.total_maaththirai)
  2. tamil.regexp மோட்யூல் சீர்செய்து வழு நீக்கம் செய்யப்பட்டது; (வழு 228)

அன்புடன்,

(ஓப்பன் தமிழ் குழுவிற்காக) முத்து

கலிபோர்னியா

உயிர் எழுத்துக்கள்

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

வண்ணங்களும் எழுத்துக்களும் கண்டால் இதைப்போன்ற திட்டங்களிலும் செயலிகளையும் உருவாக்கவேண்டும் என்றும் ஒருவித ஏக்கம் தோன்றுகிறது. காண்பதெல்லாம் கண்களை குளிரவைக்கும் வட்டெழுத்துக்கள்.

மாத்திரை பார்வையில் குறள்

                    ஆசிரியர்: பரதன் தியாகலிங்கம், முத்து அண்ணாமலை

திருக்குறள் 1330 குறட்பாக்களை மாத்திரை பார்வையில் கணினிவழியாக இயல்மொழி ஆய்வு செய்தால் என்ன கிடைக்கும்? திருக்குறளை மாத்திரை மதிப்பின் வாயிலாக வரிசைப்படுத்திப் பார்த்தால் என்ன கிடைக்கும் ? ஏதேனும் புதிய புரிதல் உண்டாகிறதா? பார்க்கலாம் வாருங்கள்.

செய்முறை – அல்கோரிதம்

குறளின் மாத்திரை அளவு என்பது குறளின் உள்ள அனைத்து சீர்பிரிக்காத சொற்களின் தனி மாத்திரை அளவுகளின் சமன்பாடு என்று கொள்ளலாம். இது நமது ஆய்வின் முன்கூட்டிய புரிதல்.

முதலில் இதற்கு ஒரு தமிழில் உள்ள மாத்திரை விதிகளை கணிக்கும் சார்பு தேவைப்படுகிறது. இதனை open-tamil 0.97 தொகுப்பில் ‘tamil.utf8.total_maththirai’ என்ற நிரல்துண்டு வழுங்குகிறது. மேலும் குறட்பக்களை ‘kural.Thirukkural().get_kural_no()’ என்பதிலிருந்து பெரலாம். இரண்டினையும் சேர்த்து ஒரு சிரிய கோவ்சியன் வளையம் பொருத்தலுடன் இணைத்துப்பார்த்தால் இப்படி தெரிகிறது; இதன் மூல நிரல் kural_mathirai.py என்பதில் காணலாம்.

#!/usr/bin/env python3
# This Python file uses the following encoding: utf-8
from kural import Thirukkural
from tamil.utf8 import get_letters, get_tamil_words, total_maaththirai
from collections import Counter, OrderedDict
from pprint import pprint
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
from scipy.optimize import curve_fit

# Define model function to be used to fit to the data above:
def gauss(x, *p):
    A, mu, sigma = p
    return A*np.exp(-(x-mu)**2/(2.*sigma**2))

def main():
    eq = Counter()
    eqd = {}
    kural = Thirukkural()
    for kural_no in range(1330):
        kural_words = get_tamil_words(get_letters(kural.get_kural_no(kural_no+1).ta))
        mathirai = sum([total_maaththirai(word) for word in kural_words])
        if eq[mathirai] == 0:
                eqd[mathirai] = [kural_no+1]
        else:
            eqd[mathirai].append(kural_no+1)
        eq[mathirai] += 1
    eq_sorted=OrderedDict(sorted(eq.items(),key=lambda x: x))
    print("total = ",sum(eq.values()))
    plt.scatter(eq_sorted.keys(),eq_sorted.values())
    plt.ylabel(u'குறட்பாக்கள் எண்ணிக்கை',{'fontname':'Catamaran'})
    plt.xlabel(u'மாத்திரை அளவு',{'fontname':'Catamaran'}) #Arial Unicode MS'})

    # p0 is the initial guess for the fitting coefficients (A, mu and sigma above)
    p0 = [75., 20., 5.]
    coeff, var_matrix = curve_fit(gauss, list(eq_sorted.keys()), list(eq_sorted.values()), p0=p0)

    # Get the fitted curve
    hist_fit = gauss(list(eq_sorted.keys()), *coeff)
    plt.plot(eq_sorted.keys(), hist_fit, label='Gaussian Fitted data (mean=%g, std=%g)'%(coeff[1],coeff[2]))
    plt.title(r'குறள் மாத்திரை வரிசை (Gauss \mu=%g, \sigma=%g)'%(coeff[1],coeff[2]),{'fontname':'Catamaran'})

    # Finally, lets get the fitting parameters, i.e. the mean and standard deviation:
    print ('Fitted mean = ', coeff[1])
    print('Fitted standard deviation = ', coeff[2])

    plt.show()


if __name__ == "__main__":
    main()
திருக்குறள் மாத்திரை வரிசை ஒத்திய குறட்பா எண்ணிக்கை

விடைகள்

  1. திருக்குறளில் உள்ள சராசரி குறட்பாவின் மாத்திரை அளவு μ ~ 29.5. இதன் மாற்றமளவு σ ~ 2.5
  2. மாத்திரை பார்வையில் திருக்குறள் ஏரக்குறைய கௌசியன் பரப்பை போல் அமைந்துள்ளது
  3. திருக்குறள் மாத்திரை வடிவிலும் கூட அழகிய சீர்மை கொண்டதாக மிகவும் கோர்வையுடன் அமைந்தது.
  4. குறைந்த அளவு நமாத்திரை  நீளம் (23) கொண்ட குறளானவை குறள் எண்கள், 391, 426, 483, 786

“கற்க கசடறக் கற்பவை கற்றபின்
நிற்க அதற்குத் தக.” குறள் 391.

  1. அதிக அளவு நீளமான மாத்திரை (37.5) கொண்ட குறளானது குறள் வரிகள்,

”காணாதான் காட்டுவான் தான்காணான் காணாதான்
கண்டானாம் தான்கண்ட வாறு.” குறள் 849.

மத்திரை அளவுகுறள் எண்ணிக்கை                 குறள் எண்(கள்)
234391, 426, 483, 786
23.5567, 77, 366, 637, 979
248108, 485, 961, 965, 1042, 1048, 1277, 1304
24.57304, 467, 602, 652, 1118, 1322, 1324
2520133,
193,
331,
360,
412,
477,
546,
559,
576,
592,
616,
771,
796,
846,
947,
1052,
1116,
1239,
1240,
1289
25.52996,
339,
347,
350,
373,
400,
405,
439,
444,
569,
625,
669,
742,
764,
841,
937,
944,
978,
980,
1045,
1072,
1085,
1102,
1108,
1176,
1203,
1258,
1318,
1329
26371,
28,
40,
90,
152,
229,
308,
314,
340,
454,
466,
480,
488,
594,
622,
639,
666,
668,
687,
692,
715,
774,
824,
847,
856,
934,
964,
975,
988,
1008,
1028,
1168,
1238,
1242,
1256,
1279,
1309
26.54645,
54,
107,
168,
175,
196,
236,
296,
364,
451,
484,
516,
518,
531,
540,
571,
572,
598,
608,
611,
623,
628,
700,
706,
708,
738,
769,
838,
854,
877,
935,
954,
1010,
1066,
1071,
1131,
1132,
1134,
1222,
1224,
1227,
1229,
1232,
1233,
1296,
1302
277380,
105,
109,
119,
120,
121,
172,
173,
174,
202,
224,
231,
283,
284,
292,
321,
337,
341,
349,
374,
380,
399,
411,
428,
429,
438,
447,
489,
505,
508,
512,
520,
552,
562,
570,
578,
599,
604,
651,
654,
661,
693,
698,
729,
747,
770,
772,
778,
790,
803,
805,
807,
817,
818,
822,
832,
851,
863,
887,
889,
963,
994,
1019,
1041,
1069,
1107,
1120,
1122,
1159,
1173,
1300,
1321,
1326
27.58821,
34,
39,
64,
73,
87,
95,
98,
111,
115,
124,
131,
140,
157,
205,
207,
208,
210,
215,
239,
261,
270,
272,
280,
293,
309,
315,
336,
388,
394,
419,
431,
457,
465,
468,
469,
482,
491,
494,
495,
542,
543,
545,
554,
558,
574,
575,
581,
629,
653,
657,
679,
690,
705,
739,
759,
788,
811,
821,
823,
835,
876,
878,
882,
883,
904,
918,
949,
1004,
1023,
1039,
1063,
1091,
1105,
1109,
1117,
1138,
1144,
1156,
1165,
1166,
1226,
1257,
1266,
1273,
1281,
1283,
1301
2810413,
14,
60,
63,
75,
85,
89,
101,
103,
123,
145,
158,
167,
186,
191,
195,
213,
218,
230,
234,
302,
327,
369,
408,
410,
416,
425,
434,
463,
464,
472,
475,
478,
500,
504,
521,
522,
535,
549,
563,
580,
595,
596,
609,
618,
620,
621,
636,
664,
677,
703,
741,
748,
752,
767,
793,
797,
802,
816,
844,
873,
880,
884,
917,
925,
943,
984,
1003,
1011,
1013,
1031,
1040,
1043,
1051,
1080,
1086,
1088,
1092,
1096,
1099,
1100,
1114,
1135,
1137,
1141,
1146,
1153,
1157,
1177,
1178,
1184,
1199,
1201,
1208,
1210,
1216,
1221,
1259,
1264,
1295,
1306,
1307,
1327,
1330
28.59529,
68,
102,
104,
112,
114,
116,
132,
137,
153,
203,
223,
227,
238,
244,
255,
265,
267,
268,
274,
277,
295,
303,
316,
333,
342,
372,
381,
385,
392,
393,
398,
401,
403,
407,
437,
493,
506,
511,
517,
553,
577,
591,
601,
605,
631,
655,
671,
674,
696,
710,
723,
727,
740,
744,
749,
757,
763,
781,
809,
819,
829,
839,
852,
871,
941,
986,
996,
1025,
1050,
1061,
1062,
1073,
1093,
1098,
1119,
1142,
1152,
1164,
1170,
1196,
1209,
1213,
1223,
1249,
1250,
1268,
1280,
1287,
1290,
1298,
1308,
1310,
1315,
1328
299123,
26,
59,
76,
99,
113,
169,
181,
184,
197,
214,
233,
237,
254,
262,
264,
289,
313,
329,
334,
335,
338,
384,
427,
503,
539,
544,
547,
588,
590,
597,
607,
619,
630,
634,
638,
672,
707,
709,
712,
728,
754,
779,
785,
787,
791,
810,
812,
813,
826,
830,
837,
848,
853,
879,
888,
898,
905,
920,
942,
955,
971,
1014,
1021,
1034,
1068,
1084,
1089,
1110,
1121,
1126,
1139,
1143,
1147,
1149,
1151,
1172,
1193,
1200,
1211,
1231,
1237,
1245,
1247,
1251,
1253,
1271,
1276,
1292,
1299,
1305
29.51069,
33,
53,
55,
61,
66,
71,
79,
100,
136,
150,
154,
171,
177,
182,
192,
216,
226,
259,
279,
288,
290,
306,
310,
323,
344,
352,
363,
371,
375,
376,
377,
378,
404,
414,
418,
440,
448,
449,
455,
486,
497,
501,
527,
532,
585,
589,
593,
603,
641,
644,
650,
688,
697,
704,
726,
731,
734,
736,
743,
746,
751,
761,
765,
782,
801,
814,
815,
831,
836,
842,
850,
870,
872,
899,
922,
933,
945,
953,
958,
970,
974,
982,
997,
1000,
1038,
1053,
1065,
1067,
1095,
1111,
1113,
1128,
1161,
1171,
1219,
1228,
1234,
1235,
1236,
1244,
1252,
1254,
1261,
1284,
1297
3011619,
22,
48,
49,
57,
78,
97,
117,
122,
125,
129,
142,
151,
178,
180,
201,
217,
220,
241,
245,
250,
257,
260,
269,
273,
276,
286,
300,
332,
348,
353,
362,
365,
370,
420,
421,
432,
435,
436,
443,
470,
474,
479,
490,
498,
499,
507,
509,
524,
529,
534,
556,
565,
568,
610,
613,
626,
633,
640,
647,
659,
663,
676,
684,
714,
725,
750,
775,
776,
784,
798,
799,
800,
828,
864,
869,
885,
886,
890,
891,
892,
893,
902,
907,
916,
946,
948,
951,
962,
999,
1015,
1016,
1044,
1047,
1049,
1055,
1056,
1074,
1076,
1082,
1124,
1125,
1127,
1155,
1175,
1179,
1180,
1183,
1204,
1207,
1217,
1230,
1243,
1263,
1282,
1319
30.58510,
32,
58,
62,
83,
84,
88,
92,
139,
179,
200,
209,
235,
243,
251,
287,
291,
294,
297,
299,
320,
322,
346,
356,
367,
386,
396,
415,
430,
441,
442,
458,
459,
519,
525,
537,
557,
567,
624,
645,
656,
665,
678,
701,
717,
724,
773,
783,
789,
855,
859,
895,
906,
912,
915,
977,
992,
995,
1012,
1024,
1029,
1059,
1078,
1087,
1090,
1094,
1103,
1106,
1115,
1129,
1140,
1145,
1163,
1214,
1225,
1262,
1265,
1274,
1275,
1291,
1293,
1303,
1313,
1320,
1323
319216,
17,
18,
30,
37,
46,
50,
70,
72,
74,
93,
106,
135,
138,
144,
146,
160,
161,
190,
198,
204,
211,
222,
307,
319,
351,
358,
382,
383,
390,
406,
422,
460,
471,
473,
496,
523,
528,
538,
555,
561,
566,
587,
600,
612,
615,
648,
670,
702,
716,
721,
737,
753,
760,
768,
795,
820,
843,
857,
862,
866,
874,
903,
909,
985,
987,
989,
991,
1018,
1020,
1030,
1037,
1054,
1060,
1077,
1123,
1130,
1136,
1154,
1158,
1162,
1169,
1185,
1188,
1189,
1198,
1206,
1218,
1260,
1278,
1288,
1314
31.5703,
4,
11,
36,
41,
65,
69,
81,
110,
189,
242,
258,
263,
275,
278,
324,
354,
355,
359,
361,
379,
413,
417,
476,
481,
510,
536,
541,
573,
579,
586,
614,
617,
649,
658,
680,
694,
718,
722,
755,
766,
794,
804,
845,
858,
860,
867,
913,
914,
923,
926,
928,
936,
952,
956,
957,
976,
990,
998,
1022,
1026,
1027,
1033,
1035,
1075,
1104,
1167,
1182,
1248,
1255
325912,
44,
52,
128,
143,
156,
164,
165,
185,
188,
228,
253,
298,
311,
312,
345,
357,
389,
395,
433,
445,
450,
513,
530,
560,
564,
606,
642,
673,
686,
711,
730,
732,
735,
758,
762,
777,
792,
825,
833,
840,
881,
919,
968,
1036,
1057,
1058,
1081,
1112,
1160,
1174,
1197,
1212,
1215,
1272,
1294,
1311,
1316,
1325
32.5512,
20,
24,
31,
35,
47,
82,
86,
118,
147,
148,
159,
162,
176,
187,
271,
281,
282,
328,
446,
502,
514,
526,
533,
550,
582,
583,
662,
683,
699,
719,
720,
827,
861,
865,
908,
921,
927,
969,
981,
1097,
1150,
1181,
1186,
1187,
1191,
1194,
1195,
1241,
1286,
1312
33378,
155,
170,
183,
206,
212,
225,
248,
249,
318,
325,
368,
402,
462,
492,
548,
627,
646,
675,
685,
756,
780,
808,
834,
911,
939,
1046,
1070,
1083,
1101,
1148,
1190,
1192,
1269,
1270,
1285,
1317
33.53027,
194,
219,
221,
305,
317,
343,
456,
461,
632,
643,
667,
689,
806,
896,
900,
901,
930,
932,
959,
966,
972,
993,
1001,
1005,
1009,
1133,
1205,
1220,
1267
342338,
51,
56,
126,
134,
166,
252,
266,
330,
453,
487,
660,
681,
682,
695,
897,
910,
938,
950,
960,
967,
1007,
1032
34.5125, 42, 130, 149, 232, 387, 424, 733, 931, 983, 1006, 1079
351691,94,141,199,246,247,423,452,635,691,875,924,
973,1002,1017,1064
35.5925, 163, 285, 301, 515, 584, 868, 894, 929
3647, 409, 713, 745
36.56127, 240, 326, 551, 1202, 1246
37215, 940
37.5243, 397
3826, 256
39.51849