Java-запрос о поиске слова в предложении

Я использую синтаксический анализатор НЛП Стэнфорда (http://nlp.stanford.edu/software/lex-parser.shtml), чтобы разбить блок текста на предложения и затем посмотреть, какие предложения содержат данное слово.

Вот мой код до сих пор:

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");
                }
            }
        }
    }
}

Я запускаю код из командной строки, используя "java TokenizerDemo testfile.txt wall"

Содержимое testfile.txt:

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

Поэтому я хочу, чтобы программа обнаружила "стену" в первом предложении ("стена" вводится как второй аргумент в командной строке). Но программа не обнаруживает "стену", потому что никогда не печатает "да!". Выход программы:

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 из синтаксического анализатора Stanford правильно разбивает текст на два предложения. Проблема, по-видимому, связана с использованием метода equals. Каждое слово имеет тип "edu.stanford.nlp.ling.Word". Я попытался получить доступ к базовой строке слова, поэтому я могу проверить, равна ли строка "стене", но я не могу понять, как получить к ней доступ.

Если я пишу второй цикл for как "for (Word word: предложение) {", то при компиляции я получаю сообщение об ошибке несовместимых типов.

2 ответа

Решение

String доступ к контенту можно получить, вызвав метод: word() на edu.stanford.nlp.ling.Word; например

import edu.stanford.nlp.ling.Word;

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

Также обратите внимание, что при определении List поскольку это означает, что компилятор или IDE, как правило, предупредит вас, если вы попытаетесь сравнить классы несовместимых типов (например, Word против String).

РЕДАКТИРОВАТЬ

Оказывается, я смотрел на старую версию НЛП API. Глядя на самые последние DocumentPreprocessor документацию я вижу, что она реализует Iterable<List<HasWord>> согласно которому HasWord определяет word() метод. Следовательно, ваш код должен выглядеть примерно так:

DocumentPreprocessor dp = ...
for (HasWord hw : dp) {
  if (hw.word().equals(args[1])) {
    System.err.println("Yes!");
  }
}

Поскольку слова могут быть напечатаны изящно, простой word.toString().equals(arg[1]) должно хватить.

Другие вопросы по тегам