Grazie per la risposta, forse non sarei potuto essere più confusionario.<br><br>Ti spiego qual'è l'obbiettivo. <br>Ho un file csv pieno di record in questa forma <Cognome, Nome, Data di nascita>.<br>Da questo file devo creare un file di training per un classificatore binario (le due classi saranno math o unmatch).<br>
<br>Voglio leggere riga per riga il file (e questo lo faccio con la libreria csv) e per ognuno scegliere (al 50%) se da questo sarà generato un record di math o di unmatch. A seconda della scelta il record subirà un "trattamento" specifico (probabilmente solo in caso di match ha senso stabilire un trattamento specifico ma questo è ancora da valutare). <br>
Che cosa sarebbe questo trattamento ? Per ogni attributo (Cognome, Nome etc) voglio scegliere (con una certa probabilità) se subirà 1 errore 2 errori o 0 erorri. Una volta generato questo record confronterò attributo per attributo i due record con delle metriche (Edit distance o simili) e produrrò un vettore di numeri che userò per fare il training del classificatore.<br>
Come dicevo probabilmente non riserverò nessun trattamento specifico per gli unmatch, semplicemente prenderò un record a caso dal file e lo accoppierò come ho spiegato prima per la classe Unmatch.<br><br>quell è l'idea; <br>
quindi stavo pensando di usare un dizionario per tutte le scelte di probabilità ed un array per scandire i livelli obbligati e decisi in partenza del record.<br>Quindi dico, all'inizio scegli se sarà un match o no, se sarà un match prendi il vettore match, prendi il primo elemento match[0] che si chiama "match_surname". Questo match_surname è un altro dizionario che mi dirà cosa fare sul surname. Cioè mi dirà quale funzione scegliere. <br>
<br>Sì avevo già intenzione di usare le funzioni come oggetto come mi hai detto tu. Quello che non riesco a fare è fare la stessa cosa per i dizionari; cioè match[0] è "match_surname" (una stringa), voglio che lo script prenda il dizionario che ha lo stesso nome della stringa... che scelga la funzione e che la applichi... per poi passare al passo successivo di match -> match[1] etc ... spero di essermi spiegato meglio.<br>
<br>ho corretto l'errore in choose:<br><br>def choose(d):<br>    index = 0<br>    keys = d.keys()<br>    r = random.random()<br>    while (r > 0):<br>          r -= d[keys[index]]<br>        index += 1<br>    return keys[index-1]<br>
<br><br><br><br><div class="gmail_quote">Il giorno 17 settembre 2012 14:02, Daniele Varrazzo <span dir="ltr"><<a href="mailto:piro@develer.com" target="_blank">piro@develer.com</a>></span> ha scritto:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">On 2012-09-17 11:11, Antonio Piepoli wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Salve a tutti,<br>
<br>
premetto che questa domanda è molto stupida ma non riesco a trovare una<br>
soluzione.<br>
Diciamo che ho un vettore la cui lunghezza è già nota a priori. Ogni<br>
elemento del vettore deve subire una funzione; il punto è che la funzione<br>
cambia sia da elemento ad elemento ed in generare è scelta con una certa<br>
probabilità.<br>
<br>
stavo pensando a qualcosa di questo tipo<br>
<br>
first_stage = {'match':0.5, 'unmatch':0.5}<br>
match = ['match_surname','match_name']<br>
unmatch = ['unmatch_surname','unmatch_<u></u>name']<br>
<br>
match_surname = {'1_error':0.5, '2_error':0.3, 'no_error':0.2}<br>
match_name = {'1_error':0.5, '2_error':0.3, 'no_error':0.2}<br>
<br>
for record in records:<br>
  destiny = choose(first_stage)<br>
     for step in destiny:<br>
         function = choose(step)<br>
         function(record[desiny.index(<u></u>record)])<br>
</blockquote>
<br></div>
Questo "record[desiny.index(record)]"<u></u>, a parte il typo, non ho capito assolutamente cosa sia. "desiny/destiny" è una lista di due stringhe: che ci fa quell'index(record)? Cos'è records?<div class="im">
<br>
<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
la funzione choose prende un dizionario fatto in quel modo e mi restituisce<br>
un valore (stringa):<br>
<br>
def choose(d):<br>
    index = -1<br>
    keys = d.keys()<br>
    r = random.random()<br>
    while (r > 0):<br>
          r -= d[keys[index]]<br>
        index += 1<br>
    return keys[index]<br>
</blockquote>
<br></div>
Questa funzione non mi sembra funzionare come credi: sembra dipendere dall'ordine delle chiavi, non dal valore associato.<br>
<br>
<br>
    In [30]: vv = [ choose({'1_error':0.5, '2_error':0.3, 'no_error':0.2}) for i in range(10000) ]<br>
<br>
    In [31]: len(vv)<br>
    Out[31]: 10000<br>
<br>
    In [34]: len([v for v in vv if v == '1_error'])<br>
    Out[34]: 2997<br>
<br>
    In [35]: len([v for v in vv if v == '2_error'])<br>
    Out[35]: 2024<br>
<br>
    In [36]: len([v for v in vv if v == 'no_error'])<br>
    Out[36]: 4979<div class="im"><br>
<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
posso associare a quella stringa una variabile/funzione con quel nome ?<br>
stessa cosa dicasi per i vettori. È una cosa che mi consigliate di fare ?<br>
</blockquote>
<br></div>
Nota che in Python puoi usare le funzioni direttamente come oggetti. Puoi scrivere match = [match_surname, match_name], dove prima avevi definito "def match_surname(arg): ...". E poi usare match[0](record) o match[1](record) per richiamare una delle due.<br>

<br>
Un trucchetto per scegliere un elemento di una lista con una certa distribuzione potrebbe essere:<br>
<br>
    def makedist(items, probs, size=100):<br>
        """La funzione è volutamente non documentata e oneliner<br>
        per spingerti a pensare cosa fa.<br>
        """<br>
        return sum(([i] * int(float(p) / sum(probs) * size) for i, p in zip(items, probs)), [])<br>
<br>
    In [61]: dist = makedist(['1_error', '2_error', 'no_error'], [0.5, 0.3, 0.2])<br>
<br>
    In [62]: vv = [ random.choice(dist) for i in range(10000) ]<br>
<br>
    In [63]: len([v for v in vv if v == '1_error'])<br>
    Out[63]: 5022<br>
<br>
    In [64]: len([v for v in vv if v == '2_error'])<br>
    Out[64]: 3002<br>
<br>
    In [65]: len([v for v in vv if v == 'no_error'])<br>
    Out[65]: 1976<br>
<br>
Nota, anche qui, che se serve gli elementi in items possono essere funzioni, non stringhe. Quindi se hai una famiglia di funzioni f1, f2, ... associate a probabilità p1, p2, ... puoi fare qualcosa tipo.<br>
<br>
    dist = makedist([f1, f2, ...], [p1, p2, ...])<br>
<br>
    for record in records:<br>
        random.choice(dist)(record)<span class="HOEnZb"><font color="#888888"><br>
<br>
-- <br>
Daniele Varrazzo - Develer S.r.l.<br>
<a href="http://www.develer.com" target="_blank">http://www.develer.com</a><br>
______________________________<u></u>_________________<br>
Python mailing list<br>
<a href="mailto:Python@lists.python.it" target="_blank">Python@lists.python.it</a><br>
<a href="http://lists.python.it/mailman/listinfo/python" target="_blank">http://lists.python.it/<u></u>mailman/listinfo/python</a><br>
</font></span></blockquote></div><br><br clear="all"><br>-- <br>Antonio Piepoli<br><br>