Dizi Üreteci Örnekleri
Belirli bir karakter setini kullanarak olası tüm dizilimleri üretmek oldukça basit bir çalışma. Perl ile tek satırlık bir komut kullanarak terminal üstünde bir dizi üretmek için şöyle bir komut kullanılabilir:
$perl -le "print while glob '{a,b,c,ç,d,e,f,g,ğ,h,ı,i,j,k,l,m,n,o,ö,p,r,s,ş,t,u,ü,v,y,z}'x5" >>5_char_length.txt
Bu komutu çalıştırarak Türkçe alfabede bulunan harfler ile oluşturulabilecek tüm 5 karakterlik dizileri 5_char_length.txt dosyasına yazdırmış olacağız. Komut 138 MB büyüklüğünde bir txt dosyasına 20 milyon 511 bin 149 satırlık bir diziler listesi yazdıracaktır. Aynı diziyi 6 karakter uzunluğunda ürettiğimizdeyse toplam 594 milyon 823 bin 321 satırdan oluşan ve 4.6 GB büyüklüğünde bir dosya elde edeceğiz.
Bu diziler içinde aaaaa, zzzzz veya şzeaş gibi genellikle bir işe yaramayan diziler de bulunuyor. Yani ham halleriyle bu dizileri kullamak dilibilimsel açıdan çok akılcı bir yaklaşım değil.
Ürettiğimiz diziden geçerli Türkçe sözcükleri çekmek için bir doğal dil işleme kütüphanesi olan Zemberek’ten faydalanabiliriz. Bunun için basit bir bash betiği ile Zemberek’in komut satırında çalışan denetleyicisi olan zpspell’den yararlanmak mümkün.
#!/bin/bash # Sample bash script for Zemberek interactive SpellChecker # Taner Sezer [email protected] while read line do name=$line zpspell $name | grep "doğru" done < $1
Bir metin editörü kullanarak yukarıdaki örnek betiği bir metin dosyasına yazıp
$vi check_spell.sh
Bu dosyayı çalıştırılabilir hale getirelim.
$chmod +x check_spell.sh
Bu betik ile ürettiğimiz listedeki geçerli Türkçe sözcükleri döndürebiliriz. Örneğin alfabedeki 29 harfi kullanarak 2 karakterlik bir dizi ürettiğimizde elimizde 784 satırlık bir dosya olacaktır. Bu dosyayı check_spell.sh betiğimizi kullanarak işlediğimizdeyse yazım denetimini geçebilen 114 sözcüklük bir liste elde edeceğiz.
aç ad af ah ak al an ar as aş at av ay az be bu cm da de dk dl dm do eh ek el em en er es eş et ev ey ez fa ha he hı hl hm hu ıh ıs iç il im in ip is iş it iv iz kg ki km la le mı mi mm mu mü na ne nü od of oh ok ol om on ot ov oy öç öd öf öl ön öp ör öt öv öz pi re sa si sn su şu ta ti uç uf um un ur us ut uy uz üç ün üs üş üt üz ve ya ye
Aynı işlemi 3 karakterlik bir dizi için yaptığımızda 21 bin 952 sözcüklük bir liste üretecek ve check_spell.sh betiği ile işlediğimizde geçerli 924 sözcük elde edeceğiz:
aba abd abu acı aça açı ada adı adi afi aft agu aha ahı ahi ahu ait aka akı aks akü ala aba abd abu acı aça açı ada adı adi afi aft agu aha ahı ahi ahu ait aka akı aks akü ala alg alı ali alo alp alt ama ana anı ani ant ara arı ark arp arş art arz asa ası asi ask ast aşa aşı aşk ata ate atı ati aut ava avı aya ayı ayn aza azı baç bak bal bam ban bap bar bas baş bat bav bay baz bej bek bel ben beş bet bey bez bık biç bil bin bip bir bit biz boa bok bol bom bor boş bot boy boz böl bön bös bre bul bum bun bur but buy buz bük büz cam can car cay caz cep cer cet cık cır cıs cız cif cim cin cip cop coş cup cüz çak çal çam çan çap çar çat çav çay çeç çek çel çer çık çın çıt çıv çil çim çir çis çiş çit çiy çiz çok çor çök çöl çöm çöp çör çöz çul çüş dal dam dan dar dav daz def deh dek del dem den der deş det dev dır dış dik dil din dip diş dit diz dok dol dom don doy doz dök döl dön döş döv dua dul dun duo dur duş dut duy dük dün dür düş düz ebe ece eda ede efe ege ego ehe ehi eke eki ela ele eli eme ene eni epe ere erg eri erk ese esi eşe eşi ete eti evç eve evi eye eyi eza eze fak fal fam fan far faş fay faz fek fen fer fes fır fıs fış fil fiş fit fob fok fol fon fos ful fut füg gaf gag gak gam gar gaz geç ged gel gem gen ger gev gez gık gır gıy gir git giy giz gol göç gök göl göm gön gör göt göy göz gri gut güç gül güm gün gür güt güz hac haç had haf hah hak hal ham han hap har has hat hav hay haz hem hen hep her hey hık hım hın hır hız hiç hin his hiş hol hop hor hoş höl höt hum hun huş huy hür ıha ıhı ılı ıra ırk ırz ısa ısı ışı içe içi ide idi ifa ika iki iks ile ili ilk ima ime imi inç ine ini ipe ipi iri irk irs ise isi işe işi ita ite iti ive iye iyi ize izi jel jet jön jul jüt kaç kah kak kal kam kan kap kar kas kaş kat kav kay kaz kek kel kem kep kes keş ket kez kıç kıh kıl kın kıp kır kıs kış kıt kıy kız kik kil kim kin kip kir kit koç kod kof kok kol kom kon kop kor koş kot kov koy koz kök kör kös köy köz kul kum kup kur kus kuş kut kuz küf kül küp kür küs küt laf lak lal lam lan lap lav lef leh lem len lep leş ley lif lig lir lok lop lor loş lök löp lös lüp maç mai mal mas maş mat meç mel men met mey mıh mık mır mil mim mir mis mit mor mum muş muz nah nal nam nan nar nas naz nem nen net ney nim niş not nur nüm nün oba oda odu ofa ofu oha ohm ohu oje oka oku ola ole olu oma omu ona ons onu ora org osu ota oto otu ova oya oyu öce öcü öde ödü öfe öfü öge öhö öke ölç öle ölü öne önü öpe öre örf örk örs ört örü öte öve öze özü pah pak pal pas pat pay pek pes peş pey pır pıt piç pik pil pim pin pir pis piş pli pof pop pos pot poy poz pöç pöf puf pul pus put püf pür püs raf rap ray rem ren ret rey rıh rol rom rop rot ruf ruh ruj ruz sac saç saf sah sak sal sam san sap sar sat sav say saz seç sek sel sem sen ser ses set sev sez sıç sık sın sır sız sif sik sil sim sin sis siy siz ski sof sok sol som son sop sor sos soy sök sön sör söv söz suç sun sup sur sus sut sün sür süs süt süz şad şah şak şal şan şap şaş şat şaz şeb şef şek şen şer şeş şet şev şey şık şıp şif şip şiş şok şom şov şua şuh şum şun şut taç tak tal tam tan tap tar tas taş tat tav tay tef tek tel tem ten tep ter tez tık tın tıp tıs tik tim tin tip tir tiz tok tol ton top tor tos toy toz tör tös töz tuh tul tun tur tuş tut tuz tüf tüh tük tül tüm tün tüp tür tüt tüy uca ucu uça uda udi udu ufa ufu ula ulu uma una unu ura uru usa usu uta uya uyu uza uzu üçe üçü üne ünü üre ürk ürü üst üşe üşü üte ütü üye üze vah var vat vay vem ven ver vık vır vız vur yad yak yal yam yan yap yar yas yaş yat yay yaz yed yek yel yem yen yer yet yık yıl yır yit yiv yok yol yom yon yor yoz yön yuf yum yun yut yük yün yüz zaç zam zan zar zat zem zen zer zıh zıp zıt zil zir zom zor zum zül
Elbette buradaki geçerlilik yazım denetleyicisinin başarımıyla doğru orantılı.
Bu dizileri verimli bir amaçla kullanmak için farklı yöntemler izlenebilir. Örneğin aşağıdaki komut ile üretilen dizi için istenilen karakter sayısındaki tüm sözcükler bir örnek derlemden çekilebilir:
$perl -n -e 'print if (/^[ANAHTAR_KARAKTERLER]+$/);' [sample_corpus] >> matched_strings
Böylece örnek derlemimizde bulunan ve istediğimiz karakterlerden üretilmiş tüm dizilere uygun sözcükleri elde edebiliriz. Bu işlemin “X sayıdaki karakterden oluşan tüm sözcükleri” örnek derlemden çekebilecek bir düzenli ifadeden farkını hepimizin bildiği bir oyun ile açıklayayım. Oyunumuzda “y, k, m, e, l, s” harflerinden oluşan tüm sözcükleri bulmaya çalışalım. Yukarıdaki komutu şu şekilde çalıştırmamız yeterli olacaktır:
$time perl -n -e 'print if (/^[ykmels]+$/);' [sample_corpus] >> matched_strings
Toplam 1 milyon 140 bin 208 tekil sözcükten oluşan örnek derlemimizden bu komut ile 0.340 saniye içinde bizim istediğimiz kurallara uygun olan 359 sözcüğü bulabiliyoruz. (time komutu ile işlem tamamlandığında toplam süre ekranda yansıtılacaktır.)
ek el em es ey le ye eke ele eme ese eye kek kel kem kes lem ley mel mey sek sel sem ses yek yel yem ekle ekme ekse elek elem elle else emek emel emme emse esme esse eyle keke kele keme kese leke leme leye mele meme meye seke seks sele sese yeke yele yeme yese eklem ekmek ekmem eksek eksel eksem eleme elese eleye elsel elsem emele ememe emmek emmem emsem esmek essek essel eylem eysel kekle kelek kelem kelle kelse kesek kesel kesem kesle kesme kesse lekem lemle leyle leyse melek meles melle melse memem mesel meses meyle meyse sekle sekme sekse selek selem selle semle semse sesle sesse seyek yekle yelek yelem yelle yemek yemem yemle yesek yesem ekemem ekleme eklese ekleye ekmese ekmeye elekle elemek elemem elemle elesek elleme ellese elleye emekle emekse emelle emelse emmeme emmese emmeye esmese esmeye eyleme eylese eyleye kekele kekeme kekeye keleme kellem kememe kemeye kesele keseme keseye kesmek kesmem kessek kessel kessem lekele lekeme lekeye leylek meleke meleme melese meleye melsek mememe memeye mesele meslek meysel meysem sekmek seksek seksle seksse seleme seleye semsek sessel yeksek yeleme yememe yemese yemeye yemsel eklemek eklemem eklemle eklesek eklesem ekmekle ekmekse ekmemek ekmesek elememe elemeye ellemek ellemem ellesem emmekle emmemle emmeyle esmekle esmeyle eylemek eylemem eylemle eylemse eylesek eylesem kekleme kelekle kelekse kelleme kelleye kesekle kesemem kesemle keseyle kesmeme kesmese kesmeye kessele lekesel lekeyle lekeyse melekle melekse melemek memesel memeyle memeyse meselem meselle sekmese sekmeye selekle seleyle sesleme sesleye yelekle yelleme yemekle yemekse yememek yememem yemesek yemesem yemeyle yemleme eklememe eklemese eklemeye ekmemeye elemekle elemeyle ellememe ellemeye emekleme emekleye eylemeye eylemsel kekeleme kekeleye keklemek kelleyle keseleme kesememe kesemese kesemeye kesmekle kesmekse kesmemek kesmemem kesmesek kesmesem kesmeyle lekeleme lekelese leylekle leylekse melekeye meleksel melemeye meseleme meseleye meselsel meslekle meslekse sekmeyle yellemek yemeksek yemememe yememeye yemlemek eklemekle eklemekse eklememek eklemesek eklemeyle eklemleme eklemleye ekleyemem ellememek ellemesek ellemesem elleyemem emeklemek eylemekle eyleyemem kekelemek keklemeye keselemek keselemem kesememek kesmememe kesmemeye lekelemek melekeyle meselemle meseleyle meseleyse mesleksel seslemeye yememekle yemlemeye eklememeye eklemlemek eklemlesek ekleyemeye emeklemeye kekelemeye kesmemekle lekelememe lekelemese lekelemeye yellemekle yellemeyle yemlemeyle eklememekse eklemlemeye ekleyememek emeklemekle kekelememek kekelememle keselemeyle lekelemekle lekelememek eklemlemekle emekleyememe
Komutun doğru çalışması için örnek derlemimizin her satıra bir sözcük (word-per-line) gelecek şekilde hazırlanmış olması gerekli. (Bu amaçla TS Tokenizer aracını kullanabilirsiniz.)
Python kullanarak da benzer bir çalışma yapabilir ve oyunumuzu biraz daha eğlenceli hale getirebiliriz. İnternette onlarca farklı metod ile çalışan, Python için yazılmış dizi üreteci örneklerine kolaylıkla ulaşmak mümkün. (Aşağıda verilen örnek betikte StackOverFlow sitesinde bulduğum bir fonksiyonu temel aldım.) Bu fonksiyonu, çalıştırıldığında kullanıcıdan gerekli değerleri girmesini isteyecek ve her satıra bir sözcük olacak şekilde örnek derlemimizden bulduğu geçerli sonuçları döndürecek bir betik içinde kullandım. Betik kullanıcıdan ihtiyaç duyduğu üç değeri girmesini istiyor:
- Dizide kullanılacak karakterler
- Diziyi oluşturacak karakterlerin minimum sayısı
- Diziyi oluşturacak karakterlerin maximum sayısı
#!/usr/bin/env python # -*- coding: utf-8 -*- #################################### # Generate Strings # # and # # Find Matches in Sample Corpus # #################################### import sys import os import re import nltk from sys import argv from nltk import bigrams from nltk.util import ngrams list = raw_input("Please enter characters(Do not write same character twice): ") min = int(raw_input("Please input min length of the string:")) max = int(raw_input("Please input max length of the string:")) upper = max+1 def generate(l,d): if d<1: return for c in l: if d==1: yield c else: for k in generate(l,d-1): yield c+k for d in range(min,upper): for c in generate(list,d): words = c tokens = nltk.word_tokenize(words) text = nltk.Text(tokens) str(c) with open("sample_corpus") as search: for line in search: line = line.rstrip() if c == line: print(line)
Betiğimizi çalıştıralım:
[email protected] ~/tscorpus/fun $ time python word_generator_and_matcher.py Please enter characters(Do not write same character twice): elmk Please input min length of the string:3 Please input max length of the string:4
Ve sonuçlarımıza ulaşalım:
ele eme eke lem mel kel kem kek elem elek elle emel emek emme ekle ekme leme leke mele meme kele keme keke
Ürettiğimiz bu dizileri biçimbirimsel çözümleyici (morphological parser) veya sözcük türü işaretleyici (Part of Speech Tagger) ile işleyerek doğal dil işleme çalışmalarında farklı amaçlarla da kullanabiliriz.