Flying memes

Ruby linguistic, Wordnet e LinkParser su Snow Leopard

Update, 05/02/10: Ecco il link alle slide della presentazione! Ringrazio tutti i partecipanti alla bellissima serata!

Il prossimo giovedì (4 febbraio 2010) terrò un Lightning Talk al Ruby Social Club su alcuni strumenti interessanti che orbitano attorno al concetto di Natural Language Generation/Parsing. In particolare vedremo due librerie che consentono di interfacciarsi con  WordNet e Link-Grammar.

Non voglio svelare nulla dello speech in questo post (anche se sicuramente venerdi farò un update allegando le slide della presentazione) ma solamente fornire a coloro che lo ritengano utile le istruzioni su come installare tali librerie sul proprio Mac.

WordNet

Update, 05/02/10: mi segnalano Words, un wrapper analogo a quello che presento nelle prossime righe ma decisamente più aggiornato, it worths a look.

Partiamo da WordNet; la prima cosa da fare è installare la gemma BerkleyDB, il che comporta in primis l’installazione dello stesso BDB, quindi il primo comando è:

sudo port install db47

Fatto questo scarichiamo la versione vecchia della gemma BDB (quella su GitHub non va bene, hanno cambiato i nomi alle costanti), decomprimiamola e modifichiamo la chiamata alla funzione ‘have_library’ nel file src/extconf.rb (riga 72 e riga 79) come segue:

have_library("db-#{with_ver}", db_version)

lanciamo infine la compilazione e l’installazione della libreria con i comandi (da eseguire all’interno della cartella di BDB):

sudo env ARCHFLAGS="-arch x86_64" ruby extconf.rb  -- --with-db-include=/opt/local/include/db46 --with-db-lib=/opt/local/lib/db46 --with-db-version=4.6
make
sudo make install

Ok, ora installiamo la gemma di wordnet:

sudo gem install wordnet

modifichiamo quindi il file ‘lib/wordnet/lexicon.rb’ all’interno della gemma impostando alla riga 68 un path assoluto come ad esempio:

DEFAULT_DB_ENV = File::join( '/Library/Ruby/Gems/1.8/gems/wordnet-0.0.5/ruby-wordnet' )

A questo punto non ci resta che scaricare e convertire il database di wordnet nel formato BDB richiesto dalla gemma, per fare questo recuperiamo l’ultima versione di wordnet disponibile e decomprimiamola. Poi eseguiamo da linea di comando lo script presente nella cartella della gemma ‘convertdb.db’ e, quando ci viene chiesto, inseriamo il percorso assoluto alla cartella ‘dict’ all’interno dell’archivio di wordnet appena decompresso.
Testiamo il funzionamento del tutto eseguendo questo semplice script:

require 'rubygems'
require 'wordnet'
include WordNet::Constants

lex     = WordNet::Lexicon::new
origins = lex.lookup_synsets( "house", Noun )
puts "#{(o=origins.first).words}: #{o.lex_info}"
[:meronyms,:hypernyms,:derivations,:hyponyms].each do |m|
  puts "#{m}: #{o.send(m).map{|s| s.words}.flatten.uniq.join(",")}"
end

Link Grammar

Installiamo link grammar usando i MacPort:

sudo port install link-grammar

quindi scarichiamo il sorgente della gemma che fungerà da wrapper e decomprimiamolo in una cartella a nostro piacimento. Dall’interno di questa cartella compiliamo ed installiamo la gemma con questi comandi:

ARCHFLAGS="-arch x86_64" rake --  --with-link-grammar-include=/opt/local/include/link-grammar --with-link-grammar-lib=/opt/local/lib
sudo rake install

Testiamo anche questa installazione eseguendo questo piccolo script:

require 'rubygems'
require 'linkparser'

dict = LinkParser::Dictionary.new('en')
sent = dict.parse( "People use Ruby for all kinds of nifty things." )

puts sent.subject
puts sent.verb
puts sent.object

Linguistic

Questa gemma funziona un pò da meta-wrapper raggruppando le funzionalità delle due gemme finora installate in un unico e omogeneo set di API. Installiamola con rubygems:

sudo gem install linguistics

quindi modifichiamo il file ‘lib/linguistics/en/linkparser.rb’ all’interno della cartella dove risiede la gemma sistemando la riga 90 come segue:

return @lp_dict ||= LinkParser::Dictionary.new('en', :verbosity => 0 )

Eseguiamo quindi un piccolo script di prova per sancirne la riuscita installazione:

require 'rubygems'
require 'linguistics'

Linguistics::use( :en )
frase = "the cat chased a snake"

puts <<-EOS
  Sogg:        #{frase.en.sentence.subject}
  Verbo:       #{frase.en.sentence.verb}
  Comp.ogg:    #{frase.en.sentence.object}
  Verbo (inf): #{frase.en.sentence.verb.en.infinitive}
EOS

Tags: , , , , ,