Requête Java sur la recherche d'un mot dans une phrase


J'utilise l'analyseur NLP de Stanford (http://nlp.stanford.edu/software/lex-parser.shtml) pour diviser un bloc de texte en phrases, puis voir quelles phrases contiennent un mot donné.

Voici mon code jusqu'à présent:

import java.io.FileReader;
import java.io.IOException;
import java.util.List;

import edu.stanford.nlp.ling.*;
import edu.stanford.nlp.process.*;

public class TokenizerDemo {

    public static void main(String[] args) throws IOException {
        DocumentPreprocessor dp = new DocumentPreprocessor(args[0]);
        for (List sentence : dp) {
            for (Object word : sentence) {
                System.out.println(word);
                System.out.println(word.getClass().getName());
                if (word.equals(args[1])) {
                    System.out.println("yes!\n");
                }
            }
        }
    }
}

J'exécute le code à partir de la ligne de commande en utilisant "java TokenizerDemo testfile.txt mur "

Le contenu de testfile.txt est:

Humpty Dumpty sat on a wall. Humpty Dumpty had a great fall.

Je veux donc que le programme détecte "wall" dans la première phrase ("wall" entré comme deuxième argument de la commande ligne). Mais le programme ne détecte pas" mur", car il n'imprime jamais " oui!". La sortie du programme est:

Humpty
edu.stanford.nlp.ling.Word
Dumpty
edu.stanford.nlp.ling.Word
sat
edu.stanford.nlp.ling.Word
on
edu.stanford.nlp.ling.Word
a
edu.stanford.nlp.ling.Word
wall
edu.stanford.nlp.ling.Word
.
edu.stanford.nlp.ling.Word
Humpty
edu.stanford.nlp.ling.Word
Dumpty
edu.stanford.nlp.ling.Word
had
edu.stanford.nlp.ling.Word
a
edu.stanford.nlp.ling.Word
great
edu.stanford.nlp.ling.Word
fall
edu.stanford.nlp.ling.Word
.
edu.stanford.nlp.ling.Word

DocumentPreprocessor de l'analyseur Stanford divise correctement le texte en deux phrases. Le problème apparaît avec l'utilisation de la méthode equals. Chaque mot a le type " edu.Stanford.la pnl.Ling.Mot". J'ai essayé d'accéder à la chaîne sous-jacente du mot, donc je peux ensuite vérifier si la chaîne est égale à "mur", mais je ne peux pas comprendre comment y accéder.

Si j'écris la seconde boucle for comme " for (Word word : phrase) {"ensuite, je reçois un message d'erreur de types incompatibles sur la complilation.

Author: Andrew, 2011-10-13

2 answers

Le contenu String est accessible en appelant la méthode: word() sur edu.stanford.nlp.ling.Word; par exemple

import edu.stanford.nlp.ling.Word;

List<Word> words = ...
for (Word word : words) {
  if (word.word().equals(args(1))) {
    System.err.println("Yes!");
  }
}

Notez également qu'il est préférable d'utiliser des génériques lors de la définition du List car cela signifie que le compilateur ou l'E vous avertira généralement si vous essayez de comparer des classes de types incompatibles (par exemple Word versus String).

MODIFIER

Il s'avère que je regardais une ancienne version de l'API NLP. En regardant le plus récent DocumentPreprocessor documentation Je vois que il implémente Iterable<List<HasWord>> par lequel HasWord définit la méthode word(). Par conséquent, votre code devrait ressembler à ceci:

DocumentPreprocessor dp = ...
for (HasWord hw : dp) {
  if (hw.word().equals(args[1])) {
    System.err.println("Yes!");
  }
}
 2
Author: Adamski, 2011-10-13 14:05:52

Puisque les mots peuvent être imprimés gracieusement, un simple word.toString().equals(arg[1]) devrait suffire.

 2
Author: solendil, 2011-10-13 14:10:56