-1

我正在尝试从包含大量单词的 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);
}
4

2 回答 2

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++;
    }
}
于 2013-05-16T11:30:41.833 回答
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);

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

于 2013-05-16T11:36:24.040 回答