我正在尝试从包含大量单词的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);
}
答案 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);
我同意这可能是低效的,因为它会创建很多字符串,但除此之外它很简单,它应该可以工作。 (编辑:实际上,我在想,如果这些存储在字符串池中,它甚至可能不会那么糟糕)