Python'da Yeni Başlayanlar İçin Kodlama: Mümkün Olan En Basit Yapay Zeka Sohbet Yardımcısını Oluşturma


Piyasadaki AI sohbet robotlarından herhangi birini kullandıysanız, bunların nasıl çalıştığını ve kendinizin bir tane oluşturup oluşturamayacağınızı merak edebilirsiniz. Python ile bu mümkün olandan daha fazlasıdır ve burada mümkün olan en basit sohbet robotunun nasıl oluşturulacağını ele alacağız ve onu yükseltmek için size bazı tavsiyeler vereceğiz.

Python ile NLTK'yı Öğrenmek

Python'u kullanmanın en zorlayıcı nedenlerinden biri modüler yapısıdır. Uygulamamız için temel bir GUI oluşturmak amacıyla Tkinter'ı kullandığımızda bunu basit gider takip aracımızda gördük. Ancak sohbet robotlarının bu kadar karmaşık olması gerekmiyor ve bir terminalde sorunsuz bir şekilde çalıştırabiliriz. Bu uygulama için bir kullanıcı arayüzü tasarlamayacağım, ancak kendiniz deneyebilirsiniz.

Uygulamamızın temeli, bize bir sohbet robotunun temel yapı taşlarını veren bir Python kütüphanesi olan NLTK'dir (Doğal Dil Araç Seti). NLTK'yi kurmak için Python kurulumunuzun konumunu bir terminalde açın ve şunu yazın:

pip install nltk

NLTK kütüphanesinin indirildiğini ve güncellendiğini görmelisiniz. Diğer tüm içeriklerde olduğu gibi, NLTK'yi kodumuzun en üstüne şu şekilde içe aktarmamız gerekecek:

        import nltk
from nltk.tokenize import word_tokenize
from nltk.sentiment import SentimentIntensityAnalyzer
from nltk.corpus import stopwords
from nltk.tag import pos_tag
import string
import random
import re
# Download required NLTK data
nltk.download('punkt_tab')
nltk.download('vader_lexicon')
nltk.download('stopwords')
nltk.download('averaged_perceptron_tagger_eng')
    

Buraya bazı "indirme" anahtar kelimeleri eklediğimizi fark etmiş olabilirsiniz. Bu, çok basit sohbet robotumuzun zaten bildiği yanıtları ve bilgileri içeren temel veri setini indirmemize olanak tanır. Chatbot'un çalışmasını sağlamaya başlayalım.

Chatbot Arayüzü Oluşturma

Chatbot arayüzüyle bunu basit tutacağız, böylece Python'daki basit yapılacaklar listemizi nasıl yaptığımıza benzer olacak. Giriş ve çıkışımız için terminal penceresini kullanacağız.

        class SmartAIChatbot:
   def __init__(self):
       # Enhanced knowledge base with question-answer pairs
       self.knowledge_base = {
           'greetings': {
               'patterns': ['hello', 'hi', 'hey'],
               'responses': [
                   "Hi there! How can I help you today?",
                   "Hello! Nice to meet you!",
                   "Hey! What's on your mind?"
               ]
           },
           'questions': {
               'what': {
                   'patterns': ['what is', 'what are', 'what can'],
                   'responses': [
                       "Let me think about {topic}...",
                       "Regarding {topic}, I would say...",
                       "When it comes to {topic}, here's what I know..."
                   ]
               },
               'how': {
                   'patterns': ['how do', 'how can', 'how does'],
                   'responses': [
                       "Here's a way to approach {topic}...",
                       "When dealing with {topic}, you might want to...",
                       "The process for {topic} typically involves..."
                   ]
               },
               'why': {
                   'patterns': ['why is', 'why do', 'why does'],
                   'responses': [
                       "The reason for {topic} might be...",
                       "Thinking about {topic}, I believe...",
                       "Let me explain why {topic}..."
                   ]
               }
           },
           'farewell': {
               'patterns': ['bye', 'goodbye', 'see you'],
               'responses': [
                   "Goodbye! Have a great day!",
                   "See you later!",
                   "Bye! Come back soon!"
               ]
           }
       }
       self.sentiment_analyzer = SentimentIntensityAnalyzer()
       self.stop_words = set(stopwords.words('english'))
    

Bu, sohbet robotumuza temel etkileşimi ve hızlı kelimeleri sağlamanın yanı sıra soruları yanıtlamanın bir yolunun başlangıcını da sağlar. Şimdi bu yapay zeka botunun istemleri nasıl alacağına ve yazdıklarımızı nasıl anlayacağına bakalım.

Botlarınıza Okumayı Nasıl Öğretebilirsiniz?

