-
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":CODICEprint "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ò. -
.
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.. -
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? . -
sagara_939.
User deleted
ecco sono riuscito a fare in questo modo: CODICEprint "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. -
.
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) CODICEfile = 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.. -
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
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
adesso funziona perfettamente. manca solo il modo per inserirci le cose imparate ed è completo mi metto al lavoro, grazie!. -
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
. -
shocker000.
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
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
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. -
sagara_939.
User deleted
Ecco cosa sono riuscito a fare. CODICEprint "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 )
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). -
sagara_939.
User deleted
ci sono riuscito!!! CODICEprint "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. -
.
Bella idea comunque, magari dopo posto la mia versione in Ruby . -
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-AVVIACODICEhttp://www.megaupload.com/?d=9B9TORQ1
. -
.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-AVVIACODICEhttp://www.megaupload.com/?d=9B9TORQ1
Ti consiglio di postare direttamente il source, fa più comodo. -
.
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. -
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}" }
.