2010-01-20 3 views
2

existe-t-il un moyen simple de créer un analyseur de phrases en Java sans ajouter de bibliothèques et de fichiers jar.Java simple phrase parser

L'analyseur ne doit pas seulement faire attention aux espaces entre les mots, mais doit être plus intelligent et analyser:. ! ?, reconnaître lorsque la phrase est terminée, etc

Après l'analyse, seuls les mots réels peuvent être tous stockés dans db ou un fichier, pas de caractères spéciaux.

merci beaucoup tout à l'avance :)

+0

Voir également [ 'StreamTokenizer'] (http://docs.oracle.com/javase/7/docs/api/java/io/StreamTokenizer.html); c'est [rapide] (http://stackoverflow.com/a/2082174/230513) et s'adapte aux espaces de manière flexible. – trashgod

Répondre

7

Vous pouvez commencer par regarder la classe BreakIterator.

De JavaDoc.

La classe BreakIterator implémente méthodes pour trouver l'emplacement des limites dans le texte. Instances de BreakIterator conserver une position actuelle et de numériser sur le texte retournant l'index des caractères où se produisent les limites . En interne, BreakIterator analyse le texte à l'aide d'un CharacterIterator , et est ainsi capable de numériser du texte détenu par n'importe quel objet implémentant ce protocole. A StringCharacterIterator est utilisé pour objets String d'analyse transmis à setText.

Vous utilisez les méthodes d'usine fournies par cette classe pour créer des instances de différents types d'itérateurs de rupture. En particulier, utilisez getWordIterator, getLineIterator, getSentenceIterator, et getCharacterIterator pour créer BreakIterators qui exécutent mot, ligne, phrase, et l'analyse limite de caractères respectivement. Un seul BreakIterator ne peut fonctionner que sur une unité (mot, ligne, phrase, et donc ). Vous devez utiliser un itérateur différent pour chaque analyse de limite d'unité que vous souhaitez exécuter.

L'analyse des limites de ligne détermine lorsqu'une chaîne de texte peut être rompue lorsque est encapsulé. Le mécanisme correctement gère la ponctuation et les traits d'union .

analyse de frontière de phrase permet sélection d'interprétation correcte de périodes à l'intérieur des nombres et les abréviations , et arrière marques de ponctuation telles que les marques et les parenthèses de cotation .

analyse des limites de mot est utilisé par recherche et remplacer les fonctions, ainsi que dans applications d'édition de texte qui permettent à l'utilisateur de sélectionner des mots avec un double-clic. La sélection de mots fournit une interprétation correcte des signes de ponctuation à l'intérieur et à mots. Les caractères qui ne font pas partie de un mot, tels que des symboles ou des signes de ponctuation , ont des sauts de mot des deux côtés.

analyse des limites de caractères permet aux utilisateurs d'interagir avec des personnages comme qu'ils attendent, par exemple, lorsque déplaçant le curseur à travers une chaîne de texte . L'analyse des limites de caractères fournit une navigation correcte des chaînes de caractères , quel que soit le mode de stockage du caractère . Par exemple, un caractère accentué peut être stocké comme caractère de base et un signe diacritique . Ce que les utilisateurs considèrent comme un caractère peut différer entre langues. Le BreakIterator est destiné à être utilisé avec langues naturelles seulement. N'utilisez pas cette classe pour marquer un langage de programmation .

Voir la démo: BreakIteratorDemo.java

-1

String Tokenizer

Scanner

Ex.

StringTokenizer tokenizer = new StringTokenizer(input, " !?."); 
+0

et si vous avez un nombre décimal, il ne se cassera pas correctement. –

+2

Idem avec des abréviations telles que Dr. ou U.S.A. – gonzobrains

1

Il suffit d'utiliser l'expression régulière (\s+ - il appliquera à un ou plusieurs espacements (espaces, onglets, etc.)) pour diviser chaîne en tableau.

Ensuite, vous pouvez itérer sur ce tableau et vérifier si mot se termine par .?! (String.endsWith() trouver fin des phrases.

Et avant d'enregistrer un mot utiliser une expression régulière une fois pour enlever tous les caractères non-alphanumériques.

+9

Certaines personnes, confrontées à un problème, pensent "Je sais, j'utiliserai des expressions régulières". Maintenant, ils ont deux problèmes. – Holograham

0

Bien sûr, utiliser StringTokenizer

import java.util.StringTokenizer; 

public class Token { 
    public static void main(String[] args) { 

     String sentence = "Java! simple ?sentence parser."; 
     String separator = "!?."; 

     StringTokenizer st = new StringTokenizer(sentence, separator, true); 

     while (st.hasMoreTokens()) { 
      String token = st.nextToken(); 
      if (token.length() == 1 && separator.indexOf(token.charAt(0)) >= 0) { 
       System.out.println("special char:" + token); 
      } 
      else { 
       System.out.println("word :" + token); 
      } 

     } 
    } 
} 
+0

Et si vous avez un nombre décimal, il ne se cassera pas correctement. –

3

Basé sur @Jarrod Roberson's answer, j'ai créé une méthode util qui utilise BreakIterator et retourne la liste des phrases.

public static List<String> tokenize(String text, String language, String country){ 
    List<String> sentences = new ArrayList<String>(); 
    Locale currentLocale = new Locale(language, country); 
    BreakIterator sentenceIterator = BreakIterator.getSentenceInstance(currentLocale);  
    sentenceIterator.setText(text); 
    int boundary = sentenceIterator.first(); 
    int lastBoundary = 0; 
    while (boundary != BreakIterator.DONE) { 
     boundary = sentenceIterator.next();   
     if(boundary != BreakIterator.DONE){ 
      sentences.add(text.substring(lastBoundary, boundary)); 
     } 
     lastBoundary = boundary;    
    } 
    return sentences; 
}