[Algoritmi] [C#] Tirare a caso con una lista di probabilità

archistico
Buongiorno a tutti
sto facendo un software che usa le parole del dizionario per trovare sequenze comuni per poterne creare di nuove.
Praticamente ho una tabella in cui ho le probabilità reciproche. Ad esempio, all'interno delle parole italiane, dopo 'm' ho il 17% che ci sia una 'a'.

La domanda è questa: come posso ora tirare a sorte una lettera tenendo conto delle probabilità della tabella che ho creato?
Quello che vorrei è:
- tiro a sorte la prima lettera della parola, facendo risultare più "probabili" quelle che di solito iniziano con quella lettera,
- in base alle probabilità della lettera successiva tiro a sorte di nuovo,
- continuo fino alla fine in base alla lunghezza della parola scelta.

Il metodo grezzo che ho pensato è crearmi una lista di lettere in cui il numero delle lettere compare in base alla sua probabilità, ma mi pare molto grezzo.
Avete qualche idea migliore?

Grazie a tutti
Emilie

Risposte
archistico
Ecco l'immagine della tabella con le probabilità di trovare la lettera successiva
http://s9.postimg.org/4vjbaew4f/Risulta ... cutive.jpg

apatriarca
Non sono sicuro di aver compreso il tuo problema. Ho capito il discorso della probabilità, ma non tanto quale sia il problema che non riesci a risolvere. Suppongo che il problema possa essere quello di capire quando finire la parola? Oppure non riesci a scegliere a caso in base ad una probabilità discreta?

Ho alcune perplessità riguardo alla tua tabella.. Le lettere è e é non sembrano comparire dopo alcuna lettera, ma questo è ovviamente falso in italiano. Invece ì compare con il 2% dopo un'altra ì e sinceramente faccio fatica a pensare ad una parola con due ìì consecutive. Sono io che sto leggendo la tabella in modo errato? Che dizionario stai usando?

archistico
Grazie della risposta.
Allora il database l'ho creato io usando una quarantina di romanzi "classici" scelti oculatamente dal progetto Gutenberg più un'altra quarantina di altri ebook (saggi e romanzi recenti) che ho sul mio ereader. Non contenta ho sommato anche un paio di dizionari trovati online.
Ho tutto su una base dati Mysql e ho provato a fare una piccola sistemazione al DB ma controllare 350.000 parole prende tempo. Ho notato anche io varie piccole imperfezioni perché in qualche libro qualcuno usa "sììì" o parole comunque errate.
Inoltre essendo relativamente poche le parole con le "ì" poche parole errate mi sballano il risultato.
(appena riesco cercherò di pulire il dizionario)
Questa è la tabella con il numero delle occorrenze:
http://s8.postimg.org/frbixjktx/Conteggio_Sequenze.jpg

Per il resto, sì, come faccio a scegliere in base ad una tabella di probabilità?

apatriarca
Il metodo più semplice è quello di costruirsi una tabella comulativa delle probabilità. In cui cioè hai la probabilità \(P(s_i \le k \mid s_{i-1} = h)\) per i diversi \(k\) e \(h\) invece di \(P(s_i = k \mid s_{i-1} = h)\). Essendo probabilità la loro somma è \(1\) puoi quindi scegliere un numero casuale \( \eta \in [0, 1] \) e quindi trovare il valore di \(k\) per cui \( P(s_i < k \mid s_{i-1} = h) < \eta \leq P(s_i \leq k \mid s_{i-1} = h). \) Ti costruisci insomma un array con questa funzione comulativa e fai una ricerca lineare o binaria in esso.

axpgn
Io credo di aver capito il problema ma non sono un programmatore quindi la mia soluzione sarà ancor più grezza ... :-)

Tieni pure la tabella così ma riempila di frequenze percentuali cumulate senza ordinamento ... mi spiego con un esempio ...

Poniamo che la riga relativa alla $a$ sia questa (l'ho semplificata mettendo nell'intestazione solo vocali ma ovviamente tu metti tutto):

