Çözüldü Python algoritma sorunu

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

ayalkin

Hectopat
Katılım
6 Mayıs 2020
Mesajlar
171
Çözümler
1
Merhabalar üstadlar. Bazı sebeplerden dolayı küçük bir sesli komut programı yazmam gerekti. Programın genel iskeletini oluştururken bazı sorunlar yaşıyorum. Kodun işleyişini biraz açıklayayım. Normalde bu programları cümle bazlı kodluyorlar. Ben onun yerine kelime bazlı kodluyorum. Kullanıcı bir cümle söylüyor. Python'da bu cümleyi split metodu ile kelimelere ayırıyorum. Daha sonra bu kelimeleri bazı anahtar kelimeler ile karşılaştırıyorum. Hangi kelime ile uyuşursa gerekli işlemi yerine getiriyor. Örneğin 'Kapat'. Kullanıcı bu komutu söylerse program kendini kapatıyor.

Olayın asıl cilveli kısmı şu. Bazen tek bir anahtar kelime bir komutu tanımlamak için yeterli olamıyor maalesef. Örneğin 'Bilgisayarı kapat' 'kapat' kelimesi ile bilgisayar kendini mi kapatacak yoksa programı mı? Bende bu sorunun üstesinden gelebilmek adına. komutBul fonksiyonun içeriğini bu soruna göre hazırlamaya çalıştım olmadı. Kendi kendime paradoksa girdim gene olmadı. Böyle devam ederse birazdan kafamı duvarlara sürteceğim. 🤬

Uzun lafın kısası programdan çıktı olarak 'Bilgisayarı kapatıyorum' yazısını alamıyorum. Kafa karışıklığı olmaması için kodun sadece belli bir bölümünü buraya atıyorum gerekli olan değişkenlere ben örnek olması açısından değer atadım. Kodun içerisine de açıklamalar bıraktım. Kod direkt kopyala yapıştır yaparak çalıştırılabilir durumda.

Python:
class k ():
    komutlar = ['kapat','bilgisayari','kapa']
    kelimeler = ['matilda','bilgisayari','kapat','allah']
 
    def komutBul(self):
        x = 1
        for komut in self.komutlar:
            x += 1
        
            #kelimelerin icerisinde anahtar komut ariyorum
            if komut in self.kelimeler:
            
                self.komut1 = komut
            
                #Anahtar kelimeyi bulduktan sonra kendisini ve oncesindekileri siliyorum
                for i in range(0, x):
                    print(i)
                    self.kelimeler.pop(0)
            
                print(self.kelimeler,' kalanlar')# Silindikten geriye kalan kelimeler
            
                x = 1
                y = 0
                for komut in self.komutlar:
                    print('komutlar: ', komut)
                    x += 1
                
                    # Geriye kalan kelimelerin icerisinde anahtar kelime var mi diye bakiyorum
                    if komut in self.kelimeler:
                    
                        y = 1
                        self.komut2 = komut
                        print('burdayim')
                        # Iki anahtar kelimeyide alip komutu calistiyorum
                        self.komutCalistir(self.komut1, self.komut2)
                        break
            
                # geriye kalan kelimeler arasinda anahtar kelime yoksa tek anahtar kelime ile komutu calisitiriyorum
                if y == 0:
                    self.komutCalistir(self.komut1)
 
    def komutCalistir(self, komut1, komut2 = ''):
        if komut1 == "kapat" and komut2 == '':
            exit()
            print('bye bye')
        
        elif (komut1 == 'bilgisayari') and (komut2 == 'kapat'):
            print('Bilgisayari kapatiyorum')
           
ko = k()
ko.komutBul()

Anlatamadığım veya yanlış aktardığım bir yer varsa kusura bakmayın. Şimdiden hepinize teşekkürler.
 
Son düzenleme:
Çözüm
Hocam umarım istediğinize uygun bir şey yazabilmişimdir. Açıklamaları kodun içinde yaptım ama umarım anlatabilmişimdir.

[CODE lang="python" title="Kod"]class k ():
komutlar = ['bilgisayari kapat', 'bilgisayari ac']

kelimeler = ['matilda','bilgisayari','kapat','allah']

def komutBul(self):

# Komut olabilecek kelimeleri buluyoruz.
ihtimaller = []
for kelime in self.kelimeler:
for komut in self.komutlar:
if kelime in komut:
ihtimaller.append(kelime)

