[英]How to find N grams of a word in Java?
例如,如果輸入為“名稱”,而minGram為1,maxGramSize為2,則輸出將包含n,a,m,e,na,am,me。 如果minGram = 2,則maxGram = 4 inputWord = name,輸出= na,am,me,nam,ame,name。
函數簽名可以是這樣的:
public List<String> generateNGrams(String input, int minGramSize, int maxGramSize)
最初,我嘗試使用for循環進行此操作,但發現很難遵循索引。 然后我嘗試使用筆和紙使用遞歸來解決它,但我仍在努力。 有人可以幫我弄這個嗎?
一種解決方案:
private static void addNgrams(final int size, final String input,
final List<String> list)
{
final int maxStartIndex = input.length() - size;
for (int i = 0; i < maxStartIndex; i++)
list.add(input.stubString(i, i + size));
}
public List<String> generateNGrams(final String input, final int minSize,
final int maxSize)
{
final List<String> ret = new ArrayList<>();
for (int size = minSize; size <= maxSize; size++)
addNgrams(size, input, ret);
return ret;
}
注意:缺少基本的錯誤檢查(例如, maxSize
大於input
的大小; minSize
大於maxSize
;其他); 留作練習。
這是一個遞歸生成nGrams的程序:此代碼還處理尾巴克。
import java.util.ArrayList;
public class NGrams {
ArrayList<String> nGrams = new ArrayList<String>();
public void generateNGrams(String str, int n) {
if (str.length() == n ) {
int counter = 0;
while (counter < n) {
nGrams.add(str.substring(counter));
counter++;
}
return;
}
int counter = 0;
String gram = "";
while (counter < n) {
gram += str.charAt(counter);
counter++;
}
nGrams.add(gram);
generateNGrams(str.substring(1), n);
}
public void printNGrams() {
for (String str : nGrams) {
System.out.println(str);
}
}
public static void main(String[] args) {
NGrams ng = new NGrams();
ng.generateNGrams("hello world", 3);
ng.printNGrams();
}
}
輸出:
hel
ell
llo
lo
o w
wo
wor
orl
rld
ld
d
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.