Extraire les noms du texte (Java)


Quelqu'un connaît-il le moyen le plus simple d'extraire uniquement des noms d'un corps de texte?

J'ai entendu parler de l'outil TreeTagger et j'ai essayé de lui donner un coup de feu mais je n'ai pas pu le faire fonctionner pour une raison quelconque.

Des suggestions?

Merci Phil

MODIFIER:

 import org.annolab.tt4j.*; 
TreeTaggerWrapper tt = new TreeTaggerWrapper(); 

try { tt.setModel("/Nouns/english.par"); 

tt.setHandler(new TokenHandler() { 
     void token(String token, String pos, String lemma) {    
     System.out.println(token+"\t"+pos+"\t"+lemma); } }); 
     tt.process(words); // words = list of words 

     } finally { tt.destroy(); 
} 

C'est mon code, l'anglais est la langue. Je recevais l'erreur: Le type new TokenHandler () {} doit implémenter la méthode abstraite héritée TokenHandler.jeton. Suis-je en train de faire quelque chose de mal?

Author: Phil, 2009-12-11

7 answers

Vous devrez d'abord tokeniser votre texte. Cela peut sembler trivial (diviser à n'importe quel espace peut fonctionner pour vous) mais formellement c'est plus difficile. Ensuite, vous devez décider ce qu'est un nom. N' "le parking" contiennent un nom (parking), deux noms (voiture, parc) ou un nom (parc) et un adjectif (voiture)? C'est un problème difficile, mais encore une fois, vous pourrez peut-être vous en passer.

Est-ce que "J'ai vu le xyzzy" identifie un nom qui n'est pas dans un dictionnaire? Le mot "le" identifie probablement xyzzy comme un nom.

Où sont les noms dans "le temps vole comme une flèche". Comparez avec "les mouches des fruits comme une banane" (grâce à Groucho Marx).

Nous utilisons le tagger brun (Java) (http://en.wikipedia.org/wiki/Brown_Corpus) dans la boîte à outils OpenNLP (opennlp.outils.lang.anglais.PosTagger; opennlp.outils.postag.POSDictionary sur http://opennlp.sourceforge.net / ) pour trouver des noms en anglais normal et je recommanderais de commencer par cela - il fait la plupart de votre réflexion pour vous. Sinon, regardez chez l'un des POSTaggers (http://en.wikipedia.org/wiki/POS_tagger) ou (http://www-nlp.stanford.edu/links/statnlp.html#Taggers).

Dans le marquage partiel de la parole par ordinateur, il est typique de distinguer de 50 à 150 parties distinctes du discours pour Anglais, par exemple, NN pour singulier noms communs, NNS pour pluriel commun noms, NP pour les noms propres singuliers (voir les balises POS utilisées dans le Brun Corpus)

Il y a une liste très complète de Boîtes à outils PNL dans http://en.wikipedia.org/wiki/Natural_language_processing_toolkits. Je vous suggère fortement d'utiliser l'un d'entre eux plutôt que d'essayer de faire correspondre Wordnet ou d'autres collections.

 22
Author: peter.murray.rust, 2009-12-11 18:30:54

Découvrez LingPipe. Cela peut soi-disant choisir entités nommées du texte anglais. Mais je dois avouer queLa PNL n'est pas mon domaine d'expertise.

 1
Author: teabot, 2009-12-11 17:54:32

Basé sur votre édition:

L'erreur dit que vous devez remplacer le jeton de méthode abstraite, et vous avez une définition de jeton dans votre classe interne anonyme, mais peut-être que la signature de votre token-override ne correspond pas à la signature de la méthode abstraite définie dans TokenHandler?

 1
Author: Maximilian Mayerl, 2009-12-11 18:20:41

Mon code suivant fonctionne avec TreeTagger:

public List<String> tag(String str) {
    final List<String> tagLemme = new ArrayList<String>();
    String[] tokens =tokenizer.tokenize(str);
      System.setProperty("treetagger.home", "parametresTreeTagger/TreeTagger");
    TreeTaggerWrapper tt = new TreeTaggerWrapper<String>();
    try {
        tt.setModel("parametresTreeTagger/english/english.par");
        tt.setHandler(new TokenHandler<String>(){
                public void token(String token, String pos, String lemma) {
                        tagLemme.add(token + "_" + pos + "_" + lemma);
                        //System.out.println(token + "_" + pos + "_" + lemma);
                }
        });
        tt.process(asList(tokens));
     } catch (IOException e) {
        e.printStackTrace();
      } catch (TreeTaggerException e) {
        e.printStackTrace();
    }
finally {
        tt.destroy();
}
    return tagLemme;
}
 1
Author: khadre, 2013-03-19 08:43:59

Jetez un oeil à la base de donnéesWordNet . Cette base de données lexicale. Vous pouvez essayer de faire correspondre chaque mot et vérifier s'il s'agit d'un nom.

Je doute que vous ayez une précision de 100%, cependant; la base de données n'a pas de correspondance pour tous les mots possibles en anglais, mais au moins c'est un début.

 0
Author: Scharrels, 2009-12-11 17:47:39

Trouvez un site Web de dictionnaire avec une API (par exemple WS, RESTful) que vous pouvez utiliser pour exécuter des requêtes de recherche.

Les résultats devraient venir dans un format facilement consommable (par exemple XML, JSON) et devraient bien sûr inclure la catégorie lexicale du mot.

 0
Author: torbengee, 2009-12-11 17:57:14

Le moyen le plus simple serait probablement de comparer chaque mot du texte avec un dictionnaire de noms. Après cela, vous devrez probablement faire une analyse élémentaire et accepter l'exactitude approximative des résultats. Beaucoup de références en ligne à l'analyse des langues naturelles.

 0
Author: High Performance Mark, 2012-10-10 23:58:23