Strumenti per la semplificazione del testo (Java)

Qual è lo strumento migliore che può semplificare il testo utilizzando Java?

Ecco un esempio di semplificazione del testo:

John, who was the CEO of a company, played golf. ↓ John played golf. John was the CEO of a company. 

Vedo il tuo problema come un compito di convertire frasi complesse o composte in frasi semplici. Basato sulla letteratura Tipi di frasi , una frase semplice è costruita da una clausola indipendente. Una frase composta e complessa è costruita da almeno due clausole. Inoltre, la clausola deve avere sobject e verbo.
Quindi il tuo compito è dividere la frase in clausole che formano la tua frase.

L’analisi delle dipendenze da Stanford CoreNLP è uno strumento perfetto per suddividere la frase composta e complessa in una frase semplice. Puoi provare la demo online .
Dalla tua frase di esempio, otterremo il risultato dell’analisi nella notazione Stanford typed dependency (SD) come mostrato di seguito:

nsubj(CEO-6, John-1)
nsubj(played-11, John-1)
cop(CEO-6, was-4)
det(CEO-6, the-5)
rcmod(John-1, CEO-6)
det(company-9, a-8)
prep_of(CEO-6, company-9)
root(ROOT-0, played-11)
dobj(played-11, golf-12)

Una clausola può essere identificata dalla relazione (in SD) di quale categoria è soggetta, ad es. Nsubj , nsubjpass . Vedi il Manuale delle dipendenze di Stanford
La clausola di base può essere estratta dalla testa come parte del verbo e dipende come parte del sobject. Dalla SD sopra, ci sono due clausole di base, es

  • John CEO
  • John ha giocato

Dopo aver ottenuto la clausola di base, puoi aggiungere un’altra parte per rendere la tua frase una frase completa e significativa. Per fare ciò, consultare il Manuale delle dipendenze di Stanford .

A proposito, la tua domanda potrebbe essere in relazione con la ricerca di sub-frasi significative da una frase


Risposta al 3 ° commento:

Una volta ottenuta la coppia di soggetti e un verbo, ovvero nsubj(CEO-6, John-1) , ottenere tutte le dipendenze che hanno un collegamento a tale dipendenza, ad eccezione di qualsiasi dipendenza di quale categoria è soggetta, quindi estrarre una parola unica da queste dipendenze.

Sulla base dell’esempio, nsubj(CEO-6, John-1) , se inizi a passare da John-1 , otterrai nsubj(played-11, John-1) ma dovresti ignorarlo poiché la sua categoria è soggetta.

Il prossimo passo è attraversare la parte di CEO-6 . Otterrai

cop(CEO-6, was-4)
det(CEO-6, the-5)
rcmod(John-1, CEO-6)
prep_of(CEO-6, company-9)

Dal risultato in alto, hai ottenuto nuove dipendenze da attraversare (cioè trovare altre dipendenze che avevano was-4, the-5, company-9 in testa o dipendenti).
Ora le tue dipendenze sono

cop(CEO-6, was-4)
det(CEO-6, the-5)
rcmod(John-1, CEO-6)
prep_of(CEO-6, company-9)
det(company-9, a-8)

In questo passaggio, hai finito di attraversare tutte le dipendenze collegate a nsubj(CEO-6, John-1) . Quindi, estrai le parole da tutte le teste e dipendenti, quindi disponi la parola in ordine crescente in base al numero aggiunto a queste parole. Questo numero indica l’ordine delle parole nella frase originale.

John was the CEO a company

La nostra nuova frase manca una parte, cioè of . Questa parte è nascosta in prep_of(CEO-6, company-9) . Se leggi il Manuale delle dipendenze di Stanford , esistono due tipi di SD , compressi e non compressi. Per favore leggili per capire perché questo è nascosto e come ottenere l’ordine delle parole di questa parte nascosta.

Con lo stesso approccio, otterrai la seconda frase

John played golf

Penso che si possa progettare un algoritmo molto semplice per i casi di base di questa situazione, mentre i casi del mondo reale potrebbero essere troppi, che tale approccio diventi indisciplinato 🙂

Tuttavia ho pensato che dovevo pensare ad alta voce e scrivere il mio approccio e magari aggiungere un po ‘di codice Python. La mia idea di base è quella di ricavare una soluzione dai primi principi, principalmente esponendo esplicitamente il nostro modello di ciò che sta realmente accadendo. E non affidarsi ad altre teorie, modelli, librerie PRIMA che ne facciamo una a mano e da SCRATCH.


Obiettivo: data una frase, estrarre le sussenzioni da esso.

Esempio: John, che era l’amministratore delegato dell’azienda, ha giocato a Golf.

Produzione prevista: John è stato il CEO dell’azienda. John ha giocato a golf.


Ecco il mio modello di ciò che sta accadendo qui scritto sotto forma di ipotesi di modello: (assiomi?)

