Java-запрос о поиске слова в предложении - PullRequest
2 голосов
/ 13 октября 2011

Я использую синтаксический анализатор НЛП Стэнфорда (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как "для" (слово слово: sentence) {"тогда я получаю сообщение об ошибке несовместимых типов при компиляции.

Ответы [ 2 ]

2 голосов
/ 13 октября 2011

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

2 голосов
/ 13 октября 2011

Доступ к содержимому String можно получить, вызвав метод: word() on 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).

EDIT

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

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