Come tradurre le formule in una forma di linguaggio naturale?

3

Recentemente sto lavorando a un progetto che mira a valutare se un'app Android si blocca o meno. Il processo di valutazione è

  1.Collect the logs(which record the execution process of an app).
  2.Generate formulas to predict the result
    (formulas is generated by GP)
  3.Evaluate the logs by formulas 


Ora posso produrre formule, ma per comodità per gli utenti, voglio tradurre le formule in una forma di linguaggio naturale e dire agli utenti perché si è verificato un arresto anomalo. (Penso che assomigli a "elaborazione inversa del linguaggio naturale".)

Per spiegare l'idea in modo più chiaro, immagina di avere una formula come questa:

  155 - count(onKeyDown) >= 148

È ovvio che if count (onKeyDown) > 7, il risultato di "155 - count (onKeyDown) > = 148" è falso, quindi il log contiene più di 7 eventi onKeyDown sarebbe "Failed" previsto.

Voglio mostrare agli utenti che se l'evento onKeyDown viene visualizzato più di 7 volte (155-148 = 7), questa app si arresta in modo anomalo.

Tuttavia, la formula reale è molto più complicata, come ad esempio:

  (< !( ( SUM( {Att[17]}, Event[5]) <= MAX( {Att[7]}, Att[0] >= Att[11]) OR SUM( {Att[17]}, Event[5]) > MIN( {Att[12]}, 734 > Att[19]) ) OR count(Event[5]) != 1 ) > (< count(Att[4] = Att[3]) >= count(702 != Att[8]) + 348 / SUM( {Att[13]}, 641 < Att[12]) mod 587 - SUM( {Att[13]}, Att[10] < Att[15]) mod MAX( {Att[13]}, Event[2]) + 384 > count(Event[10]) != 1))

Ho provato a implementare questa funzione con C ++, ma è piuttosto difficile, ecco lo snippet di codice Sto lavorando proprio ora.

Qualcuno sa come implementare rapidamente questa funzione? (forse con alcuni strumenti o risultati di ricerca?) Qualsiasi idea è benvenuta:)

Grazie in anticipo.

    
posta Po-Jen Lai 30.08.2012 - 09:35
fonte

2 risposte

3

Non sono sicuro che C ++ sia lo strumento ideale per questo progetto. Sembra molto simile a Programmazione logica . Un mio amico ha utilizzato Clojure integrato nel core.logic libreria (avevo precedentemente menzionato Frenchy64 , ma è qualcuno che usa core.logic aggiungere type-safety al clojure).

Questo sembra il tipo di problema che è stato risolto con la programmazione Funzionale o Lisp-ish, trasformando le istruzioni matematiche in codice. Questo non è un problema procedurale (come fare una lista di cose da fare). Potresti dare un'occhiata al Lisp o ai suoi derivati (Clojure, Haskell, Erlang, Scala, Schema, ecc.).

SICP è un'ottima risorsa di formazione per l'apprendimento della programmazione funzionale. Martin Odersky lo utilizza come base per il suo Functional Programming in Scala corso online gratuito che ha dato inizio a questo settimana. Suppongo però che Clojure sia più vicino alle tue esigenze. Vedrò se riesco a far commentare il mio amico.

    
risposta data 21.09.2012 - 15:25
fonte
2

Non sono sicuramente la persona migliore per rispondere a questa domanda, ma ci provo:

Quello che hai, in una certa misura, è un DSL: un linguaggio specifico del dominio. Tutte le formule che generi hanno una sintassi specifica e una grammatica, che è ciò che costituisce una lingua. È un linguaggio "specifico del dominio" perché ha specificamente a che fare con il dominio delle formule che crei.

Poiché le formule che hai menzionato sopra hanno una grammatica specifica, possono presumibilmente essere valutate per creare un "AST" o albero di sintassi astratto .

Potresti quindi fare quanto segue:

  1. Usa lex / yacc o bison scrivi a generatore di parser . Suggerirei antlr (basato su java), ma stai usando c ++.
  2. Scrivi il tuo codice C ++ che poi elabora l'AST / struttura fornita dal parser generato.

La pagina lex / yacc / flex / bison sopra dice:

A compiler or interpreter for a programming language is often decomposed into two parts:

  • Read the source program and discover its structure.
  • Process this structure, e.g. to generate the target program.

Lex and Yacc can generate program fragments that solve the first task.

Il "programma sorgente" in questo caso è ogni formula che valuti. La "struttura" è quindi l'AST o una struttura simile generata dal parser (generato). Quindi scrivi più codice per elaborare la struttura.

Amazon (o la tua fonte preferita di libri) avrà libri su questo, per non parlare di tutte le informazioni sugli internet.

Imparare a scrivere un generatore di parser è sfortunatamente non facile - ricordo solo vagamente parte della teoria dei miei giorni universitari. Tuttavia, ne vale davvero la pena, perché ci sono lotti di applicazioni per questo, anche nel tuo lavoro quotidiano. Le DSL stanno spuntando sempre più in molte situazioni diverse e essere in grado di lavorare con loro (o inventarle!) È un'abilità preziosa. (In breve, vorrei essere più bravo ..)

    
risposta data 21.09.2012 - 15:10
fonte

Leggi altre domande sui tag