MA1. Le frasi semplici possono essere espanse inserendo le sussenzioni. MA2. Una sottosessione è una qualifica / modifica (informazioni aggiuntive) su una o più quadro. MA3. Per inserire una subsentenza, inseriamo una virgola accanto all’ quadro su cui vogliamo espanderci (fornisci maggiori informazioni su) e allega la subsentenza, la chiamerò un’estensione e inserirai un’altra virgola quando l’estensione termina.

Dato questo modello, l’algoritmo può essere semplice almeno per affrontare prima i casi semplici.

  1. DETECT: Data una frase, rileva se ha una clausola di estensione, cercando una coppia di virgole nella frase.
  2. ESTRATTO: Se trovi due virgole, genera due frasi: 2.1 ESTRATTO-BASE: frase base: cancella tutto tra le due virgole, ottieni la frase base. 2.2 ESTRATTO-ESTENSIONE: frase di estensione: prendi tutto dentro la frase di estensione, sostituisci ‘chi’ con la parola subito prima. Questa è la tua seconda frase.
  3. STAMPA: In effetti dovresti stampare prima la frase di estensione, perché la frase di base dipende da essa.

Bene, questo è il nostro algoritmo. Sì, sembra un trucco. È. Ma qualcosa che sto imparando ora, è che, se usi un trucco in un programma, è un trucco, se può gestire più cose, è una tecnica.

Quindi espandiamo e complichiamo un po ‘la situazione.

Casi di aggregazione: esempio 2. John, che era l’amministratore delegato della società, ha giocato a golf con Ram, il CFO.

Mentre sto scrivendo, ho notato che avevo omesso la frase ‘who was’ per il CFO! Questo ci porta al caso complicato che il nostro algoritmo fallirà. Prima di andare lì, fammi creare una versione più semplice di 2 che funzionerà.

Esempio 3. John, che era l’amministratore delegato della compagnia, giocava a Golf con Ram, che era il CFO.

Esempio 4. John, il CEO dell’azienda, ha giocato a Golf con Ram, il CFO.

Aspetta che non abbiamo ancora finito!

Esempio 5. John, che è il CEO e Ram, che era il CFO in quel momento, ha giocato a Golf, che è un gioco avvincente.

Per far ciò, ho bisogno di estendere le mie ipotesi sul modello:

MA4. Più di una quadro può essere espansa allo stesso modo, ma non dovrebbe causare confusione perché la clausola di estensione si verifica proprio accanto all’ quadro che viene informata. (account per esempio 3)

MA5. La frase ‘who was’ può essere omessa poiché può essere desunta dall’ascoltatore. (account ad esempio 4)

MA6. Alcune entity framework sono persone, saranno estese usando un “chi” e alcune quadro sono cose, estese usando un “quale”. Ciascuna di queste testate di estensione può essere omessa.

Ora, come gestiamo queste complicazioni nel nostro algoritmo?

Prova questo:

  1. SPLIT-SENTENCE-INTO-BASE-ED-EXTENSIONS: Se la frase contiene una virgola, cerca la seguente virgola ed estrai qualunque cosa si trovi nella frase di estensione. Continua fino a trovare non più la virgola di chiusura o la virgola di apertura a sinistra. A questo punto dovresti avere una lista con la frase base e una o più frasi di estensione.

  2. PROCESS_EXTENSIONS: per ogni estensione, se ha “chi è” o “che è”, sostituirlo per nome prima della parola chiave dell’estensione. Se l’estensione non ha un “chi è” o “che è”, posiziona la parola principale e un è.

  3. STAMPA: prima tutte le frasi di estensione e poi le frasi di base.

Non spaventoso.

Quando avrò un po ‘di tempo nei prossimi giorni, aggiungerò un’implementazione python.

Grazie

Ravi Annaswamy

È improbabile che tu risolva questo problema usando qualsiasi algoritmo noto nel caso generale – questo sta entrando in un forte campo di intelligenza artificiale. Persino gli umani non possono analizzare molto bene la grammatica!

Si noti che il problema è abbastanza ambiguo riguardo a quanto si semplifica e quali sono le ipotesi che si è disposti a fare. Potresti portare il tuo esempio oltre e dire:

Si presume che John sia il nome di un essere. La razza di John è sconosciuta. John ha giocato a golf ad un certo punto nel passato. Si presume che il golf si riferisca al gioco della palla chiamato golf, ma la variante del golf giocata da John è sconosciuta. Ad un certo punto in passato John è stato amministratore delegato di un’azienda. L’amministratore delegato è inteso come “amministratore delegato” nel contesto di una società, ma questo non è specificato. La società è sconosciuta.

Nel caso in cui la lezione non sia ovvia: più si tenta di determinare il significato esatto delle parole, più lattine di vermi si aprono … ci vogliono livelli di giudizio e interpretazione umani per sapere quando Stop.

Potresti essere in grado di risolvere alcuni casi più semplici usando vari strumenti NLP basati su Java: vedi Esiste una buona libreria di elaborazione del linguaggio naturale

Credo che AlchemyApi sia la scelta migliore. Tuttavia richiederà molto lavoro da parte tua per fare esattamente ciò di cui hai bisogno, e come la maggior parte dei commentatori ti ha detto, molto probabilmente non otterrai risultati di qualità al 100%.