1

ドキュメントと、指定された 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 番目の問題ではどうしてそうではないのでしょうか? どんな方向性でも大歓迎です。これは長い投稿でした。申し訳ありません。

ありがとう!

4

1 に答える 1

1

まずは基礎知識から。見てみましょう とはどういうMatcher.find意味...

パターンに一致する入力シーケンスの次のサブシーケンスを見つけようとします。このメソッドは、このマッチャーの領域の先頭から開始します。または、メソッドの以前の呼び出しが成功し、その後マッチャーがリセットされていない場合は、以前の一致で一致しなかった最初の文字から開始します。

次に、のぞいてみましょうMatcher.group

前の一致で一致した入力サブシーケンスを返します。


それらがどのように機能するかを理解したので、次のループが何をするか見てみましょう。

while (matcher.find()) {
    while (currentGram.size() < lengthOfTargetNTuple) {
        currentGram.add(matcher.group().toLowerCase());
                System.out.println(currentGram.printLast()) // Psuedocode
    }
}

currentGram.printLast呼び出しごとに数回印刷していmatcher.findます-正確には、lengthOfTargetNTuple回。currentGram.printLast追加されたばかりの結果になる必要があります -- matcher.group().toLowerCase()。このループ全体で 1 回しか呼び出していないmatcher.findため、この値は変更されません。

while (matcher.find()) {
    while (currentGram.size() < lengthOfTargetNTuple) {
        currentGram.add(matcher.group().toLowerCase());
    }
    System.out.println(matcher.group()); // Prints words in order, correctly
}

ただし、ここでは、呼び出しmatcher.groupごとに 1 回だけ印刷しています。match.findこれは、一致した各サブシーケンスを、ではなく一度だけ出力することを意味しますlengthOfTargetNTuple

于 2012-09-15T07:37:48.663 に答える