Sator Kareleri için türkçe sözlük veritabanı arayışı

İnternette dolaşırken sator kareleri konusuna denk geldim. Ben de bu konuda Türkçe sator kareleriyle ilgili bir program yapmak istedim (hobi olarak). Fakat Türkçe sözlük veritabanı konusunda arama yaparken en yeni şunu bulabildim ama 2022 veya 2023 sözlük veritabanına ulaşabileceğim bir kaynak önerirseniz mutlu olurum.

Veritabanı json, sqlite, mongodb formatlarında olabilir.

Yani kendimiz oluşturmak istesek evet bakarak yapmak mümkün ama ben bilgisayar programı veritabanından hızlıca bakarak deneme yanılmayla yapsın istiyorum.

acaba TDK Sözlük 'ten hızlıca bir scraping yapabilir miyiz? Araştırmamı isterseniz bir deneyeyim
Ayrıca, sadece 5 harfli kelimeleri mi istiyoruz?

Sadece 5 harfli değil de 3, 4, 6 harfli olan karelere de bakmak istiyorum. Elimizde günceli yoksa 2019 veritabanı da işe yarar sanırım.

alabildiğim tüm kelimeleri almayı deniyorum hocam bakalım

1 Beğeni

Şu da fena değil ama 2019

buyrun hocam umarım işinizi görür

1 Beğeni

Kaç kelime var? Mobilden bakamadım. Eline sağlık.

1 Beğeni

60680 kelime var toplam

1 Beğeni

Heralde diğer veritabanında deyimler de var sanırım. 90bin civarı yazıyordu.

Edit: Şimdi oturdum bilgisayar başına da evet deyimler falan da var diğerinde. O yüzden seninki daha kullanışlı hocam eline sağlık.

Edit Run: Bakalım başladı aramaya ama algoritma kötü olduğundan biraz uzun sürecek gibi duruyor.

1 Beğeni

Dörtlü kareler için bir deneme yaptım, kod aşağıda fakat çok uzun sürüyor. Kodu hızlandırma önerilerinize açığım. Bu arada kaç tane dörtlü sator karesi olduğunu da not düşeyim: 1247810

import words

dort = []

toplam = 0
kelimeler = words.kelime
for k in kelimeler:
    if len(k)==4:
        dort.append(k)

for k1 in dort:
    for k2 in dort:
        if k1[1]!=k2[0]:
            continue
        for k3 in dort:
            if k1[2]!=k3[0] or k2[2]!=k3[1]:
                continue
            for k4 in dort:
                if k1[3]!=k4[0] or k2[3]!=k4[1] or k3[3]!=k4[2]:
                    continue
                print(k1,k2,k3,k4,sep="\n")
                print()
                toplam += 1
                

print(toplam)

not: words modülünde tüm kelimeler var bir liste halinde.

Bir tane de örnek

HACI
ACUR
CUMA
IRAK

Bu arada yanlış anlamışım mevzuyu şimdi farkettim. Tersten de olması gerekiyormuş.

Doğru şekilde yapınca kod epey hızlandı. Sonuç olarak da 4lü kelime gruplarında 173 tane sator karemiz var.

import words

dort = []

toplam = 0
kelimeler = words.kelime
for k in kelimeler:
    if len(k)==4:
        dort.append(k)

for k1 in dort:
    for k2 in dort:
        if k1[1]!=k2[0] or k1[2]!=k2[3]:
            continue
        for k3 in dort:
            if k1[2]!=k3[0] or k3[0]!=k2[3] or k2[2]!=k3[1] or k2[0]!=k3[3] or k2[1]!=k3[2]:
                continue
            for k4 in dort:
                if k1[3]!=k4[0] or k2[3]!=k4[1] or k3[3]!=k4[2] or k4[1]!=k3[0]!=k1[2] or k4[2]!=k2[0] or k1[0]!=k4[3]:
                    continue
                print(k1,k2,k3,k4,sep="\n")
                print()
                toplam += 1
                

print(toplam)

Bir kaç örnek:

PLAK
LOTA
ATOL
KALP
NAZİ
ARAZ
ZARA
İZAN

Hocam kodu denemedim ne kadar hızlı bilmiyorum ama hızlandırmak için koda baktığımda aklıma şöyle bir şey geliyor.
k2 bulmak için kurduğumuz döngüde k3 veya k4 ü bulursak bunları görmezden geliyoruz sonra aynı kelimeyi tekrar aramak zorunda kalıyoruz. Belki aynı döngüde birden fazla kelimeyi arıyabiliriz. Bunu yapmak kodu daha yavaş halede getirebilir emin olamadım sadece fikir. Koda dökmeye çalışıcam
Edit: 2. ve 3. kelimenin tersen aynı olması gerektiğini yeni farkettim ve kafamdaki kod planı çöktü.

