IA in python

« Older   Newer »
 
  Share  
.
  1. sagara_939
     
    .

    User deleted


    ciao a tutti ragazzi.
    da un po di giorni mi sto interessando al python e alla programmazione. ho voluto iniziare con questo linguaggio per via della semplicità di apprendimento (secondo quanto ho letto in giro...).
    seguendo molte guide, sono arrivato a creare una piccola IA alla quale si possono porre domande, ricevendo una risposta poi dalla stessa IA.
    c'è anche una funzione per apprendere la risposta a una determinata domanda che non conosce.
    il problema è che una volta appresa la nuova risposta, se si riavvia il programma, la "scorda". volevo sapere se c'è un modo per far si che le nuove risposte siano salvate e che la IA le possa riutilizzare la volta successiva.

    vi posto il programmino, che ho chiamato "Jhon":


    CODICE
    print "Benvenuto in Jhon IA BETA!"

    import winsound
    winsound.PlaySound("sound.wav",1)  #suono di avvio
    import time
    time.sleep(2)                                  

    a={"ciao":"Ciao amico!","come va?":"Bene Grazie!","come stai?":"Bene grazie","quanti anni hai?":"Dipende, sono nato il 10 novembre del 2011 alle 19:50 circa","dove abiti?":"Nel PC del mio creatore","come ti chiami?":"Mi chiamo Jhon","di cosa sei fatto?":"Di circuiti","non mi fai domande?":"No, non sono programmato per farlo...","cosa ti piace fare?":"mi piace giocare a carte, uccidere, sbudellare... tutte cose di questo genere","chi ti ha creato?":"Il mio creatore e Sagara","ti piace conversare con me?":"Si mi fa molto piacere!","puoi imparare?":"Si ma solo momentaneamente. Una volta chiuso, dimentico tutto","sai fare conti?":"no mi dispiace","cosa sai fare":"Posso solo rispondere alle tue domande e imparare momentaneamente altre risposte","la capitale della francia?":"Parigi!","la capitale della germania?":"Berlino!","la capitale d italia?":"Roma!","che colore e il cielo?":"Blu, naturalmente!","di che colore sono le nuvole?":"Bianche!","come si chiama il nostro pianeta?":"Terra!","chi ti ha creato?":"Sagara","dove sei nato?":"Nel PC del mio creatore, Sagara","cosa fai durante la giornata?":"Aspetto di essere avviato e di parlare con qualcuno"}
    b="inizio"
    while b!="":
       b=raw_input("Scrivi:")
       if a.has_key(b):
           print a[b]
       else:
           c=raw_input("Non capisco. Cosa devo rispondere alla domanda"+b"?") #chiede la risposta alla domanda che non conosce
           a[b]=c



    come potete vedere ci sono un bel po di domande-risposte che ho già inserito...


    ho creato anche una versione più estesa dell'intero programma, che include anche vari tool semplici e un programmino che fa domande e devi rispondere... poi quando sarà completo lo posterò :)
     
    Top
    .
  2.  
    .
    Avatar


    Group
    Member
    Posts
    6,931

    Status
    Offline
    Crea un file di testo con una formattazione a te gradita.
    Leggilo allo startup per per popolare `a`, e appendici i nuovi valori quando ne hai bisogno.
     
    Top
    .
  3. sagara_939
     
    .

    User deleted


    ah quindi in pratica quando una persona "insegna" a Jhon cosa deve dire a una determinata domanda, lui la salva domanda e risposta in un file di testo... poi io devo modificarlo e inserirle, giusto?
     
    Top
    .
  4. sagara_939
     
    .

    User deleted


    ecco sono riuscito a fare in questo modo:

    CODICE
    print "Benvenuto in Jhon IA BETA!"

    import winsound
    winsound.PlaySound("sound.wav",1)
    import time
    time.sleep(2)

    a={"ciao":"Ciao amico!","come va?":"Bene Grazie!","come stai?":"Bene grazie","quanti anni hai?":"Dipende, sono nato il 10 novembre del 2011 alle 19:50 circa","dove abiti?":"Nel PC del mio creatore","come ti chiami?":"Mi chiamo Jhon","di cosa sei fatto?":"Di circuiti","non mi fai domande?":"No, non sono programmato per farlo...","cosa ti piace fare?":"mi piace giocare a carte, uccidere, sbudellare... tutte cose di questo genere","chi ti ha creato?":"Il mio creatore e Sagara","ti piace conversare con me?":"Si mi fa molto piacere!","puoi imparare?":"Si ma solo momentaneamente. Una volta chiuso, dimentico tutto","sai fare conti?":"no mi dispiace","cosa sai fare":"Posso solo rispondere alle tue domande e imparare momentaneamente altre risposte","la capitale della francia?":"Parigi!","la capitale della germania?":"Berlino!","la capitale d italia?":"Roma!","dux mea lux?":"Saluto al Duce!","che colore e il cielo?":"Blu, naturalmente!","di che colore sono le nuvole?":"Bianche!","come si chiama il nostro pianeta?":"Terra!","chi ti ha creato?":"Sagara","dove sei nato?":"Nel PC del mio creatore, Sagara","cosa fai durante la giornata?":"Aspetto di essere avviato e di parlare con qualcuno"}
    b="inizio"
    while b!="":
       b=raw_input("Scrivi:")
       if a.has_key(b):
           print a[b]
       else:
           c=raw_input("Non capisco. Cosa devo rispondere alla domanda"+b"?") #chiede la risposta alla domanda che non conosce
           a[b]=c
           d=open("imparato.txt","w")
           d.write(b)
           d.write(c)
           d.close()



    ho testato. quando impara una nuova domanda e risposta, le trascrive su un file di nome "imparato.txt". solo che se si insegna una seconda cosa sovrascrive...


    non riesco però a fare in modo che, leggendo le domande e risposte da un testo, le utilizzi... riesco solo a far leggere il file.
    proverò e vi faro sapere :)
     
    Top
    .
  5.  
    .
    Avatar


    Group
    Member
    Posts
    6,931

    Status
    Offline
    Scrivi sul file qualcosa del genere su ogni linea DOMANDA|RISPOSTA e leggi con (non conosco bene il python e non l'ho testato, ma teoricamente questo è il modo che ti consiglio di usare)
    CODICE
    file = open('file', 'r')
    for riga in file.readlines():
              splitted = riga.split('|')
              a[splitted[0]] = splitted[1]
    file.close()

    Come ho detto nel post precedente, scrivi sullo stesso file allo stesso modo il contenuto di a, in questo modo potrai aggiornarlo con facilità ed avrai tutto ben organizzato.
     
    Top
    .
  6. sagara_939
     
    .

    User deleted


    mm si sto provando un po ma mi da degli errori, ma sicuramente sono io visto che il comando "split" non l'ho mai usato :D
    adesso vedo un po come risolvere

    allora... in questa maniera legge il contenuto del file e lo utilizza, a patto che ci sia solo un valore domanda|risposta.
    se ne metto altri, vicini o sotto, mi da errore "list index out of range" quando lo provo.
    dovrei fare in modo che legga il "a capo" dei vari input domanda|risposta

    niente risolto. il codice è giusto.
    legge perfettamente tutti gli input DOMANDA|RISPOSTA, il problema ero io. avevo copiato e incollato tutti gli input dal programma iniziale (a={ecc...}) e li ho incollati nel testo, andando a capo e cancellando i (":,"") e inserendo |
    il problema è che ne ho dimenticati alcuni che andavano a creare l'errore :D

    adesso funziona perfettamente. manca solo il modo per inserirci le cose imparate ed è completo :) mi metto al lavoro, grazie! :)
     
    Top
    .
  7. theratto
     
    .

    User deleted


    lo ho provato, bellino come programma!
    complimenti! la prima funzione suggerita da roxas poi estende il programma veramente molto!!!!! però salvare le nuove risp si fa indispensabile :)
     
    Top
    .
  8. shocker000
     
    .

    User deleted


    CITAZIONE (sagara_939 @ 11/11/2011, 16:13) 
    mm si sto provando un po ma mi da degli errori, ma sicuramente sono io visto che il comando "split" non l'ho mai usato :D
    adesso vedo un po come risolvere

    allora... in questa maniera legge il contenuto del file e lo utilizza, a patto che ci sia solo un valore domanda|risposta.
    se ne metto altri, vicini o sotto, mi da errore "list index out of range" quando lo provo.
    dovrei fare in modo che legga il "a capo" dei vari input domanda|risposta

    niente risolto. il codice è giusto.
    legge perfettamente tutti gli input DOMANDA|RISPOSTA, il problema ero io. avevo copiato e incollato tutti gli input dal programma iniziale (a={ecc...}) e li ho incollati nel testo, andando a capo e cancellando i (":,"") e inserendo |
    il problema è che ne ho dimenticati alcuni che andavano a creare l'errore :D

    adesso funziona perfettamente. manca solo il modo per inserirci le cose imparate ed è completo :) mi metto al lavoro, grazie! :)

    comunque puoi provare ad usare il modulo shelve:
    http://docs.python.org/library/shelve.html
    http://docs.python.it/html/lib/module-shelve.html

    ciao :)
     
    Top
    .
  9. sagara_939
     
    .

    User deleted


    Ecco cosa sono riuscito a fare.


    CODICE
    print "Benvenuto in Jhon IA BETA!"

    import winsound
    winsound.PlaySound("sound.wav",1)
    import time
    time.sleep(2)

    a={}
    file=open("quellocheso.txt", "r")
    for riga in file.readlines():
       splitted = riga.split('|')
       a[splitted[0]] = splitted[1]
    file.close()
    b="inizio"
    while b!="":
       b=raw_input("Scrivi:")
       if a.has_key(b):
           print a[b]
       else:
           c=raw_input("Non capisco. Cosa devo rispondere alla domanda"+b"?") #chiede la risposta alla domanda che non conosce
           a[b]=c
           d=open("imparato.txt","a")
           d.write(b)
           d.write("|")
           d.write(c)
           d.close()
           print("Grazie, adesso so una cosa nuova!")


    allora:
    apre "quellocheso.txt" e li trova le domande che puo riceve e le risposte da dare.
    se per caso non sa cosa rispondere, ti dice "Non capisco. Cosa devo rispondere alla domanda"+b"?". tu gli scrivi la risposta e lui la memorizza, ma non in "quellocheso.txt" ma in "imparato.txt".
    ho provato a far scrivere quello che impara in "quellocheso", ma non esegue l'operazione. credo sia dato dal fatto che, quando dovrebbe scrivere sul file di testo quello che ha imparato, lo stesso testo è gia aperto per rispondere alle domande (non so se mi sono spiegato :D )

    provatelo e ditemi cosa ne pensate :)

    ah gia! i due file di testo createli voi. in"quellcheso.txt" le domande e risposte scrivetele in questo ordine (DOMANDA|RISPOSTA)
     
    Top
    .
  10. sagara_939
     
    .

    User deleted


    ci sono riuscito!!!

    CODICE
    print "Benvenuto in Jhon IA BETA!"

    import winsound
    winsound.PlaySound("sound.wav",1)
    import time
    time.sleep(2)

    a={}
    file=open("quellocheso.txt", "r")
    for riga in file.readlines():
       splitted = riga.split('|')
       a[splitted[0]] = splitted[1]
    file.close()
    b="inizio"
    while b!="":
       b=raw_input("Scrivi:")
       if a.has_key(b):
           print a[b]
       else:
           c=raw_input("Non capisco. Cosa devo rispondere alla domanda"+b"?") #chiede la risposta alla domanda che non conosce
           a[b]=c
           d=open("quellocheso.txt","a")
           d.write("\n")
           d.write(b)
           d.write("|")
           d.write (c)
           d.close()
           print("Grazie, adesso so una cosa nuova!")



    ho scoperto che: quando gli dicevo la DOMANDA|RISPOSTA da salvare in "quellocheso.txt", pensavo non lo salvasse. in realta lo salvava, ma attaccato all'ultima DOMANDA|RISPOSTA che avevo scritto io direttamente sul .txt.
    ho soltanto aggiunto il comando per andare "a capo" e adesso funziona perefettamente! nel file "quellocheso.txt" legge e scrive domande e risposte :)

    vi postero il programma finito in .exe piu avanti, magari con grafica :)
     
    Top
    .
  11.  
    .
    Avatar


    Group
    Member
    Posts
    6,931

    Status
    Offline
    Bella idea comunque, magari dopo posto la mia versione in Ruby :)
     
    Top
    .
  12. sagara_939
     
    .

    User deleted


    grande :)

    ecco il mio intero programma Jhon117, convertito in .exe.
    ci sono anche le altre funzioni di cui avevo parlato all'inizio :)

    per avviarlo dovete estrarre la cartella e doppioclick su Jhon-AVVIA

    CODICE
    http://www.megaupload.com/?d=9B9TORQ1

     
    Top
    .
  13.  
    .
    Avatar


    Group
    Member
    Posts
    6,931

    Status
    Offline
    CITAZIONE (sagara_939 @ 11/11/2011, 19:51) 
    grande :)

    ecco il mio intero programma Jhon117, convertito in .exe.
    ci sono anche le altre funzioni di cui avevo parlato all'inizio :)

    per avviarlo dovete estrarre la cartella e doppioclick su Jhon-AVVIA

    CODICE
    http://www.megaupload.com/?d=9B9TORQ1

    Ti consiglio di postare direttamente il source, fa più comodo ;)
     
    Top
    .
  14.  
    .
    Avatar


    Group
    Member
    Posts
    6,931

    Status
    Offline
    Ecco la mia implementazione in Ruby.
    CODICE
    #!/usr/bin/env ruby
    ##########################################################################
    #    Giovanni Capuano <webmaster@giovannicapuano.net>
    #    This program is free software: you can redistribute it and/or modify
    #    it under the terms of the GNU General Public License as published by
    #    the Free Software Foundation, either version 3 of the License, or
    #    (at your option) any later version.
    #
    #    This program is distributed in the hope that it will be useful,
    #    but WITHOUT ANY WARRANTY; without even the implied warranty of
    #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    #    GNU General Public License for more details.
    #
    #    You should have received a copy of the GNU General Public License
    #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
    ##########################################################################
    class ArtificialNiggerIntelligence
           attr_accessor :db
           
           def initialize(db = nil)
                   @db = !db ? 'db' : db
                   if !File.exist?(@db)
                           File.new(@db, 'w')
                   end
           end
                   
           def parse
                   hash = Hash.new
                   file = File.open(@db, 'r')
                   begin
                           while(line = file.gets)
                                   if split != ''
                                           split = line.split('|')
                                           hash[split[0]] = split[1]
                                   end
                           end
                           file.close
                   rescue => e
                           puts 'Error reading the database.'
                   end
                   hash
           end
           
           def learn(question, answer)
                   file = File.open(@db, 'a')
                   file.write("#{question}|#{answer}") # Why the fucking concatenation with ,/+/<< doesn't work?
                   file.close
           end
           
           def clear
                   if File.exist?(@db)
                           File.delete(@db)
                           File.open(@db, 'w')
                   end
           end
    end

    ai = ArtificialNiggerIntelligence.new
    puts 'Type `/q` whenever you want to kill this app and `/c` to clear your database.'
    begin
           hash = ai.parse
           print '>'
           question = gets.chomp.downcase
           if question == '/q'
                   break
           elsif question == '/c'
                   ai.clear
                   redo
           end
           if hash.has_key?(question)
                   puts hash[question]
           else
                   print 'I don\'t know what I have to say. Enlighten me: '
                   answer = gets.chomp # I need this var when I do the condition loop
                   ai.learn(question, answer)
                   puts 'Ok. Thank you very much bro.'
           end
    end while true
     
    Top
    .
  15. meh.
     
    .

    User deleted


    CODE
    -                @db = !db ? 'db' : db
    +                @db = db || 'db'


    CODE
    -                file = File.open(@db, 'a')
    -                file.write("#{question}|#{answer}") # Why the fucking concatenation with ,/+/<< doesn't work?
    -                file.close
    + File.open(@db, ?a) { |f| f.write "#{question}|#{answer}" }

     
    Top
    .
35 replies since 11/11/2011, 14:46   643 views
  Share  
.