SOFTWARE > Linguaggi di programmazione e scripting

Analisi (e interpretazione) testuale?

<< < (2/3) > >>

AmigaCori:

--- Citazione da: cdimauro - 20 Marzo 2013, 08:44:23 ---Natural Language Toolkit

--- Termina citazione ---

Lo sai che recentemente stavo leggendo un articolo su una pubblicazione di Robotica ed ho trovato: http://ltlmop.github.com/ "...an open source, modular, Python-based toolkit..." e ricordavo che "da qualche parte" avevo letto di questa cosa :D ...ora ho ritrovato questo tuo messaggio!

cdimauro:
Conquisteremo il mondo. 8)

Using Python to Code by Voice

Allanon:
Eccomi qua a scrivere nuovamente su questa roba :)

Sto leggendo con molta attenzione il libro riguardante il NLTK creato per python, come segnalato da Cesare (grazie!), poi mi sono scaricato il NLTK con le dipendenze trovando grosse difficoltà a configurare il tutto con la versione 3 del pitone... e infatti, per adesso, ho abbandonato.
Però il libro è preziosissimo e mi sta aiutando molto a chiarire alcuni dubbi ed a continuare con il lavoro che avevo iniziato :)

Dico subito che il primo tentativo (che poi sarebbe il secondo) è stato abbandonato ed ho iniziato un nuovo progetto ma sempre basato sulla medesima idea di rete di informazioni. Sono inoltre passato ad una programmazione completamente ad oggetti per poter ampliare/modificare/gestire meglio questo mostro meccanico che sto tirando su...

Le volte precedenti avevo trascurato (per semplicità) un elemento fondamentale di tutto questo carrozzone, ossia l'ambiguità di determinate parole (e frasi) e la relativa disambiguazione che spero di risolvere in questa nuova versione combinando due sistemi.
Il primo, più esplicito, prevede la definizione di uno o più contesti per una determinata parola, mentre il secondo prevede la determinazione del contesto in base ad uno o più pattern di utilizzo all'interno delle frasi.
Il contesto potrà essere quindi definito analizzando la frase in cui la parola appare (estraendo un pattern di utilizzo e memorizzandolo) e/o incrociandolo con i contesti definiti esplicitamente (o ricavati da altre analisi del testo).

Sono ancora in fase di progettazione delle struture che dovranno smazzarsi tutta questa bella roba e volevo esporre quello che ho fatto per poterne discutere :P mi piacerebbe che oltre che essere utilizzabile sia anche semplice da gestire,

Tutto si basa su una classe che ho chiamato knowledge_base che per adesso presenta i seguenti metodi:


--- Codice: ---DICHIARAZIONE DI UNA NUOVA KNOLEDGE_BASE
local kb = knowledge_base()

SALVATAGGIO DELLA KNOLEDGE_BASE
kb:save(filename)

CARICAMENTO DI UNA KNOLEDGE_BASE SALVATA
kb:load(filename)

--- Termina codice ---

Internamente una knowledge_base non è altro che una tabella con la seguente struttura:

--- Codice: ---kb =
{
   db =
   {
      words = { }
   }
}

--- Termina codice ---

Tutte le parole, indistintamente, saranno memorizzate nella sottotabella words indicizzata a più livelli con il seguente schema:

--- Codice: ----- scorciatoia alla tabella words
local words = knowledge_base.db.words

words[iParola][iContesto][iTipo] = RecordDettagli

--- Termina codice ---

Dove:

* iParola -> Indice stringa che rappresenta la parola da memorizzare (per avere un accesso diretto durante le ricerche)
* iContesto -> Indice stringa che rappresenta il contesto in cui la parola è utilizzata
* iTipo -> Indice stringa che rappresenta il tipo di parola in oggetto (verbo, nome, aggettivo, pronome, ecc...)
RecordDettaglio è un oggetto che descrive l'informazione della parola e varia a seconda del tipo di parola, per adesso sto lavorando ai nomi e questo è una bozza dell'oggetto <noun> che andrò ad implementare:


--- Codice: ----- DETTAGLIO PER I NOMI
RecordDettaglio =
{
    sex =
   {  -- definizione del 'sesso' della parola, <true> è impostato in corrispondenza della forma
      -- corrente della parola, <false> viene usato se una forma non esiste, <noun> è una
      -- stringa che rimanda al nome nella forma corrispondente.
      smale = true | false | noun,
      sfemale = true | false | noun,
      pmale = true | false | noun,
      pfemale = true | false | noun
   },

   -- tabella contenente una serie di oggetti synonym (sinonimi)
   synonyms = {}, 

   -- tabella di oggetti opposite (contrari)
   opposites = {},

   -- tabella dei proprietari (non saprei come definirlo, sono ignurante :) ), partOf
   -- ossia di tutti i nomi di cui fa parte (es.: ruota -> partOf -> automobile, camion, motorino, ...)
   partOf = {},

   -- tabella delle parti (owners), ossia contiene tutte le parti che lo compongono
   -- (es.: automobile -> owns -> ruota, sedile, volante, ...), terrà conto anche della quantità compresi
   -- valori indefiniti (molto, poco, alcuni, ecc...)
   owners = {},

   -- tabella dei gruppi (memberOf), contiene i gruppi di cui fa parte la parola
   -- (es.: gatto -> memberOf -> mammiferi, felini, ... )
   membersOf = {},

   -- tabella dei membri di un gruppo rappresentato dalla parola
   -- (es.: mammifero -> groups -> gatto, delfino, cane, ...)
   groups = {},

   -- tabella delle proprietà (aggettivi) tipiche di questo nome
   -- (es.: cane -> properties -> peloso, domestico, ecc...)
   properties = {},

   -- tabella degli stati tipici di questo nome
   -- (** da sviluppare **)
   states = {},

   -- tabella delle locazioni tipici per questo nome
   -- (es.: sardina -> locations -> mare, oceano, ...), saranno previste modalità per memorizzare
   -- luoghi indefiniti.
   locations = {},

   -- tabella dei tempi associabili a questo nome
   -- (** da sviluppare **)
   timings = {},

   -- tabella delle azioni tipiche associabili al nome
   -- sono distinte in azioni passive e attive.
   -- (es.: Il pesce nuota = pesce -> active-action -> nuotare,
   -- (Il pesce viene pescato = pesce -> passive-action -> pescare)
   actions =
   {
      active = {},
      passive = {}
   },

   -- patterns di frasi tipiche utilizzate con il nome in oggetto.
   -- Esisteranno dei pattern generici per i nomi, ma questi qua
   -- dovrebbero servire ad aiutare con utilizzi figurati e frasi tipo:
   -- parola = fiasco -> Ho fatto fiasco -> pattern = [SUBJECT][VERB]fiasco
   -- che in realtà significa 'ho fallito'.
   -- ** per ora è solo un'idea da sviluppare **
   patterns = {}
}

--- Termina codice ---

Un nome si aggiunge alla knowledge_base con:

--- Codice: ---kb:noun(name, context, data)

--- Termina codice ---

Rimane in atto il meccanismo della forza dei link delle relazioni, e dell'indebolimento automatico delle relazioni inverse. In questo modo, dopo aver inserito una certa quantità di informazioni, dovrei avere un buon grado di verità anche in presenza di informazioni singole errate.

Per ora stop. Ditemi pure che sono pazzo :P

cdimauro:
Dovresti provare con Python 2.7. Io il 3 per adesso non lo uso, proprio perché ci sono problemi di compatibilità con vecchi package/moduli.

Allanon:
Sicuramente ci proverò per approfondire l'argomento :)

Navigazione

[0] Indice dei post

[#] Pagina successiva

[*] Pagina precedente

Vai alla versione completa