2013-01-06 4 views
0

Je prends un texte et je brise des phrases - en créant un tableau avec chaque élément contenant une phrase complète. J'ai décidé que la meilleure façon de faire était d'utiliser la classe BreakIterator. Voici le code que je utilise:getSentenceInstance et les espaces

theSentences = new ArrayList<String>(); 
String myText = aString; //the text is produced through a text box 
BreakIterator boundary = BreakIterator.getSentenceInstance(); 
boundary.setText(myText); 
int start = boundary.first(); 
for (int end = boundary.next(); 
     end != BreakIterator.DONE; 
     start = end, end = boundary.next()) 
{ 
    String temp = myText.substring(start,end); 
    theSentences.add(temp.trim()); 
} 

Cela fonctionne tout à fait bien lorsque l'utilisateur se souvient d'inclure un espace à la fin d'une phrase (que la plupart des gens). Cependant, les gens font des erreurs en tapant, et s'ils ne parviennent pas à mettre un espace après l'arrêt complet, le code ne semble pas réaliser que la fin de la phrase a été atteinte. Que puis-je faire à ce sujet? Je me rends compte que je pourrais utiliser regex à la place, mais il semble préférable d'utiliser BreakIterator car c'est pour cela qu'il a été conçu. Également écrire une regex qui fera la distinction entre les arrêts complets et toutes les autres utilisations possibles d'une période me fait mal à la tête :-)

+0

Le document API indique que 'getSentenceInstance' fonctionne différemment selon les paramètres régionaux. Peut-être que vous pouvez trouver une locale qui correspond à votre langue * et * reconnaît les arrêts complets, même sans espace de fin. – us2012

+1

Vous cherchez peut-être StringTokenizer? (http://docs.oracle.com/javase/1.4.2/docs/api/java/util/StringTokenizer.html) – Mike

+1

(Plus précisément, utiliser des caractères de fin de phrase comme délimiteurs et activer le drapeau returnDelims. 'new StringTokenizer (myText,".!? ", true)') – Mike

Répondre

0

Très peu. La division des peines n'est pas une tâche réalisable à 100%. J'utilise moi-même Stanford CoreNLP et l'annotateur ssplit qui fait partie du pipeline pour faire ma division de phrase. Pour les tâches simples, c'est un énorme pot que vous ne voulez probablement pas télécharger, mais cela montre à quel point c'est une tâche compliquée. Pour une implémentation légère du découpage des phrases, il est préférable d'implémenter une méthode d'expression régulière basée sur des règles.