簡體   English   中英

如何在Java中找到N克的單詞?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM