2010-02-06 18 views
8

Sto cercando la direzione e il tentativo di etichetta questo problema:Costruire un motore di inferenza in Python

Sto tentando di costruire un semplice motore di inferenza (c'è un nome migliore?) In Python che avrà una stringa e -

1 - creare una lista di token con la semplice creazione di un elenco di spazio bianco separati valori

2 - classificare questi token, utilizzando le espressioni regolari

3 - utilizzare ah igher livello di insieme di regole per prendere decisioni basate sulle categorizzazioni

Esempio:

"90001" - un gettone partite la regex codice postale, esiste una regola per una stringa contenente solo un codice postale provoca un certo comportamento a verificarsi

"30 + 14" - tre gettoni, regexs per il valore numerico e operatori matematici partita, esiste una regola per un valore numerico seguito da un operatore matematico seguito da un altro valore numerico provoca un certo comportamento si verifichi

Sono alle prese con il modo migliore per eseguire il passaggio n. 3, il livello più alto di regole. Sono sicuro che qualche framework deve esistere. Qualche idea? Inoltre, come descriveresti questo problema? Sistema basato su regole, sistema esperto, motore di inferenza, qualcos'altro?

Grazie!

+1

1-3 mi sembra un parser piuttosto che un motore di inferenza. # 1 + # 2 = tokenize # 3 = parse Quindi presumibilmente # 4 = agire sul risultato del parser. Scopri pyparsing. –

risposta

6

Sono molto sorpreso del fatto che passo # 3 è quello che vi guai ...

Supponendo che si può etichettare/classificare correttamente ogni token (e che prima di categorizzazione si possono trovare i gettoni corretto, in quanto non vi possono essere molti casi ambigui ...), il problema "Passo 3" sembra uno che potrebbe facilmente essere affrontato con una grammatica context free in cui ciascuna delle azioni desiderate (come la ricerca del codice ZIP o calcolo di espressioni matematiche ...) sarebbero simboli con la loro regola di produzione stessa fatta delle possibili categorie di token. Per illustrare questo in notazione BNF, potremmo avere qualcosa di simile

<SimpleMathOperation> ::= <NumericalValue><Operator><NumericalValue> 

Forse la vostra preoccupazione è che quando le cose si complicano, diventerà difficile esprimere tutto il fabbisogno in termini di regole non in conflitto di grammatica. O forse la tua preoccupazione è che si possano aggiungere regole dinamicamente, quindi forzare la logica di "compilazione" grammatica da integrare con il programma? Qualunque sia la preoccupazione, penso che questa terza fase sarà relativamente banale.

D'altra parte, ea meno che le varie categorie (e il testo di input sottostante) siano tali da poter essere descritti anche con una lingua normale (come sembra suggerire nella domanda), un parser e un classificatore di testo (Steps # 1 and # 2 ...) è in genere un affare meno che banale ..

Alcune librerie esempio Python che semplificano la scrittura e la valutazione delle grammatiche:

+0

Grazie per il puntatore al pyparsing. Un CFG è la strada da percorrere. – Art

+0

@Art, il credito per le librerie di parsing va a Max S, che ha gentilmente e opportunamente modificato la risposta. Proverò a sviare alcune delle sue risposte per "mostrarlo" ;-) – mjv

2

Sembra che si cerca "grammatica inferenza" (induzione grammatica) biblioteca.