# İhtimaller listesinden kopya elementleri siliyoruz.
# Not: Burada set() metodunu da kulanabiliriz fakat sıralamayı bozuyor. Tercih etmeyin.
kullanici_komutu = " ".join(list(dict.fromkeys(ihtimaller)))

# Ne olur ne olmaz diye tekrar kontrol ediyoruz.
# Eğer komutların içinde varsa komutu returnlüyoruz.
if kullanici_komutu in self.komutlar:
return kullanici_komutu

def komutCalistir(self):
# Komutu alıyoruz.
komut = self.komutBul()

# Alınan komutu istediğimiz gibi işliyoruz.
if komut == 'bilgisayari kapat':
print('Bilgisayarı kapatıyorum...')

elif komut == 'bilgisayari ac':
print('Bilgisayarı açıyorum...')

# Object'imizi oluşturup komutu çalıştırıyoruz.
ko = k()
ko.komutCalistir()
[/CODE]

1622728535983.png
Hocam umarım istediğinize uygun bir şey yazabilmişimdir. Açıklamaları kodun içinde yaptım ama umarım anlatabilmişimdir.

[CODE lang="python" title="Kod"]class k ():
komutlar = ['bilgisayari kapat', 'bilgisayari ac']

kelimeler = ['matilda','bilgisayari','kapat','allah']

def komutBul(self):

# Komut olabilecek kelimeleri buluyoruz.
ihtimaller = []
for kelime in self.kelimeler:
for komut in self.komutlar:
if kelime in komut:
ihtimaller.append(kelime)

# İhtimaller listesinden kopya elementleri siliyoruz.
# Not: Burada set() metodunu da kulanabiliriz fakat sıralamayı bozuyor. Tercih etmeyin.
kullanici_komutu = " ".join(list(dict.fromkeys(ihtimaller)))

# Ne olur ne olmaz diye tekrar kontrol ediyoruz.
# Eğer komutların içinde varsa komutu returnlüyoruz.
if kullanici_komutu in self.komutlar:
return kullanici_komutu

def komutCalistir(self):
# Komutu alıyoruz.
komut = self.komutBul()

# Alınan komutu istediğimiz gibi işliyoruz.
if komut == 'bilgisayari kapat':
print('Bilgisayarı kapatıyorum...')

elif komut == 'bilgisayari ac':
print('Bilgisayarı açıyorum...')

# Object'imizi oluşturup komutu çalıştırıyoruz.
ko = k()
ko.komutCalistir()
[/CODE]

1622728535983.png
 
Çözüm
Hocam ellerinize sağlık çok teşekkür ederim. Elleriniz dert görmesin 😂 Yazmış olduğunuz kodun içerisinde çok küçük değişiklikler yaptım. Kullanıcı ne kadar anlamsız cümleler de kursa. Ters veya kuralsız cümlede kursa. Cümleleri başka bir fonksiyonda split ile kelimelerine ayırdığım için. Cümle içerisindeki anahtar kelimeler bana yetiyor. En azından şu an için yetiyor. Yazmış olduğunuz kodun en son halini buraya bakıyorum.

Her şey için tekrardan teşekkürler hocam.

Python:
class k ():
    komutlar = ['bilgisayari', 'kapat', 'ac']

    kelimeler = ['matilda','bilgisayari','kapat','allah','askina']
 
    def komutBul(self):

        # Komut olabilecek kelimeleri buluyoruz.
        ihtimaller = []
        for kelime in self.kelimeler:
            for komut in self.komutlar:
                if kelime in komut:
                    ihtimaller.append(kelime)
        
        # İhtimaller listesinden kopya elementleri siliyoruz.
        # Not: Burada set() metodunu da kulanabiliriz fakat sıralamayı bozuyor. Tercih etmeyin.
        kullanici_komutu = (list(dict.fromkeys(ihtimaller)))
        print(kullanici_komutu)
      
        return kullanici_komutu
    
    def komutCalistir(self):
        # Komutu alıyoruz.
        komut = self.komutBul()
        
           # Alınan komutu istediğimiz gibi işliyoruz.
        if ((komut[0] == 'bilgisayari') and (komut[1] == 'kapat')) or ((komut[1] == 'bilgisayari') and (komut[0] == 'kapat')):
            print('Bilgisayarı kapatıyorum...')

        elif komut == 'bilgisayari ac':
            print('Bilgisayarı açıyorum...')
            

# Object'imizi oluşturup komutu çalıştırıyoruz.
ko = k()
ko.komutCalistir()
 

Yeni konular

Geri
Yukarı