Önceki içe aktarmalarda "tokenize" kelimesini fark etmiş olabilirsiniz. "Jetonlar" botların söylediklerimizi anlamak için kullandıkları şeydir. Hangi konuyu tartışmak istediğinizi belirlemek için belirteçler ve etiketlemenin yanı sıra sorular gibi şeyleri de kullanacağız:

         def tokenize_and_tag(self, user_input):
        """Clean, tokenize, and POS tag user input"""
        # Clean and tokenize
        cleaned = user_input.lower().translate(str.maketrans('', '', string.punctuation))
        tokens = word_tokenize(cleaned)
        # POS tagging
        tagged = pos_tag(tokens)
        return tokens, tagged
    def extract_topic(self, tokens, question_word):
        """Extract the main topic after a question word"""
        # Find the question word's position
        try:
            q_pos = tokens.index(question_word.lower())
            # Get everything after the question word and auxiliary verbs
            topic_words = tokens[q_pos + 2:]  # Skip question word and auxiliary verb
            # Remove stop words from topic
            topic = ' '.join([word for word in topic_words if word not in self.stop_words])
            return topic if topic else "that"
        except ValueError:
            return "that"
    def identify_question_type(self, user_input, tagged_tokens):
        """Identify the type of question and extract relevant information"""
        question_words = {
            'what': 'what', 'why': 'why', 'how': 'how',
            'when': 'when', 'where': 'where', 'who': 'who'
        }
        
        # Check if it's a question
        is_question = any([
            user_input.endswith('?'),
            any(word.lower() in question_words for word, tag in tagged_tokens),
            any(pattern in user_input.lower() for qtype in self.knowledge_base['questions']
                for pattern in self.knowledge_base['questions'][qtype]['patterns'])
        ])
        
        if not is_question:
            return None, None
        # Identify question type and topic
        for q_type, q_info in self.knowledge_base['questions'].items():
            for pattern in q_info['patterns']:
                if pattern in user_input.lower():
                    topic = self.extract_topic(user_input.split(), q_type)
                    return q_type, topic
        
        return 'general', 'that'
    

Botumuzun (İlkel) Beynini Geliştirmek

Bu basit bir yapay zeka sohbet robotu olduğundan herhangi bir karmaşık düşünce işlemi yapmayacağız. Bunun yerine, kullanıcı girdisini işlemek ve duyarlılığı belirlemek için bir yöntem geliştireceğiz:

        def get_response(self, user_input):
        """Generate a more thoughtful response based on input type"""
        tokens, tagged_tokens = self.tokenize_and_tag(user_input)
        
        # Check for greetings and farewells first
        for category in ['greetings', 'farewell']:
            if any(pattern in user_input.lower() for pattern in self.knowledge_base[category]['patterns']):
                return random.choice(self.knowledge_base[category]['responses'])
        
        # Handle questions
        q_type, topic = self.identify_question_type(user_input, tagged_tokens)
        if q_type:
            if q_type in self.knowledge_base['questions']:
                template = random.choice(self.knowledge_base['questions'][q_type]['responses'])
                return template.format(topic=topic)
            else:
                # Handle general questions
                return f"That's an interesting question about {topic}. Let me think... "
        # If not a question, use sentiment analysis for response
        sentiment = self.analyze_sentiment(user_input)
        if sentiment > 0.2:
            return "I sense your enthusiasm! Tell me more about your thoughts on this."
        elif sentiment < -0.2:
            return "I understand this might be challenging. Would you like to explore this further?"
        else:
            return "I see what you mean. Can you elaborate on that?"
    def analyze_sentiment(self, text):
        """Analyze the sentiment of user input"""
        scores = self.sentiment_analyzer.polarity_scores(text)
        return scores['compound']
    

Kullanıcının girdi duyarlılığının nasıl hissettiğini bize anlatmak için vader_lexicon'u kullanırız ve oradan onlara ne tür çıktı vereceğimizi belirleyebiliriz.

Botumuzla Konuşmak

Kodlamayı tamamlamak için sohbet arayüzünü sonlandıracağız:

        def chat(self):
        """Main chat loop"""
        print("Bot: Hi! I'm a smarter chatbot now. I can handle questions! Type 'bye' to exit.")
        
        while True:
            user_input = input("You: ")
            if user_input.lower() in ['bye', 'goodbye', 'exit']:
                print("Bot:", random.choice(self.knowledge_base['farewell']['responses']))
                break
                
            response = self.get_response(user_input)
            print("Bot:", response)
# Create and run the chatbot
if __name__ == "__main__":
    chatbot = SmartAIChatbot()
    chatbot.chat()
    

Bu, chatbotumuzla temel bir sohbet yapmamıza ve bazı yanıtlarını almamıza olanak tanır.

Hepsini Bir Araya Getirmek ve Geliştirmenin Yolları

Chatbotumuzu çalıştırdığımızda şöyle bir şey görmeliyiz:

Bu noktada bot girdinizi okuyabilir ve size rastgele bir yanıt verebilir, ancak aslında düşünemez ve size yanıt veremez. Ancak tokenizasyon sistemi sayesinde ne sormaya çalıştığınızı anlayabilir. Yanıt verecek herhangi bir verisi yok.

Uygun bir bilgi tabanına sahip bir yapay zeka sohbet robotu oluşturmak için kelime ağlarına dalmanız ve burada yapmak istediğimizin çok ötesinde verileri serileştirmeyi öğrenmeniz gerekir. Ancak daha işlevsel bir chatbot yapmak istiyorsanız bilmeniz gerekenleri size öğretebilecek pek çok kaynak var. Her zaman olduğu gibi bu kod GitHub'ımda indirilebilir veya yorum yapılabilir.

Bu botla geliştirebileceğimiz pek çok şey var; ona gerçek bir bilgi tabanı vermekten, kullanıcı arayüzünü daha şık ve çekici bir şeye yükseltmeye kadar. Bunu deneyin ve neyle karşılaşacağınızı görün!

İlgili makaleler