Dizi Üreteci Örnekleri

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.