Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
跟踪java中转换字符串的原始位置_Java_String_Transformation_Plagiarism Detection - Fatal编程技术网

跟踪java中转换字符串的原始位置

跟踪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

我正在研究一个源代码剽窃算法(winnowing算法)的实现,遇到了一个需要帮助的问题

例如: 我有一根绳子

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