2017’de TDK’ya mail atip sozlugu nasil indirebilecegimi sormustum. Bir donus alamadim.

Benim vergilerimle hazirladiklari sozlugu benden sakiniyorlar.

1 Beğeni

Şöyle bir algoritma izledim:

def sator_square(words: list, length: int, stop=0):
    if not length:
        yield []
        return
    for i in range(len(words)):
        for comb in sator_square(words[i + 1:], length - 1, stop + 1):
            if (
                len(lst := [words[i], *comb]) != length + stop 
                or 
                all(lst[m] == "".join([j[m] for j in lst]) for m in range(len(lst)))
            ):
                yield lst

Şu sorgu:

all(lst[m] == "".join([j[m] for j in lst]) for m in range(len(lst)))

sizin yazdığınız sorguların hepsini tek seferde yapar.

words'ü, fonksiyona argüman olarak vermeden önce filtrlersek, gereksiz kısımlardan kurtuluruz.

words = [
    "PLAK",
    "LOTA",
    "ATOL",
    "KALP",
    "ADAM",
    "NEDE",
    "URFA",
    "GELE",
    "NAZİ",
    "ARAZ",
    "ZARA",
    "İZAN",
]

print(*sator_square(words, 4))

Çıktı:

['PLAK', 'LOTA', 'ATOL', 'KALP'] ['NAZİ', 'ARAZ', 'ZARA', 'İZAN']

Ayrıca x uzunluğundaki bir listenin 4’lü kombinasyonlarından, yukardaki koşula uyan kombinasyonları seçmek istiyorsunuz.

6’lı kombinasyon yapmak istediğimizde, yani sator karesinde 6 tane kelime kullanacaksak, 6 tane for döngüsünü alt alta yazmak iyi bir yöntem olmazdı.

Bu tür iterasyon işlemleri için itertools kütüphanesi de oldukça kullanışlı.

1 Beğeni

Yine güzel bir konu yine uzunca yazmak gerekecek bir konu.

Tabi becerip de anlatabilirsem.

Matematik görüyorum, kan görüyorum, gözyaşı görüyorum.

Hız performans ve matematik görüyorum.

Benim elimde bir sözlük olsa ne yapardım.

Yada bir sözlük veritabanı nasıl tutulur?

Bence binary tree nedir bakmakta fayda var.

Elinizde bir sözlüğün binary tree çevrimi varsa aramalarınız hızla azalacaktır.

Node/düğüm ve branch/dal düzeninde bir veri tabannda arama hem hızlıdır. Hem de tree/ağaç’ın desenleri hızla matematiksel olarak modellenebilip simetrik kelimeler, tersi düzüne eşit kelimeler tespit edilebilir.

Sezgi sadece…

Hissediyorum.

1 Beğeni

Beşliler için yaptığım kodda 175 tane sator karesi buldu fakat şöyle olanlar da var.

MAKAM
ACICA
KIRIK
ACICA
MAKAM

Acaba bunlar sator karesi sayılıyor mu bilmiyorum.

Kodda biraz oynayınca 80 e düştü sator kareleri. (yukarıdaki örnekleri kaldırdım)

SAKAT
AKALA
KAÇAK
ALAKA
TAKAS

Beşli sator kareleri için kodum aşağıda. Bu arada oldukça hızlandı, bir kaç saniye sürüyor bütün program. itertools ile yapamadım ama @dildeolupbiten , biraz araştırdım da bu kod için nasıl yapılır çözemedim. Ama dediğin gibi listeyi seçerken olasılıkları daraltmak işe yarıyor.

import words

besli = []

toplam = 0
kelimeler = words.kelime
for k in kelimeler:
    if len(k)==5 and k[::-1] in kelimeler:
        besli.append(k)

for k1 in besli:
    if k1==k1[::-1]:
        continue
    for k2 in besli:
        if k2==k2[::-1]:
            continue
        if k1[1]!=k2[0] or k1[3]!=k2[4]:
            continue
        for k3 in besli:
            if k3!=k3[::-1] or k3[0]!=k1[2] or k3[1]!=k2[2]:
                continue
            k4 = k2[::-1]
            k5 = k1[::-1]
            print(k1,k2,k3,k4,k5,sep="\n")
            print()
            toplam += 1

print(toplam)

Edit: 6 lı sator karesi bulamadım.

Bu arada önerdiğim yaklaşım, iyi bir yaklaşım değil, artık önermiyorum. :slight_smile:

1 Beğeni