簡體   English   中英

JAVA - n-gram的類設計

[英]JAVA - class design for n-grams

我將從一個例子開始:

盡頭快到了。 我會結束你

我想用n-gram消除字符串“end”的歧義。 所以我現在擁有的是:

abstract class Ngram {...}
public class Bigram extends Ngram {...}
public class Trigram extends Ngram {...}

Bigram :[結束],[結束,是]; [將,結束],[結束,你] Trigram :[結束,是],[結束,接近]; [我,將,結束],[會,結束,你]

然而,現在我認為不僅可以計算Bigrams,Trigrams等一般,而且還可以區分Bigrams與位置= 0處的模糊詞AW和AW位置= 1的詞。 ,AW在pos = 0,1,2等處的Trigrams。

這意味着我可以創建其他類:而不是一個代表文本中找到的所有Bigrams的Bigram類,我可以擁有

abstract class Bigram {...}
public class BigramWithAmbigWordAt0 extends Bigram {...}
public class BigramWithAmbigWordAt1 extends Bigram {...}

現在,我的問題:

  1. 太多了嗎? 如果我這樣做,我不必在使用Bigram對象時檢查AW的位置; 另一方面,我得到很多很少(附加)內容的課程。
  2. 是否有某種啟發式方法可以幫助我“解決”這個問題? 代碼應該是快速,可讀,健壯的......最好的方法是什么? 某種貪婪的方法,只要它們添加新的東西,你只是繼續創建類,但它可能是微不足道的?

單個課程就足夠了。 你只需要該類中的變量:

public class Ngram 
{
    public int n;
    public int ambiguousWordPosition;
    public String sentence;

    public Ngram(int n, int ambiguousWordPosition, String sentence)
    {
        this.n = n;
        this.ambiguousWordPosition = ambiguousWordPosition;
        this.sentence = sentence;
    }
}

然后你可以消除歧義:

public ArrayList<ArrayList<String>> disambiguate(String word)
{
    ArrayList<ArrayList<String>> outer = new ArrayList<ArrayList<String>>();   
    String[] words = sentence.split("\\s+");
    int cutoff = n-1;  

    for (int i = 0; i < words.length - cutoff; i++) {
        if(words[i + ambiguousWordPosition].equals(word)) {
            ArrayList<String> inner = new ArrayList<String>();
            for(int j = i; j < i + cutoff; j++){
                inner.add(words[j]);
            }
            outer.add(inner);
        }
    }

    return outer;
}

注意 :將其視為偽代碼。 我自己沒有測試過,但你應該能夠理解它

我不完全確定你在做什么,但聽起來最好可能使用N-gram類並將N(整數)和AW作為參數發送給構造函數。 如果您計划擴展或重復使用,那將是一個更好的設計。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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