$(a,e,i,o,u,=T)$
$(2,5,3,1,2,=13)$

la devi sostituire con questa

$(a,e,i,o,u,=T)$
$(15.38%,53.85%,76,92%,84,62%,100,00%,=100)$

Ad ogni lettera generi un numero random $0<=x<1$ (per cento ...) e scandendo la relativa riga ti fermi quando il valore random è maggiore del valore in tabella ...

Cordialmente, Alex

archistico
Perfetto e molto chiaro.
Provo e poi vi posto la soluzione

archistico
Questa è la tabella con la probabilità cumulativa
http://s22.postimg.org/wf49nub4h/Probab ... lativa.jpg

Praticamente visivamente si capisce anche quali sono le lettere che maggiormente concludono le parole

axpgn
Qualcosa non mi convince ... hai messo il limite inferiore? Perché l'ultima lettera, la $z$, deve essere sempre $100%$ ...

EDIT: non mi convincono i tuoi dati, probabilmente non ho capito cosa rappresentano ... :D

apatriarca
@axpgn ogni riga rappresenta la lettera che precede, mentre le colonne rappresentano le lettere tra cui deve scegliere. Mi sembra corretta la tabella.

@archistico Ok, ora devi semplicemente selezionare la riga in base alla lettera precedente, scegliere un valore casuale in \([0, 100]\) (o \([0, 1]\) se lavori in realtà con valori di probabilità in questo intervallo) e quindi andare a prendere la colonna corrispondente.

axpgn
Ok, risolto il dubbio: aveva già messo una colonna che volevo suggerirgli di aggiungere cioè quella delle "finali di parola", non l'avevo capito ... ;-) ... adesso i conti mi tornano ... :smt023

Solo un consiglio: usa un bel po' di decimali dato che hai qualche milione di occorrenze altrimenti le combinazioni infime non compariranno mai ... :D

apatriarca
@axpgn Suppongo che questo lo faccia usando un programma in C#, per cui in realtà ci siano poi tutti i decimali che mancano..

axpgn
Non sapendo quale sia l'input voglia dare in pasto al programma (se le frequenze originali o quelle cumulate quindi elaborate) precauzionalmente ho preferito suggerire ... :-)

Cordialmente, Alex

archistico
Ho usato come mi avete consigliato le percentuali cumulate.

Funziona anche se come immaginavo il tutto ha un difetto di concezione originale (è una semplificazione della lingua italiana) visto che guardo solo le consecutive delle lettere e non le sillabe. Per cui tipo una z può essere seguita da un'altra z, e questa a sua volta da un'altra z... Per cui ogni tanto vengono fuori parole che in italiano nessuno si inventerebbe.

Per altre mi sono venute fuori:
sturei
arsini
renote
savio
strato
gimare
stica
...

using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CasualitàProbabilistica {
public
partial class frmMain : Form {
  string[] lettere;
  Dictionary<Tuple<char, char>, double> tabella =
      new Dictionary<Tuple<char, char>, double>();

public
  frmMain() {
    InitializeComponent();
    CaricaDati();
  }

private
  void CaricaDati() {
    string listaLettere =
        "a;à;b;c;d;e;è;é;f;g;h;i;ì;j;k;l;m;n;o;ò;p;q;r;s;t;u;ù;v;w;x;y;z;#";
    lettere = listaLettere.Split(';');

    using(StreamReader sr = File.OpenText("ListaProbabilita.txt")) {
      string linea;
      int contLettera = 0;

      while ((linea = sr.ReadLine()) != null) {
        string[] probabilitaLettera;
        probabilitaLettera = linea.Split(';');
        int contProbabilita = 0;

        foreach (string lettera in lettere) {
          tabella.Add(
              new Tuple<char, char>(lettere[contLettera][0], lettera[0]),
              Convert.ToDouble(probabilitaLettera[contProbabilita]));
          contProbabilita++;
        }

        contLettera++;
      }
    }
  }

private
  char CercaLettera(char c, int perc) {
    foreach (string lettera in lettere) {
      if (tabella[new Tuple<char, char>(c, lettera[0])] > perc)
        return Convert.ToChar(lettera);
    }

    return '*';
  }

private
  void btCrea_Click(object sender, EventArgs e) {
    Random rnd = new Random();
    int percPrimaLettera = rnd.Next(100);

    // La prima lettera corrisponde alle probabilità <#,lettera>
    string[] parola = new string[Convert.ToByte(upLunghezza.Value)];
    parola[0] = CercaLettera('#', percPrimaLettera).ToString();

    for (int c = 1; c < Convert.ToByte(upLunghezza.Value); c++) {
      int perc = rnd.Next(100);
      string nuovaLettera = "";
      nuovaLettera =
          CercaLettera(Convert.ToChar(parola[c - 1]), perc).ToString();

      if (nuovaLettera == "#")
        break;

      parola[c] = nuovaLettera;
    }

    tbRis.Text += string.Join("", parola) + System.Environment.NewLine;
  }
}
}



