Jump to content

Kelime Arama


asmazh
 Share

Recommended Posts

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.
Link to comment
Share on other sites

[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 by Baba_
Link to comment
Share on other sites

Ş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.

Link to comment
Share on other sites

@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 by asmazh
Link to comment
Share on other sites

Ç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 by asmazh
Link to comment
Share on other sites

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]

Link to comment
Share on other sites

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...