2015-02-10 2 views
4

Начну с примера:JAVA - класс дизайн для н-г

Конец близок. Я закончу тебя.

Я хочу устранить строку «end», используя n-граммы. Так что у меня есть сейчас:

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

Биграммные: [, конец], [конец, есть]; [будет, конец], [конец, вы] Trigram: [the, end, is], [end, is near]; [I, will, end], [will, end, you]

Однако теперь я думаю, что это может быть хорошей идеей не просто считать Биграмм, Триграмм и т. Д. В целом, но и различать Биграммы с двусмысленным словом AW в положении = 0 и те, в которых AW находится в положении = 1, триграммы с AW в pos = 0, 1, 2 и т. Д.

Это означало бы, что я мог бы создать дополнительные классы: вместо того, чтобы один класс Биграммные, который представляет все биграмм найденные в тексте, я мог бы

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

Теперь, мой вопрос (ы):

  1. это слишком много? Если я это сделаю, мне не нужно проверять положение AW при использовании объектов Bigram; с другой стороны, я получаю много классов с небольшим (дополнительным) контентом.
  2. Есть ли какая-то эвристика, которая помогает мне «решить» эту проблему? Код должен быть быстрым, удобочитаемым, надежным ... что это лучший способ сделать это? Какой-то жадный подход, когда вы просто продолжаете создавать классы, пока они добавляют что-то новое, сколь бы незначительным оно ни было?

ответ

2

Я не совсем уверен, что вы делаете, но лучше всего использовать класс N-грамм и отправить N (целое число) и AW в качестве параметров для конструктора. Это было бы лучше, если вы планируете продлить или повторно использовать это.

+0

Это то, что у меня есть сейчас, Ngramfactory, который создает Bigrams, Trigrams ... в зависимости от целого числа n. –

+1

Bigram/Trigram/Quadgram (это слово для этого?) Не должны быть отдельными классами - я бы, вероятно, просто использовал класс Ngram, который принимает параметры и имеет методы. Логика, вероятно, подобна (если не идентична), так что создание отдельных классов не стоит усилий. – MarkDacek

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

ПРИМЕЧАНИЕ: Лечить это как псевдо-код. Я не тестировал его сам, но вы должны иметь возможность получить идею.

+0

Вам лучше добавить список слов как «Список ». –

+1

@magnamag обновлен с помощью 'ArrayList' –

 Смежные вопросы

  • Нет связанных вопросов^_^