grazie a tutti

archistico
Questo è il file con la lista delle probabilità cumulate, magari a qualcuno può servire

0,00 ;0,00 ;2,10 ;6,29 ;8,12 ;8,37 ;8,37 ;8,37 ;9,80 ;12,73 ;12,84 ;15,04 ;15,05 ;15,07 ;15,15 ;21,71 ;27,44 ;41,58 ;41,65 ;41,65 ;43,70 ;43,73 ;55,22 ;63,01 ;77,34 ;78,14 ;78,14 ;84,14 ;84,17 ;84,20 ;84,29 ;86,16 ;100,00
0,00 ;0,00 ;0,05 ;0,19 ;0,38 ;0,48 ;0,48 ;0,48 ;0,53 ;0,53 ;0,67 ;0,82 ;0,82 ;0,82 ;0,87 ;1,30 ;1,68 ;2,64 ;2,69 ;2,69 ;2,93 ;2,93 ;3,89 ;4,47 ;4,76 ;4,81 ;4,81 ;5,14 ;5,14 ;5,14 ;5,14 ;5,24 ;100,00
15,58 ;15,59 ;33,17 ;33,23 ;33,47 ;52,96 ;52,97 ;53,00 ;53,01 ;53,01 ;53,11 ;74,06 ;74,09 ;74,12 ;74,12 ;76,29 ;76,33 ;76,41 ;85,59 ;85,62 ;85,63 ;85,63 ;94,45 ;94,67 ;94,69 ;99,64 ;99,66 ;99,67 ;99,68 ;99,68 ;99,80 ;99,80 ;100,00
20,05 ;20,06 ;20,06 ;31,15 ;31,16 ;40,20 ;40,20 ;40,21 ;40,22 ;40,22 ;52,30 ;69,54 ;69,55 ;69,55 ;69,83 ;71,19 ;71,20 ;71,38 ;92,35 ;92,48 ;92,48 ;92,88 ;96,57 ;96,60 ;96,83 ;99,79 ;99,79 ;99,79 ;99,80 ;99,80 ;99,83 ;99,84 ;100,00
12,40 ;12,41 ;12,44 ;12,46 ;14,76 ;37,68 ;37,70 ;37,81 ;37,84 ;37,95 ;38,08 ;67,08 ;67,15 ;67,17 ;67,17 ;67,25 ;67,32 ;67,36 ;90,91 ;91,02 ;91,03 ;91,03 ;94,42 ;94,61 ;94,66 ;98,67 ;98,68 ;98,71 ;98,76 ;98,76 ;98,87 ;98,88 ;100,00
0,85 ;0,85 ;3,08 ;5,42 ;7,40 ;7,70 ;7,70 ;7,70 ;8,38 ;11,88 ;11,96 ;13,46 ;13,46 ;13,46 ;13,50 ;17,93 ;21,73 ;32,32 ;33,11 ;33,11 ;34,05 ;34,23 ;56,96 ;64,81 ;71,18 ;71,63 ;71,63 ;73,56 ;73,59 ;73,69 ;73,77 ;74,70 ;100,00
0,43 ;0,43 ;0,43 ;3,48 ;4,78 ;5,22 ;5,22 ;5,22 ;5,22 ;10,43 ;10,43 ;10,87 ;10,87 ;10,87 ;10,87 ;13,91 ;20,43 ;26,09 ;26,96 ;26,96 ;27,39 ;28,26 ;53,48 ;57,39 ;63,48 ;63,48 ;63,48 ;67,83 ;67,83 ;67,83 ;67,83 ;67,83 ;100,00
1,26 ;1,26 ;2,23 ;7,25 ;10,46 ;18,41 ;18,41 ;18,55 ;19,11 ;21,62 ;21,62 ;22,18 ;22,18 ;22,87 ;22,87 ;27,75 ;31,66 ;34,87 ;36,26 ;36,26 ;38,63 ;39,19 ;47,56 ;54,25 ;60,67 ;60,67 ;60,67 ;63,60 ;63,60 ;63,60 ;63,60 ;64,16 ;100,00
13,94 ;13,96 ;13,97 ;13,97 ;13,98 ;26,27 ;26,28 ;26,31 ;38,15 ;38,21 ;38,21 ;66,04 ;66,07 ;66,07 ;66,09 ;69,15 ;69,18 ;69,19 ;84,76 ;84,80 ;84,80 ;84,80 ;94,47 ;94,52 ;94,92 ;99,57 ;99,58 ;99,58 ;99,58 ;99,58 ;99,59 ;99,59 ;100,00
11,66 ;11,67 ;11,69 ;11,70 ;11,75 ;22,82 ;22,83 ;22,85 ;22,88 ;34,63 ;39,19 ;59,77 ;59,79 ;59,79 ;59,81 ;69,67 ;70,01 ;76,13 ;83,55 ;83,64 ;83,65 ;83,65 ;93,15 ;93,27 ;93,34 ;99,09 ;99,09 ;99,10 ;99,12 ;99,12 ;99,15 ;99,17 ;100,00
5,37 ;5,39 ;5,48 ;5,52 ;5,58 ;46,49 ;46,55 ;46,84 ;46,86 ;46,89 ;47,78 ;90,17 ;90,23 ;90,27 ;90,31 ;90,63 ;91,03 ;91,34 ;93,53 ;93,54 ;93,55 ;93,55 ;94,13 ;94,24 ;94,65 ;95,71 ;95,73 ;96,35 ;96,49 ;96,61 ;96,90 ;96,92 ;100,00
10,49 ;10,50 ;11,49 ;20,64 ;22,78 ;26,17 ;26,18 ;26,19 ;27,79 ;29,98 ;30,02 ;30,21 ;30,21 ;30,22 ;30,26 ;33,97 ;38,92 ;51,22 ;56,55 ;56,65 ;58,03 ;58,13 ;61,20 ;68,56 ;73,75 ;74,68 ;74,69 ;77,28 ;77,28 ;77,30 ;77,31 ;79,80 ;100,00
7,31 ;7,31 ;7,31 ;8,33 ;9,18 ;11,90 ;11,90 ;11,90 ;12,07 ;12,07 ;15,99 ;16,33 ;18,71 ;18,71 ;18,71 ;19,22 ;20,41 ;23,64 ;27,55 ;27,55 ;27,89 ;27,89 ;30,95 ;32,82 ;34,52 ;34,52 ;34,52 ;36,56 ;36,56 ;36,73 ;36,73 ;36,90 ;100,00
28,89 ;29,22 ;29,22 ;29,55 ;29,77 ;41,12 ;41,35 ;41,79 ;41,90 ;42,12 ;42,67 ;53,36 ;53,36 ;53,69 ;55,46 ;55,57 ;55,79 ;56,01 ;77,62 ;77,62 ;77,73 ;77,73 ;78,17 ;78,17 ;78,50 ;93,27 ;93,38 ;93,38 ;93,38 ;93,38 ;93,72 ;93,72 ;100,00
17,21 ;17,25 ;17,72 ;17,72 ;17,91 ;37,20 ;37,20 ;37,20 ;37,48 ;37,87 ;40,96 ;56,37 ;56,37 ;56,72 ;58,57 ;61,54 ;62,37 ;63,47 ;70,40 ;70,44 ;70,48 ;70,48 ;73,30 ;77,34 ;78,52 ;82,24 ;82,24 ;82,40 ;82,95 ;82,95 ;84,99 ;85,03 ;100,00
19,41 ;19,42 ;19,73 ;21,00 ;21,80 ;37,72 ;37,74 ;37,77 ;38,19 ;38,93 ;38,96 ;65,82 ;65,85 ;65,86 ;65,91 ;77,41 ;78,47 ;78,55 ;89,15 ;89,32 ;89,97 ;89,98 ;90,01 ;90,62 ;93,89 ;97,63 ;97,64 ;98,37 ;98,39 ;98,41 ;98,54 ;99,14 ;100,00
16,41 ;16,43 ;20,93 ;20,98 ;20,99 ;37,85 ;37,86 ;37,92 ;37,94 ;37,94 ;37,95 ;53,24 ;53,25 ;53,26 ;53,27 ;53,31 ;62,16 ;62,30 ;87,56 ;87,62 ;96,09 ;96,10 ;96,13 ;96,20 ;96,23 ;99,11 ;99,12 ;99,15 ;99,16 ;99,16 ;99,20 ;99,21 ;100,00
11,80 ;11,81 ;11,85 ;17,09 ;28,17 ;38,49 ;38,50 ;38,52 ;40,57 ;44,29 ;44,32 ;54,62 ;54,64 ;54,66 ;54,73 ;54,76 ;54,79 ;58,97 ;74,83 ;74,94 ;74,96 ;75,27 ;75,31 ;78,39 ;93,95 ;95,38 ;95,38 ;96,50 ;96,51 ;96,52 ;96,58 ;98,66 ;100,00
0,25 ;0,25 ;1,12 ;4,51 ;6,15 ;6,40 ;6,40 ;6,40 ;7,60 ;10,82 ;10,88 ;11,67 ;11,67 ;11,68 ;11,73 ;21,15 ;25,59 ;39,97 ;40,21 ;40,21 ;42,70 ;42,76 ;52,87 ;59,01 ;62,75 ;63,04 ;63,04 ;64,87 ;64,95 ;65,00 ;65,04 ;65,51 ;100,00
0,00 ;0,00 ;0,00 ;0,03 ;0,03 ;0,03 ;0,03 ;0,03 ;0,06 ;0,19 ;0,19 ;0,19 ;0,19 ;0,22 ;0,22 ;0,32 ;0,41 ;0,82 ;0,82 ;0,82 ;0,85 ;0,85 ;1,07 ;1,23 ;1,26 ;1,26 ;1,26 ;1,36 ;1,36 ;1,36 ;1,36 ;1,36 ;100,00
17,89 ;17,90 ;17,91 ;17,92 ;17,93 ;34,97 ;34,97 ;35,00 ;35,04 ;35,05 ;35,30 ;51,33 ;51,36 ;51,36 ;51,37 ;55,18 ;55,19 ;55,39 ;69,03 ;69,09 ;76,20 ;76,20 ;93,40 ;94,35 ;94,83 ;99,70 ;99,70 ;99,70 ;99,70 ;99,70 ;99,74 ;99,76 ;100,00
0,23 ;0,23 ;0,26 ;0,28 ;0,28 ;0,35 ;0,35 ;0,35 ;0,35 ;0,35 ;0,35 ;0,42 ;0,42 ;0,42 ;0,42 ;0,42 ;0,44 ;0,44 ;0,54 ;0,54 ;0,54 ;0,82 ;0,82 ;0,82 ;0,82 ;99,46 ;99,46 ;99,53 ;99,63 ;99,63 ;99,63 ;99,65 ;100,00
19,79 ;20,25 ;21,13 ;23,07 ;24,58 ;45,93 ;45,94 ;45,98 ;46,29 ;47,71 ;47,74 ;68,82 ;68,85 ;68,86 ;68,91 ;70,87 ;73,16 ;74,66 ;87,35 ;87,81 ;88,37 ;88,40 ;91,12 ;93,13 ;95,82 ;97,76 ;97,76 ;98,61 ;98,63 ;98,64 ;98,72 ;99,11 ;100,00
6,48 ;6,48 ;8,02 ;19,02 ;19,36 ;29,80 ;29,80 ;29,82 ;31,48 ;32,48 ;32,76 ;46,41 ;46,43 ;46,43 ;46,53 ;47,02 ;49,37 ;49,53 ;56,00 ;56,04 ;61,57 ;61,86 ;61,96 ;74,49 ;94,32 ;97,10 ;97,11 ;98,11 ;98,15 ;98,15 ;98,19 ;98,19 ;100,00
17,69 ;18,00 ;18,02 ;18,06 ;18,08 ;40,80 ;40,81 ;40,84 ;40,85 ;40,86 ;41,16 ;62,14 ;62,17 ;62,18 ;62,18 ;62,25 ;62,32 ;62,36 ;75,18 ;75,33 ;75,34 ;75,34 ;86,28 ;86,40 ;95,47 ;99,20 ;99,20 ;99,21 ;99,23 ;99,23 ;99,28 ;99,34 ;100,00
7,11 ;7,12 ;10,16 ;15,59 ;19,75 ;22,69 ;22,69 ;22,71 ;24,59 ;28,73 ;28,82 ;35,12 ;35,18 ;35,22 ;35,31 ;43,37 ;48,42 ;56,16 ;59,04 ;59,07 ;62,61 ;62,62 ;78,72 ;86,78 ;96,83 ;96,96 ;96,96 ;97,50 ;97,51 ;97,68 ;97,72 ;99,20 ;100,00
0,76 ;0,76 ;1,53 ;2,29 ;3,05 ;3,82 ;3,82 ;3,82 ;5,34 ;5,34 ;6,11 ;7,63 ;7,63 ;7,63 ;7,63 ;9,92 ;19,85 ;29,77 ;29,77 ;29,77 ;30,53 ;30,53 ;40,46 ;41,98 ;51,15 ;51,15 ;51,15 ;52,67 ;53,44 ;53,44 ;53,44 ;53,44 ;100,00
38,44 ;38,44 ;38,45 ;38,46 ;38,47 ;58,03 ;58,03 ;58,06 ;58,06 ;58,06 ;58,30 ;81,14 ;81,16 ;81,17 ;81,17 ;81,19 ;81,20 ;81,26 ;94,63 ;94,70 ;94,70 ;94,70 ;95,78 ;95,82 ;95,83 ;96,66 ;96,66 ;99,58 ;99,59 ;99,63 ;99,66 ;99,66 ;100,00
25,50 ;25,58 ;26,25 ;26,77 ;27,22 ;45,41 ;45,41 ;45,49 ;45,71 ;45,94 ;49,66 ;66,52 ;66,52 ;66,52 ;67,41 ;70,10 ;70,54 ;74,20 ;84,56 ;84,56 ;84,64 ;84,79 ;86,58 ;89,04 ;89,49 ;90,90 ;90,90 ;90,98 ;91,50 ;91,50 ;92,92 ;92,92 ;100,00
9,00 ;9,27 ;9,27 ;11,21 ;11,30 ;24,62 ;24,71 ;24,80 ;24,98 ;24,98 ;28,24 ;45,72 ;45,72 ;45,72 ;45,72 ;46,43 ;46,87 ;47,04 ;52,43 ;52,52 ;54,63 ;54,81 ;54,99 ;55,25 ;63,55 ;64,34 ;64,34 ;67,87 ;68,40 ;74,49 ;75,11 ;75,11 ;100,00
9,63 ;9,73 ;11,48 ;13,54 ;15,75 ;21,46 ;21,51 ;21,61 ;21,87 ;22,52 ;22,82 ;23,42 ;23,42 ;23,47 ;23,77 ;27,73 ;30,84 ;35,06 ;39,02 ;39,02 ;40,82 ;40,87 ;43,13 ;48,90 ;50,55 ;51,81 ;51,86 ;52,26 ;52,91 ;53,11 ;53,71 ;53,76 ;100,00
26,65 ;26,66 ;26,69 ;26,69 ;26,73 ;35,10 ;35,10 ;35,11 ;35,11 ;35,12 ;35,14 ;60,43 ;60,44 ;60,45 ;60,49 ;60,52 ;60,53 ;60,57 ;65,52 ;65,83 ;65,85 ;65,85 ;65,86 ;65,89 ;65,91 ;67,01 ;67,02 ;67,02 ;67,02 ;67,02 ;67,03 ;99,53 ;100,00
8,50 ;8,51 ;11,10 ;18,58 ;23,15 ;25,99 ;25,99 ;26,01 ;29,24 ;32,14 ;32,52 ;41,51 ;41,53 ;41,69 ;41,91 ;44,50 ;49,87 ;51,56 ;54,01 ;54,01 ;62,79 ;63,15 ;72,98 ;90,46 ;96,20 ;97,02 ;97,02 ;99,43 ;99,59 ;99,65 ;99,69 ;100,00 ;100,00

