Flying memes

Abacus, Pierre Hérigone e la mnemotecnica

Ho recentemente acquistato un libro che mi stà regalando una serie di spunti per interessanti approfondimenti e delle simpatiche occasioni per scrivere due righe di codice. Il libro in questione si chiama “Enigmi e giochi matematici” di Martin Gardner e raccoglie gli articoli che lo stesso Martin pubblicò negli anni sulla rivista Scientific American.

Il capitolo numero 11 tratta di mnemotecnica, la disciplina che studia il modo di memorizzare lunghe sequenze di numeri, e tratta del metodo di Pierre Hérigone, che può essere riassunto nel seguente modo:

  1. Associa le cifre del numero che vuoi memorizzare a delle consonanti secondo una tabella nota; ad esempio la temperatura di ebollizione del mercurio, 357°C, diverrebbe mlk;
  2. Trova una parola che contenga quelle consonanti in quell’ordine (senza altre ‘consonanti di disturbo in mezzo’); ad esempio per mlk andrebbe benissimo milk, mentre non andrebbe bene multik;
  3. Associa la parola appena trovata ad una frase che in qualche modo leghi con il significato originario della cifra, possibilmente in modo che la frase risultante contenga uno stimolo visuale; ad esempio si può immaginare un allevatore stupito dal fatto che le sue mucche producano mercurio invece che latte.
  4. Se la cifra dovesse essere molto lunga utilizza una sequenza di più parole seguendo lo schema appena descritto.

Nel tempo libero stò cercando di trasporre questi quattro semplici passaggi all’interno di una gemma: abacus, della quale ho rilasciato giusto oggi la versione 0.0.1; vediamo come si usa:

>> require 'abacus'
=> true
>> include Abacus
=> Object
>> number = HerigoneNumber.find_by_number(357)
=> #<Abacus::HerigoneNumber id: 19081, system: "default", number: 357>
>> number.article_keys.map{|article_key| article_key.the_key}
=> ["hemlock", "milk", "milky"]

Per poter funzionare Abacus utilizza un database sqllite che crea all’interno della cartella home dell’utente (il percorso in realtà è configurabile, ma per questi dettagli vi rimando alle note di installazione su github) e nel quale struttura il/i dizionari di riferimento.

Abacus implementa un parser (molto base ad oggi) XDXF, un formato open per la memorizzazione di dizionari: esistono già parecchie opere convertite più o meno bene in questo formato che possono essere scaricate gratuitamente, io ad esempio ho utilizzato questo dizionario base di inglese:

# da shell:
sudo gem install abacus
wget http://downloads.sourceforge.net/xdxf/comn_sdict05_eng_eng_main.tar.bz2
tar -xjvf comn_sdict05_eng_eng_main.tar.bz2
abacus db:create
abacus db:xdxf:import  eng_eng_main/dict.xdxf
abacus db:herigone:generate

La sfida più interessante di questo piccolo progetto è stata mantenere delle performances adeguate durante la sessione di traduzione numero -> parola, per fare questo in fase di import (con il comando db:herigone:generate) la gemma traduce ogni lemma del dizionario nel suo corrispettivo numerico rendendo la fase di ricerca una semplice SELECT su di un campo indicizzato.

In futuro vorrei estendere questo piccolo progetto aggiungendo due funzionalità di aggregazione semantica: in caso di sequenze di cifre lunghe mi piacerebbe infatti includere un generatore di linguaggio naturale con l’obiettivo creare una frase che almento nell’apparenza manifesti una certa correttezza (sarebbe bellissimo tradurre le prima 1000 cifre del PI in uno strampalato poema no?). Sarebbe inoltre interessante utilizzare wordnet per ridurre la variabilità semantica delle singole parole trovate a quanto di più vicino ad una parola che serva da ‘rappresentante logico’ per la cifra in ingresso (ad esempio per 357 il rappresentante logico sarebbe ‘mercurio’).

Nel frattempo, per chiunque fosse interessato, i sorgenti della gemma sono disponibili sul mio account di GitHub.

Tags: , ,