Topic: parsing-by-example  (Letto 175 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline imbuto

  • python neanderthalensis
  • ****
  • Post: 466
  • Punti reputazione: 2
    • Mostra profilo
parsing-by-example
« il: Dicembre 18, 2020, 08:06 »
Buongiorno, sono di nuovo qui in cerca di suggerimenti!
Vorrei fare del parsing da semplice testo partendo da degli esempi e fornendo il risultato atteso, più o meno mi aspetterei un codice di questo tipo:

text = “La scimmia mangia una banana”
model = train(text, {‘arg1’: ‘La scimmia’, ‘arg2’: ‘una banana’})
text = “Un asino mangia la mela”
result = extract(text, model)
# {‘arg1’: ‘Un asino’, ‘arg2’: ‘la mela’}

L’obiettivo è quello di semplificare al massimo la definizione di un template (evitare l’uso di placeholders, o definire regex per estrarre le informazioni).
Conoscete qualche libreria che fa al caso?

Offline caronte

  • python erectus
  • ***
  • Post: 244
  • Punti reputazione: 0
    • Mostra profilo
Re:parsing-by-example
« Risposta #1 il: Dicembre 18, 2020, 20:27 »
no scusami,  mica mi e' tanto chiaro quello che vuoi fare, perche' dall'esempio che hai postato, ad un ipotetico modello da istruire tu gli passi un testo e un dizionario con 'cosa'??
'oggetti' da verificare nel testo passato?, cioe' che senso ha passare un dizionario in quella maniera? in quel caso lo istruiresti solo nel restituire quelle due 'values'' se presneti nel testo...mah...
alla fine che vuoi fare, da un testo vuoi estrarre 'soggetto' e 'complemento ogg'?? in quel caso hai bisogno di librerie come nltk, spacy, etc.....ma che contemplino un qualche POS tagger in maneira da fare il parsing che ti serve;
chiaramente le suddette nn so se abbaino all'oggi un tagger gia' istruito sull'italiano, nltk sicuramente no...spacy doversti indagare...se nn sbaglio qualche italico lo istrui' su "wiki news"  italiano...
in caso contrario doversti istruirtelo tu ma non e' una cosa immediata...diciamo

Offline imbuto

  • python neanderthalensis
  • ****
  • Post: 466
  • Punti reputazione: 2
    • Mostra profilo
Re:parsing-by-example
« Risposta #2 il: Dicembre 23, 2020, 19:19 »
Mi scuso per la domanda pressapochista e l’esempio improvvisato che forse ha generato ulteriore confusione... ho chiesto in fretta mentre pensavo a possibili soluzioni.
Il problema è il seguente: ho delle istruzioni descritte in semplice testo (in inglese - che eventualmente allarga le possibilità in termini di librerie) che voglio mappare a delle chiamate a funzione. Essenzialmente si tratta di riconoscere un template ed estrarre delle informazioni.
La base di partenza sono istruzioni del genere (fanno parte delle specifiche per dei test), dalla struttura abbastanza semplice e senza grossa variabilità (ma potrebbero esserci errori di battitura, etc. che al momento non considero):

Close the door
Check that the door is closed
Open the window
Check that the window is open
Close the window

Analizzando queste istruzioni mi viene da pensare che potrei coprire il tutto con tre funzioni:

mcheck(component, state)
mopen(component)
mclose(component)

Al momento, ho creato semplicemente una lista di template che uso per fare matching della funzione ed estrarre gli argomenti:

Close COMPONENT
Open COMPONENT
Check that COMPONENT is STATE


Al crescere delle istruzioni o della complessità delle istruzioni la faccenda comincia, ma in qualche modo si può ancora venirne a capo (e.g. assegnando una priorità ai template):

Open the door
Open the door slowly

Alla fine faccio un semplice matching con regex (sullo stile di questo post https://stackoverflow.com/a/14900044), estraggo i valori e tutto è bene quel che finisce bene. Magari aggiungendo fuzzy matching per coprire almeno gli errori di battitura potrebbe bastare.
Rimane il fatto che bisogna prima di tutto prendere l’elenco di tutte le istruzioni, analizzarle per trovare le similarità, scrivere un template, creare un elenco di argomenti, etc. La domanda iniziale era più in cerca di qualche tool che mi supporti in questo senso.

Ovviamente una delle cose a cui ho pensato è una libreria NLP (sono andato per spacy), però ho dopo alcuni esperimenti iniziali - nonostante la voglia ci sia - ho rimandato a tempi futuri l’idea perché mi servirebbe più tempo di quanto abbia al momento...

Ah, mi era anche passato per la testa che magari una libreria PEG potrebbe essere usata per definire una grammatica ad hoc e fare il parsing (magari dico una castronata però).
« Ultima modifica: Dicembre 23, 2020, 19:23 da imbuto »

Offline caronte

  • python erectus
  • ***
  • Post: 244
  • Punti reputazione: 0
    • Mostra profilo
Re:parsing-by-example
« Risposta #3 il: Dicembre 23, 2020, 22:02 »
a ok, adesso e' molto piu' chiara la questione;
quindi in sintesi vuoi associare ad ogni istruzione una determinata "funzione";
allora se hai qualche nozione di NLP la cosa alla fine risulterebbe abbastanza semplice; ovvio e' che puoi optare per diverse soluzioni; questo dipende dai dati che hai;
se ad esempio hai un numero definito di istruzioni che conosci a priori, ,mettiamo un  insieme  di n istr:

Close the door  --> A
Check that the door is closed -->B
Open the window --> C
Check that the window is open --> D
Close the window --> E

se  ogni istruzione e'  unica'(anche se  presenta errori di ortografia o battitura), ovvero se NON sono presenti istruzioni con sintassi e parole differenti  che chiamano una stessa funzione,  la cosa e' ancora piu immediata.
tipo puoi usare una library come  "textdistance",  "strsimpy" (googla) etc..               
ti crei una lista con le relative distanze, ad es. [levenshtein.distance(target, istr) for istr in your_data] ti estrai l'indice della minore -- lst.index(min(lst))-- e poi ti vai recuperare la relativa istruzione e la funzioen associata;
le distanze che solitamente fungono meglio con testi simili, ma con piccoli errori ortografici, o parole con posiz non troppo diversa., etc..sono la jaccard, levenshtein ma anche la cosine;  cmq fai dei tests;(potresti anche definire un piccolo ensemble delle varie misurazioni e poi andare a' 'maggioranza' fra le varie distanze...

diciamo che questo e' il metodo migliore se effettivamente hai a che fare con dati di questo genere; cioe' alla fine non scomodi regex, non devi fare alcun preprocessing del testo (tokenizing, lemmatizing, lower text, stopwords, ecc) in quanto dai il testo direttamente in pasto alla funzione;
in caso  anche librerie come "pyspellchecker" ti potrebbero tornare utili per un semplice preprocessing;

se invece le istruzioni cominciano ad avere parole e sintassi molto differenti ma chiaramente mantengono stessa semantica  allora devi cominciare a fare del preprocessing e lavorare con librerie piu' avanzate come "Doc2Vec", "infersent" che invece lavorano con matrici di 'word embeddings', sia  gia istruiti (vedi Glove, word2vec, ...) che da istruire direttamente sui tuoi dati; (questo da fare soprattutto se hai a che fare con testi molto tecnici);  nel qual caso puoi usare librerie come "Gensim";

alla fine ultima spiaggia , ma non credo sia il tuo caso, puoi andare  di "RNN"(recurrent neural network ma non te la cavi solo con Python, doversti maneggiare frameworks come keras, tensorflow o pytorch..) o al limite di "transformers", ma da come ho intuito non sembra proprio il tuo caso, che cmq rimane una task abbastanza semplice;

comincia a visionare quello che ti ho segnalato e butta giu' qualcosa, ed in caso, se hai problemi, ti do una mano