axpgn
Meglio i dati grezzi, son più preziosi ... :-D ... io me li terrei stretti ... :-)

Comunque "sturei" mi piace ... :lol:

archistico
Grazie ancora a tutti per l'aiuto prezioso
Emilie

apatriarca
È a volte utile, anche se non è forse questo il caso, aggiustare le probabilità in modo da non avere probabilità nulle. Supponi ad esempio di voler calcolare la probabilità di alcune parole e di avere alcune parole valide anche se molto strane (magari sono di provenienza straniera). In questo caso potresti trovarti probabilità nulle, anche se la parola è valida. Una possibile soluzione (ma ce ne sono diverse più o meno complicate) è di scegliere un valore \(k\) e supporre che ogni combinazione sia comparsa almeno \(k\) volte. Ovviamente non è una soluzione per generare parole più "sensate". Per averle più sensate dovresti però a questo punto aggiungere ulteriori regole (per esempio che nessuna lettera può comparire più di due volte di seguito) oppure considerare più di una lettera precedente per calcolare le probabilità.

archistico
@apatriarca Sì, sto cercando di valutare quale sia il modo migliore per implementare nuove regole.
Le possibilità sono:
- fare una tabella di probabilità a due lettere assieme, invece che a una sola come ora (es. prob. che "la" sia seguito da "to"),
- oppure invece che una sola lettera siano due le seguenti (es. prob. che "z" sia seguita da "io"),
- usare le sillabe.

Consigliate altro?

apatriarca
La soluzione più semplice a mio parere è quella di sostituire la probabilità condizionata \( P(s_i | s_{i-1}) \) con \( P(s_i | s_{i-2}\,s_{i-1} ). \) Considerare quindi due lettere precedenti al posto di una sola. Qualsiasi metodo sceglierai ci saranno comunque parole che sono in qualche modo impossibili. Che cosa stai cercando di fare esattamente? A cosa ti servono queste probabilità?

archistico
Mi sto convincendo sempre di più che sia la soluzione ottimale.
L'obiettivo di tutto ciò, sperando che non mi prendiate per matta, è per puro sfizio personale. Sto cercando di farmi delle password pronunciabili e soprattutto memorizzabili, almeno nella parte testuale che viene poi "condita" con numeri, caratteri speciali e maiuscole.
Mi ero già fatta qualcosa di simile in passato (sequenze casuali tipo: Rz8/Dx7!Qb3#Wt1( ) ma se poi devo segnarle da qualche parte perdono un po' la loro funzione...

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.