跟踪java中转换字符串的原始位置
我正在研究一个源代码剽窃算法(winnowing算法)的实现,遇到了一个需要帮助的问题 例如: 我有一根绳子跟踪java中转换字符串的原始位置,java,string,transformation,plagiarism-detection,Java,String,Transformation,Plagiarism Detection,我正在研究一个源代码剽窃算法(winnowing算法)的实现,遇到了一个需要帮助的问题 例如: 我有一根绳子 String test="blahello,,,,/blatestbla7234///§"§$%"%$\n\n23344)§()(§$blablayeahbla"; 并将此字符串转换为 test="blahelloblatestblablablayeahbla" 从这个字符串我建立了kgrams,比如5克 blahe lahel ahell hello ellob llobl
String test="blahello,,,,/blatestbla7234///§"§$%"%$\n\n23344)§()(§$blablayeahbla";
并将此字符串转换为
test="blahelloblatestblablablayeahbla"
从这个字符串我建立了kgrams,比如5克
blahe lahel ahell hello ellob llobl .... ahbla
我将kgram保存在字符串列表中,但也希望保存每个kgram原始文本的开始和结束位置,以便我可以在最后将每个kgram引用回其原始文本位置
编辑:
所以我的问题是,我如何得到一个kgram的开始和结束位置
有人能帮我吗?你知道吗?
提前感谢。如果您想要原始字符串中的位置,您不能先删除非字母,否则信息会丢失。您需要直接在原始字符串中查找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;
}
}
import java.util.ArrayList;
导入java.util.array;
导入java.util.List;
公共类KGram{
公共最终字符串str;
公开最终启动;
公共终端;
公共KGram(字符串str,int start,int end){
this.str=str;
this.start=start;
this.end=end;
}
@凌驾
公共字符串toString(){
返回“KGram[\”“+str+”\:“+start+”,“+end+”];
}
公共静态列表extractFrom(字符串输入,整数大小){
char[]chars=新字符[input.length()];
int[]索引=新的int[input.length()];
int len=0;
对于(int i=0;i
例如:
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]
String test=“blahello,,,,,/blatestbla7234///§\”§$%\“%$\n\n23344)§()(§$blayeahbla);
列表kgrams=KGram.extractFrom(测试,5);
System.out.println(kgrams.get(4));//打印KGram[“ellob”:4,13]
System.out.println(kgrams.get(26));//打印KGram[“ahbla”:60,64]
你的意思是这样的吗?blahe.begin=0,blahe.end=4,lahel.begin=1,lahel.begin=5,…?用你需要的任何属性(例如,n,value,beginIndex,endIndex等)定义一个类NGram。那么你的n-gram是NGram的实例,而不是字符串的实例,你可以随身携带任何你可能发现有用的附加元数据。哦,对不起,我的问题有误导性。我已经编辑了它。我可以将它保存在类中,但如何获取kgram的开始和结束位置。我转换了原始文本,并且使用了很多字符替换。例如,我想获得kgram ellob开始位置:4和结束位置13@vizero你的意思是结束位置8吗?不,我的意思是13想要在未修改的字符串中获得原始位置。8适合修改的字符串。哦,对不起,我的问题有误导性。我已经编辑了它。我可以将其保存在类中,但如何才能获得开始位置kgram的nd结束位置。我转换了原始文本并替换了许多字符。例如,我想获得kgram ellob的开始位置4和结束位置13