2016-01-20 3 views
2

Как удалить эти стоп-слова наиболее эффективным способом. Приведенный ниже подход не удаляет временные слова. Что мне не хватает?Самый эффективный способ удаления стоп-слов в Java из массива строк

Есть ли другой способ сделать это?

Я хочу это сделать наиболее эффективным образом в Java.

public static HashSet<String> hs = new HashSet<String>(); 


public static String[] stopwords = {"a", "able", "about", 
     "across", "after", "all", "almost", "also", "am", "among", "an", 
     "and", "any", "are", "as", "at", "b", "be", "because", "been", 
     "but", "by", "c", "can", "cannot", "could", "d", "dear", "did", 
     "do", "does", "e", "either", "else", "ever", "every", "f", "for", 
     "from", "g", "get", "got", "h", "had", "has", "have", "he", "her", 
     "hers", "him", "his", "how", "however", "i", "if", "in", "into", 
     "is", "it", "its", "j", "just", "k", "l", "least", "let", "like", 
     "likely", "m", "may", "me", "might", "most", "must", "my", 
     "neither", "n", "no", "nor", "not", "o", "of", "off", "often", 
     "on", "only", "or", "other", "our", "own", "p", "q", "r", "rather", 
     "s", "said", "say", "says", "she", "should", "since", "so", "some", 
     "t", "than", "that", "the", "their", "them", "then", "there", 
     "these", "they", "this", "tis", "to", "too", "twas", "u", "us", 
     "v", "w", "wants", "was", "we", "were", "what", "when", "where", 
     "which", "while", "who", "whom", "why", "will", "with", "would", 
     "x", "y", "yet", "you", "your", "z"}; 
public StopWords() 
{ 
    int len= stopwords.length; 
    for(int i=0;i<len;i++) 
    { 
     hs.add(stopwords[i]); 
    } 
    System.out.println(hs); 
} 

public List<String> removedText(List<String> S) 
{ 
    Iterator<String> text = S.iterator(); 

    while(text.hasNext()) 
    { 
     String token = text.next(); 
     if(hs.contains(token)) 
     { 

       S.remove(text.next()); 
     } 
     text = S.iterator(); 
    } 
    return S; 
} 
+0

выглядит хорошо для меня. насколько велик список S? если это особенно важно, решение может заключаться в том, чтобы не загружать слова в список для начала и выполнять обработку на уровне потока ввода/вывода. Но я бы это сделал, только если у вас была проблема с производительностью или памятью с текущей реализацией. – slipperyseal

+0

вместо того, чтобы удалять строки из списка (вызывая внутреннюю копию), вы можете установить нули, где находятся стоп-слова. затем, когда вы выводите список, игнорируете нули или копируете список в конце и исключаете нули в этой точке. – slipperyseal

+0

Это не удаление столов из списка. – Shorbhaja

ответ

1

Вы не должны управлять списком, а итерация над ним. Более того, вы вызываете next() дважды в тот же цикл, который вычисляет hasNext(). Вместо этого, вы должны использовать итератор для удаления элемента:

public static List<String> removedText(List<String> s) { 
    Iterator<String> text = s.iterator(); 

    while (text.hasNext()) { 
     String token = text.next(); 
     if (hs.contains(token)) { 
      text.remove(); 
     } 
    } 
    return s; 
} 

Но это немного «изобретать колесо», вместо этого, вы могли бы просто использовать removeAll(Collcetion) метод:

s.removeAll(hs); 
-1

Попробуйте приведенные ниже изменения, предложенные:

public static List<String> removedText(List<String> S) 
{ 
    Iterator<String> text = S.iterator(); 

    while(text.hasNext()) 
    { 
     String token = text.next(); 
     if(hs.contains(token)) 
     { 

       S.remove(token); ////Changed text.next() --> token 
     } 
     // text = S.iterator(); why the need to re-assign? 
    } 
    return S; 
} 
+0

Пробовал. Он не удаляет токен из S :(Кроме того, я ранее получал ошибку, связанную с кодофикацией, которая была в основном из-за изменения списка, в результате состояние итератора становилось непоследовательным. – Shorbhaja

+1

java.util.ConcurrentModificationException – Shorbhaja

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

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