2016-02-25 3 views
1

У меня возникла проблема с получением trigrams в Java. Моя программа может в настоящий момент получить bigrams, но когда я пытаюсь реализовать ту же структуру метода и изменить его, чтобы получить trigrams, похоже, он не работает. Я хочу, чтобы trigrams получал все возможные комбинации слов в пределах arraylist, например.Получение «триграмм» в Java

Original = [eye, test, find, free, nhs] 
Trigram = [eye test find, 2, eye test free, 3, eye test nhs, 4, eye find free, 3, eye find nhs, 4, eye free nhs, 5, etc...] 

Цифры определяют расстояние между первым словом и последним словом и должны получить все комбинации слов в 3 в arraylist. Это в настоящее время работает для bigrams ...

Original = [eye, test, find, free, nhs] 
Bigram = [eye test, 1, eye find, 2, eye free, 3, eye nhs, 4, test find, 1, test free, 2, test nhs, 3, find free, 1, etc..] 

Вот методы

public ArrayList<String> bagOfWords; 
public ArrayList<String> bigramList = new ArrayList<String>(); 
public ArrayList<String> trigramList = new ArrayList<String>(); 


public void trigram() throws FileNotFoundException{ 
    PrintWriter tg = new PrintWriter(new File(trigramFile)); 
    // CREATES THE TRIGRAM 
    for (int i = 0; i < bagOfWords.size() - 1; i++) { 
     for (int j = 1; j < bagOfWords.size() - 1; j++) { 
      for(int k = j + 1; k < bagOfWords.size(); k++){ 
       int distance = (k - i); 
       if (distance < 4){ 
        trigramList.add(bagOfWords.get(i) + " " + bagOfWords.get(j) + " " + bagOfWords.get(k) + ", " + distance); 
       } 
      } 
     } 
    } 


public void bigram() throws FileNotFoundException{ 
    // CREATES THE BIGRAM 
    PrintWriter bg = new PrintWriter(new File(bigramFile)); 
    for (int i = 0; i < bagOfWords.size() - 1; i++) { 
     for (int j = i + 1; j < bagOfWords.size(); j++) { 
      int distance = (j - i); 
      if (distance < 4){ 
       bigramList.add(bagOfWords.get(i) + " " + bagOfWords.get(j) + ", " + distance); 
      } 
     } 
    } 

Может кто-нибудь помочь мне изменить метод trigram() создать соответствующий trigram за то, что мне нужно? Спасибо за любую помощь.

ответ

2

Вы хотите, чтобы j начинался с i+1, не так ли? Кроме того, я думаю, что вы даете i счету далеко. Он должен остановиться на bagOfWords.size() - 2. Я не уверен, почему вы проверяете distance < 4. Это выкинет действительные группы.

public void trigram() throws FileNotFoundException{ 
PrintWriter tg = new PrintWriter(new File(trigramFile)); 
// CREATES THE TRIGRAM 
for (int i = 0; i < bagOfWords.size() - 2; i++) { 
    for (int j = i + 1; j < bagOfWords.size() - 1; j++) { 
     for(int k = j + 1; k < bagOfWords.size(); k++){ 
      int distance = (k - i); 
      trigramList.add(bagOfWords.get(i) + " " + bagOfWords.get(j) + " " + bagOfWords.get(k) + ", " + distance); 
     } 
    } 
} 
+0

спасибо, что это сработало очарование! @bradimus –

1

Ответа на этот вопрос @bradimus абсолютно прав. Я просто покажу другой подход. Вы заметили, что ваши методы очень похожи? Итак, почему бы не попробовать объединить его с одним универсальным методом? Что-то вроде следующего:

public List<String> anygram(List<String> bagOfWords, int gramCount){ 

    List<String> result = new ArrayList<String>(); 

    for(int i=0;i<=bagOfWords.size()-gramCount; i++){ 
     for(int j=i; j+gramCount<=bagOfWords.size(); j++){ 
      StringBuilder builder = new StringBuilder(); 
      builder.append(bagOfWords.get(i)); 
      int k = j+1; 
      for(; k<j+gramCount; k++){ 
       builder.append(" "); 
       builder.append(bagOfWords.get(k)); 
      } 
      builder.append(", ").append(k-i-1); 
      result.add(builder.toString()); 
     } 
    } 

    return result; 
} 

Мой ответ не для оценки. Я просто заинтересовался этой задачей и пришел к этому решению.

+0

Да, я думал о том, чтобы делать это одним и тем же методом, но когда я пробовал, он получал очень лаги и глюки из-за объема данных, которые он обрабатывал, поэтому я решил просто сохранить все это отдельно! Могу попробовать объединить его, хотя –

+0

Я думаю, что он был лагги, потому что вы использовали прямую конкатенацию строк. Когда вы обрабатываете большое количество строк, всегда лучше использовать 'StringBuilder', потому что он повышает производительность. –

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