从ArrayList创建一个n-gram列表

时间:2013-05-16 11:26:02

标签: java arraylist

我正在尝试从包含大量单词的ArrayList创建一个N-gram列表。 我目前的代码如下:

    public void ngram(int n){
    int i = 0;
    for(String a : arraylist){
        if (i < arraylist.size() - 2) {
    ngramlist.add(arraylist.get(i) + " " + arraylist.get(i+1) + " " + arraylist.get(i+2));
    i++;
    }
    }
    System.out.println(ngramlist);
}

其中arraylist是带有单词的列表,ngramlist是我想要从arraylist创建的列表。 此代码有效,但不是我想要的。如果我输入像“猫狗鸟桌椅”这样的文字,输出将是“猫狗鸟,狗鸟椅,鸟椅桌”。 我想要完成的是能够使用变量n输入我想要连续添加的单词数量。因此,如果我把2作为n,那将是“猫狗,狗鸟,鸟椅,椅子桌”。

所以我希望我的代码是这样的:

    public void ngram(int n){
    int i = 0;
    for(String a : arraylist){
        if (i < arraylist.size() - n) {

    (add all the words between i and i+n, so if n is 3 it adds 0-2, 1-3, 2-4 etc.)

    i++;
    }
    }
    System.out.println(ngramlist);
}

2 个答案:

答案 0 :(得分:1)

使用StringBuilder

for(String a : arraylist){
    if (i < arraylist.size() - n) {
        StringBuilder sb = new StringBuilder();
        for (int j = 0; j < n-1; j++) {
            sb.append(arraylist.get(i+j)).append(" ");
        }
        sb.append(arraylist.get(i+n-1));
        ngramlist.add(sb.toString());
        i++;
    }
}

答案 1 :(得分:0)

所以你可以在你的主要内部使用另一个循环:

String ngram = "";
for (int j = 0; j < n-1; j++)
     ngram += arraylist.get(i + j) + " ";
ngram += arraylist.get(i + n - 1);
ngramlist.add(ngram);

我同意这可能是低效的,因为它会创建很多字符串,但除此之外它很简单,它应该可以工作。 (编辑:实际上,我在想,如果这些存储在字符串池中,它甚至可能不会那么糟糕)