ドキュメントと、指定された n-gram ターゲット文字列があります。ターゲット文字列のすべての出現箇所のインデックスを見つけようとしています。
final Pattern WORD_PATTERN = Pattern.compile("\\w+");
Matcher matcher = WORD_PATTERN.matcher("the lazy dog, jumps, the lazy dog.");
つまり、文字列は「怠惰な犬、ジャンプ、怠け者の犬」です。
私のターゲットn-gramが「怠け者」だとしましょう。基本的に、次のように文字列全体を「反復」し、「n」個の単語をリンクされたリスト currentNGram に追加します。currentNGram のすべての単語がターゲット n-gram と一致する場合、インデックスを保存します。それ以外の場合は、リンクされたリストの最初の要素を削除し、入力文字列の次の単語に追加します (たとえば、ドキュメント内の次の連続する n グラムを確認します)。
while (matcher.find()) {
while (currentNGram.size() < lengthOfTargetNTuple) {
currentNGram.add(matcher.group().toLowerCase());
System.out.println(currentNGram.getLast());
}
}
これで問題ありませんが、次の問題は、ドキュメントをもう一度「反復」し、すべての n グラムから最も近いターゲット n グラムまでの距離を見つける必要があることです。だから私はまったく同じアプローチを取ります。今回を除いて、マッチャーを再初期化し、次のようにループを実行すると、
while (matcher.find()) {
while (currentGram.size() < lengthOfTargetNTuple) {
currentGram.add(matcher.group().toLowerCase());
System.out.println(currentGram.printLast()) // Psuedocode
}
「the」、「lazy」、「dog」、「jumps」などを出力する代わりに、「the」という単語を 7 回出力します。ただし、
while (matcher.find()) {
while (currentGram.size() < lengthOfTargetNTuple) {
currentGram.add(matcher.group().toLowerCase());
}
System.out.println(matcher.group()); // Prints words in order, correctly
}
どうしてこれなの?最初の問題では matcher.group() メソッド呼び出しが正しい順序で単語を出力したのに、2 番目の問題ではどうしてそうではないのでしょうか? どんな方向性でも大歓迎です。これは長い投稿でした。申し訳ありません。
ありがとう!