JAVA - n-gram的类设计

时间:2015-02-10 16:30:00

标签: java class n-gram

我将从一个例子开始:

结束了。我会结束你。

我想消除字符串" end"使用n-gram。所以我现在拥有的是:

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

Bigram :[the,end],[end,is]; [会,结束],[结束,你] Trigram :[the,end,is],[end,near]; [我,将,结束],[将,结束,你]

然而,现在我认为不仅可以计算Bigrams,Trigrams等一般,而且还可以区分Bigrams与位置= 0处的模糊词AW和AW的位置。在位置= 1,Trigrams与AW在pos = 0,1,2等,

这意味着我可以创建其他类:而不是一个代表文本中找到的所有Bigrams的Bigram类,我可以拥有

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

现在,我的问题:

  1. 那太多了?如果我这样做,我不必在使用Bigram对象时检查AW的位置;另一方面,我得到很多很少(附加)内容的课程。
  2. 是否有某种启发式方法可以帮助我解决问题。这个问题? 代码应该是快速,可读,健壮的......最好的方法是什么?某种贪婪的方法,只要他们添加新的东西,你只是继续创建类,但它可能是微不足道的?

2 个答案:

答案 0 :(得分:3)

单个课程就足够了。你只需要该类中的变量:

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;
}

注意:将此视为伪代码。我自己还没有测试过,但是你应该能够得到这个想法

答案 1 :(得分:2)

我不完全确定你在做什么,但听起来最好可能使用N-gram类并将N(整数)和AW作为参数发送给构造函数。如果您计划扩展或重复使用,那将是一个更好的设计。