所以我有一个文档和一个指定的 n-gram 目标字符串。我正在尝试查找所有出现的目标字符串的索引。
final Pattern WORD_PATTERN = Pattern.compile("\\w+");
Matcher matcher = WORD_PATTERN.matcher("the lazy dog, jumps, the lazy dog.");
所以字符串是“the lazy dog, jumps, the lazy dog”。
假设我的目标 n-gram 是“懒惰的”。我基本上按如下方式“迭代”整个字符串,将“n”个单词添加到链表 currentNGram。如果 currentNGram 中的所有单词都与目标 n-gram 匹配,我会保存索引。否则,我删除链表的第一个元素,并附加到输入字符串中的下一个单词(例如,检查文档中的下一个连续 n-gram)。
while (matcher.find()) {
while (currentNGram.size() < lengthOfTargetNTuple) {
currentNGram.add(matcher.group().toLowerCase());
System.out.println(currentNGram.getLast());
}
}
所以这一切都很好,但我的下一个问题是我必须再次“迭代”文档,并找到每个 n-gram 到最近的目标 n-gram 的距离。所以我采取完全相同的方法。除了这一次,当我重新初始化匹配器并按如下方式运行循环时,
while (matcher.find()) {
while (currentGram.size() < lengthOfTargetNTuple) {
currentGram.add(matcher.group().toLowerCase());
System.out.println(currentGram.printLast()) // Psuedocode
}
它打印单词“the”7次而不是打印“the”“lazy”“dog”“jumps”等。但是,
while (matcher.find()) {
while (currentGram.size() < lengthOfTargetNTuple) {
currentGram.add(matcher.group().toLowerCase());
}
System.out.println(matcher.group()); // Prints words in order, correctly
}
为什么是这样?为什么 matcher.group() 方法在第一个问题中以正确的顺序调用打印出的单词,而不是第二个问题?任何方向将不胜感激;我知道这是一个很长的帖子,对不起。
谢谢!