asmazh Posted June 26, 2012 Share Posted June 26, 2012 Selamünaleyküm Bir kaç sorum var, umarım ki yardımcı olursunuz. Öncelikle yazdığım programı kısa bir şekilde anlatayım ki beni daha iyi anlayabilesiniz. 100.000 kelimelik bir Türkçe Sözlük yazıyorum. Kelimelerin bulunduğu veri tabanı bir "not defteri". Ve sorularımı daha iyi anlayabilmeniz için örnek: [code]30 Ağustos=1 a=2 a (2)=3 a / e=4 -a- / -e-=5 -a / -e=6 -a / -e (2)=7 a, A=8 ab=9 aba=10 aba güreşi=11 abacı=12 abacılık=13 abadî=14 abajur=15 abajurcu=16 abajurculuk=17 abajurlu=18 abaküs=19 abalı=20 abandırma=21 abandırmak=22 abandone=23 abanî=24 abanma=25 abanmak=26 abanoz=27 abanozgiller=28 abanozlaşma=29 abanozlaşmak=30 abartı=31 abartıcı=32 abartıcılık=33 abartılı=34 abartılma=35 abartılmak=36 abartısız=37 abartış=38 abartma=39 abartmacı=40 abartmacılık=41 abartmak=42 abartmalı=43 abartmasız=44 abasız=45 abaşo=46 abat=47 Abaza=48 Abazaca=49 abazan=50 abazanlık=51 Abbasî=52 abd=53 Abdal=54 abdal (2)=55 abdallık=56 abdest=57 abdestbozan=58 abdestbozan otu=59 abdesthane=60 abdestli=61 abdestlik=62 abdestsiz=63 abdiâciz=64 abdülleziz=65 abece=66 abece sırası=67 abecesel=68 aberasyon=69 abes=70 abeslik=71 abıhayat=72 abıkevser=73 abıru=74 abide=75 abideleşme=76 abideleşmek=77 abideleştirme=78 abideleştirmek=79 abidemsi=80 abidevî=81 abis=82 abiye=83 abla=84 ablak=85 ablakça=86 ablaklık=87 ablalık=88 ablâtif=89 ablatya=90 abli=91 abluka=92 abone=93 abonelik=94 abonman=95 aborda=96 abra=97 abrakadabra=98 abrama=99 abramak=100 ... ... ... "?"=100000[/code] Kelimelerin tanımlanmış hali de başka bir ".ini" dosyasına kayıtlı. [code][?] T= "Tanımı simgeler." A= "Bu kelimenin, varsa, deyimleri araya "-" konularak sıralanır. B= "Başlık. Örneğin 'aba' " [1] T=30 Ağustos :~ 1 ) Zafer Bayramı~ A= B=30 Ağustos [2] T=a :~ 1 ) Seslenme bildirir~ Cümle 1: A birader! Nerde kaldın a canım!~ A= B=a [3] T=a :~ 1 ) (a:) Şaşma, hatırlama, sevinme, acıma, üzülme, kızma gibi duyguları güçlendirir, cümlenin başında veya sonunda kullanılır~ Cümle 1: A, ne güzel!~ Cümle 2: A, sen burada mıydın?~ A= B=a (2) [4] T=a / e :~ 1 ) Çekimli fiilin sonuna gelerek anlamı pekiştirir~ Cümle 1: alsana, gelsene, olur a.~ A= B=a / e [5] T=-a- / -e- :~ 1 ) İsimden fiil türeten ek~ Cümle 1: kan-a-mak, tün-e-mek, boş-a-mak, harc-a-mak.~ A= B=-a- / -e- [6] T=-a / -e :~ 1 ) Yönelme durumu eki: dağa, eve, yola, öne. Ünlü ile biten isimlerden sonra araya y sesi girer~ Cümle 1: odaya, tepeye, duyguya, ülküye.~ A= B=-a / -e [7] T=-a / -e :~ 1 ) Fiilden zarf türeten ek: yaza yaza, gide gide, koşa koşa, düşe kalka, güle oynaya. Ünlü ile biten fiillerden sonra araya y sesi girer: yaşaya yaşaya, bekleye bekleye, okuya okuya, yürüye yürüye. Bu ek göre, kala, geçe, sapa örneklerinde kalıplaşmıştır~ A= B=-a / -e (2) [8] T=a, A :~ 1 ) Türk alfabesinin birinci harfi, ses bilimi bakımından kalın ünlülerin düz ve geniş olanını gösterir~ 2 ) ( Müzik ) Nota işaretlerini harflerle gösterme yönteminde lâ sesini bildirir~ A=a'dan z'ye kadar B=a, A [9] T=ab :~ İsim Eskidil~ Farsça~ 1 ) Su~ A= B=ab [10] T=aba :~ İsim~ Arapça~ 1 ) Yünden, dövülerek yapılan kalın ve kaba kumaş~ 2 ) ( İsim ) Bu kumaştan yapılmış yakasız ve uzun üstlük~ Cümle 1: Bir abam var atarım, nerde olsa yatarım. - Atasözü~ Cümle 2: Abanın kadri yağmurda bilinir. - Atasözü~ 3 ) ( Sıfat ) Bu kumaştan yapılmış olan~ Cümle 1: Aba terlik.~ Cümle 2: Ayağında bir aba potur vardı. - R. N. Güntekin~ 4 ) ( Sıfat ) Eskiden dervişlerin giydiği abadan yapılmış, önü açık hırka~ Cümle 1: Aba var, post var, meydanda er yok. - Y. K. Beyatlı~ 5 ) ( Halkdili ) Abla~ 6 ) ( Halkdili ) Anne~ A=aba altından değnek (sopa) göstermek-aba gibi-aba vakti yaba, yaba vakti aba-abayı sermek-abayı yakmak B=aba ... ... ... [100000] T= "Tanımı simgeler." A= "Bu kelimenin, varsa, deyimleri araya "-" konularak sıralanır. B= "Başlık. Örneğin 'aba' "[/code] [color="#FF0000"]Sorum 1:[/color] Kullanıcı örneğin "aba" kelimesini aramak istedi. Ama arama yerine "abâ" yazdı. Programın "â,a"-"i,î" gibi harfleri aynı algılamasını istiyorum. Bunu nasıl yaparım, inşallah bir bilginiz vardır. [color="#FF0000"]Sorum 2:[/color] Kullanıcıya şöyle bir arama seçeneği sunmak istiyorum: İçerisinde kullanıcının istediği karakterleri barındıran kelimeleri liste halinde kullanıcıya vermek istiyorum. Örneğin: İçerisinde "al" olan bütün kelimeleri listelemek istiyorum. Bu işi sondan karakter olarak becerdim. Yani, kullanıcı sonunda "al" olan kelimeleri, sunduğum arama seçeneği sayesinde, gayet seri bir şekilde, listeleyebiliyor. [color="#FF0000"]Sorum 3:[/color] Ben, istemeyerek, çok karmaşık bir düzen içerisinde program ile veri tabanı arasında iletişim kurmuşum. Mesela verdiğim 1. veri tabanında kelime aramayı kolaylaştırmak için, her kelimeyi numaralandırmışım. Şöyle bir arama biçimi tasarlıyorum, aslında tasarlamaya çalışıyorum demek daha doğru olur. Kullanıcı örneğin "aba" kelimesini aramak istedi. Program bunun veri tabanında olduğunu algılar hemen. aba aba güreşi abacı abacılık abadî abajur abajurcu abajurculuk abajurlu abaküs abalı abandırma abandırmak abandone abanî abanma abanmak abanoz abanozgiller abanozlaşma abanozlaşmak Bu şekilde kelimeleri numaralandırmamışım varsayın. Program, "aba" kelimesini bulduktan sonra "aba" kelimesinin ardındaki 20 kelimeyi de kullanıcıya versin. Bunu istiyorum. İşte buradaki problem yüzünden kelimeleri numaralandırdım. Kelimelerin numaralandırılmamış hali ile "Sonran arama" ve "İçten arama" yapmak istiyorum. Yani sonu "al" olan kelimeleri ve içerisinde "al" olan kelimeleri yukarıdaki gibi kelimelerin numaralandırılmamış hali ile aramak istiyorum. [Seri bir şekilde!] [color="#FF0000"]Sorum 4:[/color] Kullanıcı bu kelimeler arasına bir kelime daha koymak istiyor diyelim. Mesela "Merhaba" kelimesi olsun bu kelime. Program, kelimeyi yukarıdaki gibi alfabetik dizilişin gerektirdiği yere koysun. Burada yardım edebilmeniz için programın bir öğrneğini verdim. [code]#include <ButtonConstants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <GUIListBox.au3> #include <WindowsConstants.au3> #Region ### START Koda GUI section ### Form= $Form1 = GUICreate("Sözlük (Deneme)", 661, 426, 199, 142) $List1 = GUICtrlCreateList("", 8, 48, 225, 344) $Input1 = GUICtrlCreateInput("Input1", 8, 24, 177, 21) $Button1 = GUICtrlCreateButton("Ara", 192, 24, 43, 21) $Edit1 = GUICtrlCreateEdit("", 248, 24, 401, 369, $ES_WANTRETURN) GUICtrlSetData(-1, StringFormat("Buradaki buton ($Button1) _ara() fonksiyonuna bağlı. Arama işlemini $VeriTabani değişkeninden yapın. \n\n")) GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif") $Radio1 = GUICtrlCreateRadio("Sondan ara", 8, 400, 81, 17) $Radio2 = GUICtrlCreateRadio("İçten ara", 96, 400, 81, 17) $Radio3 = GUICtrlCreateRadio("Normal arama", 184, 400, 81, 17) $button2 = GUICtrlCreateButton("Yeni bir kelime ekle",325,398,150,25) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### Global $VeriTabani = "30 Ağustos" & _ @CRLF & "a" & _ @CRLF & "a (2)" & _ @CRLF & "a / e" & _ @CRLF & "-a- / -e-" & _ @CRLF & "-a / -e" & _ @CRLF & "-a / -e (2)" & _ @CRLF & "a, A" & _ @CRLF & "ab" & _ @CRLF & "aba" & _ @CRLF & "aba güreşi" & _ @CRLF & "abacı" & _ @CRLF & "abacılık" & _ @CRLF & "abadî" & _ @CRLF & "abajur" & _ @CRLF & "abajurcu" & _ @CRLF & "abajurculuk" & _ @CRLF & "abajurlu" & _ @CRLF & "abaküs" & _ @CRLF & "abalı" & _ @CRLF & "abandırma" & _ @CRLF & "abandırmak" & _ @CRLF & "abandone" & _ @CRLF & "abanî" & _ @CRLF & "abanma" & _ @CRLF & "abanmak" & _ @CRLF & "abanoz" & _ @CRLF & "abanozgiller" & _ @CRLF & "abanozlaşma" & _ @CRLF & "abanozlaşmak" & _ @CRLF & "abartı" & _ @CRLF & "abartıcı" & _ @CRLF & "abartıcılık" & _ @CRLF & "abartılı" & _ @CRLF & "abartılma" & _ @CRLF & "abartılmak" & _ @CRLF & "abartısız" & _ @CRLF & "abartış" & _ @CRLF & "abartma" & _ @CRLF & "abartmacı" & _ @CRLF & "abartmacılık" & _ @CRLF & "abartmak" & _ @CRLF & "abartmalı" & _ @CRLF & "abartmasız" & _ @CRLF & "abasız" & _ @CRLF & "abaşo" & _ @CRLF & "abat" & _ @CRLF & "Abaza" & _ @CRLF & "Abazaca" & _ @CRLF & "abazan" & _ @CRLF & "abazanlık" & _ @CRLF & "Abbasî" & _ @CRLF & "abd" & _ @CRLF & "Abdal" & _ @CRLF & "abdal (2)" & _ @CRLF & "abdallık" & _ @CRLF & "abdest" & _ @CRLF & "abdestbozan" & _ @CRLF & "abdestbozan otu" & _ @CRLF & "abdesthane" & _ @CRLF & "abdestli" & _ @CRLF & "abdestlik" & _ @CRLF & "abdestsiz" & _ @CRLF & "abdiâciz" & _ @CRLF & "abdülleziz" & _ @CRLF & "abece" & _ @CRLF & "abece sırası" & _ @CRLF & "abecesel" & _ @CRLF & "aberasyon" & _ @CRLF & "abes" & _ @CRLF & "abeslik" & _ @CRLF & "abıhayat" & _ @CRLF & "abıkevser" & _ @CRLF & "abıru" & _ @CRLF & "abide" & _ @CRLF & "abideleşme" & _ @CRLF & "abideleşmek" & _ @CRLF & "abideleştirme" & _ @CRLF & "abideleştirmek" & _ @CRLF & "abidemsi" & _ @CRLF & "abidevî" & _ @CRLF & "abis" & _ @CRLF & "abiye" & _ @CRLF & "abla" & _ @CRLF & "ablak" & _ @CRLF & "ablakça" & _ @CRLF & "ablaklık" & _ @CRLF & "ablalık" & _ @CRLF & "ablâtif" & _ @CRLF & "ablatya" & _ @CRLF & "abli" & _ @CRLF & "abluka" & _ @CRLF & "abone" & _ @CRLF & "abonelik" & _ @CRLF & "abonman" & _ @CRLF & "aborda" & _ @CRLF & "abra" & _ @CRLF & "abrakadabra" & _ @CRLF & "abrama" & _ @CRLF & "abramak" ; Veri tabanı bende bir not defterine kayıtlı. Aman ha sakın 100000 kelimeyi bu şekilde bir değişkene verdiğimi sanmayın. ; Size kolaylık olsun diye kısa bir örneği, bir değişkene verdim. While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $Button1 _Ara(GuiCtrlread($Input1)) Case $button2 $YeniKelime = InputBox("","") If Not @error Then EndIf ; Bahsettiğim gibi burada eklenecek kelime aritmetik sıralamaya uymak zorunda. ; Aslında bu işlem "array" ile çok basit bir şekilde yapılabilir ama ben 100000 kelimelerlik bir not defterinden bahsediyorum. ; Bana bu işlemi en kısa bir şekilde nasıl yapabilirim, bunu anlatırsanız sevinirim. EndSwitch WEnd func _ara($NeyiArayayim) If GUICtrlRead($Radio1) = $GUI_CHECKED Then ; Kullanıcı sonran arama yapmak istiyorsa... ElseIf GUICtrlRead($Radio2) = $GUI_CHECKED Then ; Kullanıcı İçten arama yapmak istiyorsa... ElseIf GUICtrlRead($Radio3) = $GUI_CHECKED Then ; Kullanıcı Normal arama yapmak istiyorsa... EndIf EndFunc [/code] Konu hayli uzun oldu. Yardım etmek de hayli sıkıcı olabilir. Buna rağmen yardım edenlere "sonsuz teşekkür". Rabbim herkesin yolunu açık etsin. Quote Link to comment Share on other sites More sharing options...
DivaneTR Posted June 26, 2012 Share Posted June 26, 2012 (edited) [color="#8B0000"][font="Lucida Sans Unicode"]Not defterini ini dosyasına dönüştür. Numaralandırmayı da kelimeden önce yaz. Seçilen kelime ini dosyasından numarayı alır, section olarak diğer ini dosyasından çağırır. Bu mantıkla yapabilirsin. Veya kelimeleri read ile diziye al. Tablodaki index numarasına göre ini dosyasındaki sectionlardan çağır [/font][/color] Edited June 26, 2012 by Baba_ Quote Link to comment Share on other sites More sharing options...
asmazh Posted June 26, 2012 Author Share Posted June 26, 2012 Sağol dostum. Bu dediklerine pek gerek yok. İşi uzatmadan nasıl yaparım, ben bunu sormak istedim. Yoksa pek çok yöntem var denediğim hepsiyle de oluyor amma gel gör ki iş çok karışık. Quote Link to comment Share on other sites More sharing options...
blackman12 Posted June 26, 2012 Share Posted June 26, 2012 Şimdi ilk olarak iki farklı dosya kullanman saçma olur. tek bir ini de ini yapısı şu şekilde olursa bu iş daha güzel olur: [1] E="30 Ağustos" T=30 Ağustos :~ 1 ) Zafer Bayramı~ A= B=30 Ağustos . . . gibisinden yani not defterindeki verileri E keyi altında ini dosyasına direk ekleyebilirsin sorun olmaz. Büyük ihtimal sen bunu, arama konusunda hızlansın diye yaptın ama daha çok zorluyorsun işlemciyi. Ayrıca 100k lık bir sözlük yapacaksan iniden çok bir veritabanı kullanmak daha akıllıca olucaktır. O mevzu apayrı ben ini seçtiğini düşünerek sorularını yanıtlamaya devam edicem. aba kelimesinden sonraki 20 kelimeyi bulmak için numaralandırmana gerek yoktu. arama esnasında ini dosyanı i=1 to 100000 yapacağından $i nin e değeri aranan değere eşitse eline $i sayısı geçiyor zaten. iniread le $i den $i+20 ye kadar olan verileri çekebilirsin. içten arama için stringinstr soldan arama için stringleft gibi komutları kullanabilirsin bunlar sorun değil, ama seri olmasını bekleme. seri olması için aklıma bi fikir geldi ama kafan karışabilir bu yüzden sen önce programı yaz sonra serileştirirsin acele etme abâ gibi özel karakterli içerikler için bir replace fonksiyonu yazmalısın, girilen metni arama esnasında bu fonksiyona sokmalı ve örneğin stringreplace komutuile â karakterini a karakterine çevirmelisin. örnek bir replace fonksiyonu: [code]http://www.tnctr.com/topic/197060-[/code] 4. sorunu anlamadım. Quote Link to comment Share on other sites More sharing options...
asmazh Posted June 26, 2012 Author Share Posted June 26, 2012 (edited) @blackman12 ilgilendiğiniz için teşekkür ederim. Şu an kullandığım arama yöntemleri gayet hızlı. Mesela "aba" kelimesini aradınız, program "aba" kelimesini ve ondan sonra gelen 5000 kelimeyi 1 saniyeden az bir süre içerisinde kullanıcıya listeliyor. Herhalde kendimi tam olarak anlatamadım... 4. sorumda da şunu demek istemiştim: Kullanıcı aşağıdaki kelimeler arasına yeni bir kelime eklediğinde, bu eklediği kelime alfabetik dizilişe göre eklenmeli. Mesela "aba güneşi" "aba" dan sonra gelmiş. Zira alfabetik diziliş bunu gerektiriyor. aba aba güreşi abacı abacılık abadî abajur abajurcu abajurculuk abajurlu abaküs abalı abandırma abandırmak abandone abanî abanma abanmak abanoz abanozgiller abanozlaşma abanozlaşmak Edited June 26, 2012 by asmazh Quote Link to comment Share on other sites More sharing options...
blackman12 Posted June 26, 2012 Share Posted June 26, 2012 işte bu senin yöntemle olmaz sen numara veriyor ve bu numaraya göre sıralattırıyosun sonradan eklenen kelimenin ise id si büyük olduğundan alfabetik olarak listelenmez. ama sql ile yaparsan insert komutuyla yapabilirdin. Quote Link to comment Share on other sites More sharing options...
asmazh Posted June 26, 2012 Author Share Posted June 26, 2012 Anlaşıldı SQL şart! SQL ile Autoit arasında veri alışverişi yapılabilir mi? "Evet, yapılabilir"se nasıl? Quote Link to comment Share on other sites More sharing options...
blackman12 Posted June 26, 2012 Share Posted June 26, 2012 sqlite destekliyor autoit, help dosyasından bakabilirsin. Quote Link to comment Share on other sites More sharing options...
asmazh Posted June 26, 2012 Author Share Posted June 26, 2012 (edited) Çok ufak bir soru daha... Fazla vaktinizi almayacak sanırım. [code]#include <GUIConstantsEx.au3> #include <GUIListBox.au3> #include <WindowsConstants.au3> #Region ### START Koda GUI section ### Form= $Form1 = GUICreate("Form1", 623, 442, 192, 124) $List1 = GUICtrlCreateList("", 88, 40, 185, 305) GUICtrlSetData(-1, "Bugün hava çok sıcak|İnsanın kendini denize atası geliyor|Selamünaleyküm") GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd [/code] Burada list'in herhangi bir itemine fare ile sol tıklayınca o itemi seçiyor ya. Aynı işlemi farenin sağ tuşunun da yapmasını istiyorum. Yani list'in bir itemine fare ile sağ tıklayınca o itemi seçsin. Edited June 26, 2012 by asmazh Quote Link to comment Share on other sites More sharing options...
blackman12 Posted June 27, 2012 Share Posted June 27, 2012 Biraz hile hurdayla şöyle yaptım: [codebox]#include <GUIListBox.au3> $hX = 88 $hY = 40 $Form1 = GUICreate("Form1", 623, 442, 192, 124) $List1 = GUICtrlCreateList("", $hX, $hY, 185, 305) GUICtrlSetData(-1, "Bugün hava çok sıcak|İnsanın kendini denize atası geliyor|Selamünaleyküm") GUIRegisterMsg(123, "_WM_CONTEXTMENU") GUISetState(@SW_SHOW) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd Func _WM_CONTEXTMENU($hwnd, $iMsg, $wParam, $lParam) If $wParam <> GUICtrlGetHandle($List1) Then Return $GUI_RUNDEFMSG Local $cursor = GUIGetCursorInfo($Form1) Local $index = _GUICtrlListBox_ItemFromPoint($List1, $cursor[0] - $hX - 2, $cursor[1] - $hY - 2) If $index == -1 Then Return 0 _GUICtrlListBox_SetCurSel($List1, $index) Return $GUI_RUNDEFMSG EndFunc[/codebox] Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.