2017-05-09 6 views
-1

私はソースコード盗用アルゴリズム(Winnowingアルゴリズム)の実装に取り​​組んでおり、何か助けが必要な問題があります。変換された文字列のJavaでの位置を追跡する

例:例えば 私は、文字列

String test="blahello,,,,/blatestbla7234///§"§$%"%$\n\n23344)§()(§$blablayeahbla"; 

を持っており、

test="blahelloblatestblablablayeahbla" 

にこの文字列を変換し、この文字列から、私はkgramsを構築5グラム

blahe lahel ahell hello ellob llobl .... ahbla 

I文字列のリストにkgramsを保存しますが、開始位置と終了位置を保存することもできますfrすべてのkgramの原文を覚えておいてください。最後にkgramを元のテキスト位置に戻すことができます。

EDIT:

だから私の質問は、誰もが私を助けることができますどのように私はkgram の開始と終了位置を取得できるでしょうか?あなたは何か考えていますか? ありがとうございます。

+0

あなたはこのような何かを意味していますか? blahe.begin = 0、blahe.end = 4、lahel.begin = 1、lahel.begin = 5、...? – wimdetr

+0

必要なプロパティ(例:n、value、beginIndex、endIndexなど)を持つクラスNGramを定義します。そして、あなたのnグラムはStringのインスタンスではなくNGramのインスタンスであり、あなたが有用であると思われる追加のメタデータを持ち歩くことができます。 – Rob

+0

申し訳ありませんが、私の質問は誤解を招いていました。私はそれを編集しました。 クラスに保存できますが、kgramの開始位置と終了位置を取得するにはどうしたらいいですか?私は元のテキストを変換し、多くの文字が置き換えられます。 たとえば、kgram ellobの開始位置を取得したい:4と終了位置13 – vizero

答えて

0

元の文字列の位置を使用する場合は、最初に非文字を削除することはできません。そうしないと情報が失われます。元の文字列のkgramを直接(より多くのCPU時間)見つけるか、各文字の元の位置を変更された文字列(より多くのメモリ空間)と共に保存する必要があります。ここで

は後者の実装です:

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

public class KGram { 

    public final String str; 
    public final int start; 
    public final int end; 

    public KGram(String str, int start, int end) { 
     this.str = str; 
     this.start = start; 
     this.end = end; 
    } 

    @Override 
    public String toString() { 
     return "KGram[\"" + str + "\":" + start + "," + end + "]"; 
    } 

    public static List<KGram> extractFrom(String input, int size) { 
     char[] chars = new char[input.length()]; 
     int[] indexes = new int[input.length()]; 
     int len = 0; 

     for (int i = 0; i < input.length(); i++) { 
      char c = input.charAt(i); 
      if (!Character.isLetter(c)) continue; 

      chars[len] = c; 
      indexes[len] = i; 
      len++; 
     } 

     List<KGram> kgrams = new ArrayList<>(); 
     for (int i = 0, j = size - 1; j < len; i++, j++) { 
      String str = new String(Arrays.copyOfRange(chars, i, j + 1)); 
      kgrams.add(new KGram(str, indexes[i], indexes[j])); 
     } 
     return kgrams; 
    } 
} 

例:

String test = "blahello,,,,/blatestbla7234///§\"§$%\"%$\n\n23344)§()(§$blablayeahbla"; 
List<KGram> kgrams = KGram.extractFrom(test, 5); 

System.out.println(kgrams.get(4)); // prints KGram["ellob":4,13] 
System.out.println(kgrams.get(26)); // prints KGram["ahbla":60,64] 
+0

申し訳ありませんが、私の質問は誤解を招いていました。私はそれを編集しました。 クラスに保存できますが、kgramの開始位置と終了位置を取得するにはどうしたらいいですか?私は元のテキストを変換し、多くの文字が置き換えられます。 たとえば、kgram ellobの開始位置pos:4と終了位置13を取得したいとします。 – vizero

+0

私はあなたが今何を意味しているかを見て、答えを更新しました。 –

関連する問題