Domanda

Ho scritto questo pezzo di codice che divide una stringa e lo memorizza in un array di stringhe: -

String[] sSentence = sResult.split("[a-z]\\.\\s+");

Tuttavia, ho aggiunto il [a-z] perché volevo affrontare alcuni dei problemi sigla. Ma poi il mio risultato si presenta come così: -

  

Inoltre quando Everett cercato di istruirli in matematica di base hanno dimostrato unresponsiv

vedo che perdo il criterio specificato nella funzione split. Va bene per me perdere il periodo, ma perdendo l'ultima lettera della parola disturba il suo significato.

Potrebbe qualcuno aiutarlo con questo, e in aggiunta, qualcuno potrebbe aiutarmi, di trattare con le abbreviazioni? Ad esempio, poiché ho diviso la stringa in base a periodi, io non voglio perdere le abbreviazioni.

È stato utile?

Soluzione

L'analisi di frasi è ben lungi dall'essere un compito banale, anche per le lingue latine come l'inglese. Un approccio ingenuo come quello a delineare nella sua interrogazione non riuscirà abbastanza spesso che si rivelerà inutile nella pratica.

Un approccio migliore è quello di utilizzare un BreakIterator configurato con le impostazioni internazionali destra.

BreakIterator iterator = BreakIterator.getSentenceInstance(Locale.US);
String source = "This is a test. This is a T.L.A. test. Now with a Dr. in it.";
iterator.setText(source);
int start = iterator.first();
for (int end = iterator.next();
    end != BreakIterator.DONE;
    start = end, end = iterator.next()) {
  System.out.println(source.substring(start,end));
}

restituisce il seguente risultato:

  1. Questa è una prova.
  2. Questo è un T.L.A. prova.
  3. Ora con un certo dottor in esso.

Altri suggerimenti

Sarà difficile ottenere un'espressione regolare al lavoro in tutti i casi, ma per risolvere il problema immediato è possibile utilizzare una lookbehind:

String sResult = "This is a test. This is a T.L.A. test.";
String[] sSentence = sResult.split("(?<=[a-z])\\.\\s+");

Risultato:

This is a test
This is a T.L.A. test.

Si noti che ci sono abbreviazioni che non finiscono con lettere maiuscole, come ad esempio abbrev., Signor, ecc ... E ci sono anche frasi che non finiscono nei periodi!

Se è possibile, utilizzare uno strumento di elaborazione del linguaggio naturale, come ad esempio LingPipe . Ci sono molte sottigliezze che sarà molto difficile da catturare utilizzando le espressioni regolari, per esempio, ( es :-)), Mr. , abbreviazioni , puntini di sospensione (...), eccetera .

C'è una molto facile da seguire tutorial su Frase rilevamento nel sito LingPipe.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top