我正在使用斯坦福大学的NLP解析器(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.
所以我希望程序在第一句中检测“wall”(在命令行中输入“wall”作为第二个参数)。但该程序没有检测到“墙”,因为它从不打印“是的!”。该计划的输出是:
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正确地将文本拆分为两个句子。问题似乎是使用equals方法。每个单词都有“edu.stanford.nlp.ling.Word”类型。我已经尝试访问该单词的底层字符串,因此我可以检查该字符串是否等于“wall”,但我无法弄清楚如何访问它。
如果我将第二个for循环写为“for(Word word:sentence){”,那么我会在complilation上收到不兼容类型的错误消息。
答案 0 :(得分:2)
可以通过调用String
上的word()
方法来访问edu.stanford.nlp.ling.Word
内容。 e.g。
import edu.stanford.nlp.ling.Word;
List<Word> words = ...
for (Word word : words) {
if (word.word().equals(args(1))) {
System.err.println("Yes!");
}
}
另请注意,在定义List
时最好使用泛型,因为这意味着如果您尝试比较不兼容类型的类(例如Word
与{{},编译器或IDE通常会发出警告。 1}})。
修改强>
原来我正在查看旧版本的NLP API。查看最新的DocumentPreprocessor
文档,我看到它实现了String
,其中Iterable<List<HasWord>>
定义了HasWord
方法。因此,您的代码应如下所示:
word()
答案 1 :(得分:2)
由于可以优雅地打印单词,因此简单的word.toString().equals(arg[1])
就足够了。