2014-12-29 12 views
6

Ich habe eine Zeichenfolge mit vielen Wörtern und ich habe eine Textdatei, die einige Stopwörter enthält, die ich aus meiner Zeichenfolge entfernen muss. Sagen wir, ich habe einen StringEntfernen von Stoppwörtern aus einem String in Java

s="I love this phone, its super fast and there's so much new and cool things with jelly bean....but of recently I've seen some bugs." 

Nach Stoppwörter zu entfernen, sollte Zeichenfolge wie:

"love phone, super fast much cool jelly bean....but recently bugs." 

ich in der Lage gewesen, dies zu erreichen, aber das Problem, das ich bin vor, dass whenver gibt es neben Stoppwörter seine im String Entfernen nur die erste und ich erhalte Ergebnisse als:

"love phone, super fast there's much and cool with jelly bean....but recently seen bugs" 

Hier meine stopwordslist.txt Datei ist: Stopwords

Wie kann ich dieses Problem lösen? Hier ist, was ich bisher getan haben:

int k=0,i,j; 
ArrayList<String> wordsList = new ArrayList<String>(); 
String sCurrentLine; 
String[] stopwords = new String[2000]; 
try{ 
     FileReader fr=new FileReader("F:\\stopwordslist.txt"); 
     BufferedReader br= new BufferedReader(fr); 
     while ((sCurrentLine = br.readLine()) != null){ 
      stopwords[k]=sCurrentLine; 
      k++; 
     } 
     String s="I love this phone, its super fast and there's so much new and cool things with jelly bean....but of recently I've seen some bugs."; 
     StringBuilder builder = new StringBuilder(s); 
     String[] words = builder.toString().split("\\s"); 
     for (String word : words){ 
      wordsList.add(word); 
     } 
     for(int ii = 0; ii < wordsList.size(); ii++){ 
      for(int jj = 0; jj < k; jj++){ 
       if(stopwords[jj].contains(wordsList.get(ii).toLowerCase())){ 
        wordsList.remove(ii); 
        break; 
       } 
      } 
     } 
     for (String str : wordsList){ 
      System.out.print(str+" "); 
     } 
    }catch(Exception ex){ 
     System.out.println(ex); 
    } 
+0

würde die Zeichenfolge erste Hilfe spalten? etwas wie "phrase.split (delims);" Sie können die unerwünschten Teile herausfiltern, bevor Sie sie wieder zusammennähen. Dies kann Ihr "Dies" und "sein" Problem lösen. –

+0

[Genauere Frage ist hier] (http://stackoverflow.com/questions/22257598/best-way-to-remove-stop-words-from-files) – jsroyal

Antwort

2

Der Fehler liegt daran, dass Sie das Element aus der Liste entfernen, auf der Sie iterieren. Lassen Sie sagt, Sie haben wordsList, die enthält |word0|word1|word2| Wenn ii ist gleich 1 und der if-Test ist wahr, dann rufen Sie wordsList.remove(1);. Danach ist Ihre Liste |word0|word2|. ii wird dann inkrementiert und ist gleich 2 und jetzt ist es über der Größe Ihrer Liste, daher word2 wird nie getestet werden.

Von dort gibt es mehrere Lösungen. Anstatt beispielsweise Werte zu entfernen, können Sie den Wert auf "" setzen. Oder erstellen Sie eine spezielle "Ergebnis" -Liste.

1

Hier versuchen Sie es wie folgt:

String s="I love this phone, its super fast and there's so much new and cool things with jelly bean....but of recently I've seen some bugs."; 
    String stopWords[]={"love","this","cool"}; 
    for(int i=0;i<stopWords.length;i++){ 
     if(s.contains(stopWords[i])){ 
      s=s.replaceAll(stopWords[i]+"\\s+", ""); //note this will remove spaces at the end 
     } 
    } 
    System.out.println(s); 

diese Weise können Sie die endgültige Ausgabe ohne die Worte, die Sie nicht in es wollen. Holen Sie sich einfach eine Liste von Stoppwörtern in einem Array und ersetzen Sie sie in der erforderlichen Zeichenfolge.
Ausgang für meine Stoppwörter:

I phone, its super fast and there's so much new and things with jelly bean....but of recently I've seen some bugs. 
+1

nach der for-Schleife, s = s.replaceAll (" "," "); um die zwei Räume zu einem einzigen Raum zu verändern? –

+0

Ebenso wie bei Vimal werden Sie Teilstrings aus der Mitte anderer Wörter entfernen (versuchen Sie, "a" als Stoppwort hinzuzufügen;)) –

1

Stattdessen warum verwenden Sie nicht unten Ansatz. Es wird leichter sein, zu lesen und zu verstehen:

for(String word : words){ 
    s = s.replace(word+"\\s*", ""); 
} 
System.out.println(s);//It will print removed word string. 
+0

Beachten Sie, dass diese Implementierung zu zwei Leerzeichen führt. –

+0

Das Problem dabei ist, dass es auch die Stoppwörter zwischen anderen Wörtern entfernt. Wie es auch "sein" von "diesem" entfernt. – JavaLearner

+0

@AngelKoh Danke für das Hinweis auf das :) –

4

Dies ist eine viel elegantere Lösung (IMHO), nur mit regulären Ausdrücken:

// instead of the ".....", add all your stopwords, separated by "|" 
    // "\\b" is to account for word boundaries, i.e. not replace "his" in "this" 
    // the "\\s?" is to suppress optional trailing white space 
    Pattern p = Pattern.compile("\\b(I|this|its.....)\\b\\s?"); 
    Matcher m = p.matcher("I love this phone, its super fast and there's so much new and cool things with jelly bean....but of recently I've seen some bugs."); 
    String s = m.replaceAll(""); 
    System.out.println(s); 
+0

Es ist nicht die Break-Anweisung bei allen Problemen. Er nimmt in der ersten Schleife das erste Wort des Textes auf. Dann schaut er in die Liste der Stoppwörter, wenn diese vorhanden ist. Wenn er das Wort in der Stoppwortliste findet, unterbricht er die Suchschleife. Dann nimmt er das nächste Wort und sucht erneut in der Stoppwortliste. –

+0

Ja, Entfernen Pause hat das Problem – JavaLearner

+0

nicht wieder gelöst, wie bei anderen Antworten werden Sie die Stoppwörter entfernen, die Teilzeichenfolgen normaler Wörter sind. –

0

Versuchen Sie es mit replaceAll api von String wie:

String myString = "I love this phone, its super fast and there's so much new and cool things with jelly bean....but of recently I've seen some bugs."; 
String stopWords = "I|its|with|but"; 
String afterStopWords = myString.replaceAll("(" + stopWords + ")\\s*", ""); 
System.out.println(afterStopWords); 

OUTPUT: 
love this phone, super fast and there's so much new and cool things jelly bean....of recently 've seen some bugs. 
5

Probieren Sie das folgende Programm aus.

String s="I love this phone, its super fast and there's so" + 
      " much new and cool things with jelly bean....but of recently I've seen some bugs."; 
    String[] words = s.split(" "); 
    ArrayList<String> wordsList = new ArrayList<String>(); 
    Set<String> stopWordsSet = new HashSet<String>(); 
    stopWordsSet.add("I"); 
    stopWordsSet.add("THIS"); 
    stopWordsSet.add("AND"); 
    stopWordsSet.add("THERE'S"); 

    for(String word : words) 
    { 
     String wordCompare = word.toUpperCase(); 
     if(!stopWordsSet.contains(wordCompare)) 
     { 
      wordsList.add(word); 
     } 
    } 

    for (String str : wordsList){ 
     System.out.print(str+" "); 
    } 

OUTPUT: Liebe Telefon, seine super schnell so viel neue coole Sachen mit Jelly Bean .... aber vor kurzem habe ich einige Fehler gesehen habe.

+0

Netter Fang, nicht die unerwünschten entfernen, aber die gesuchten hinzufügen! +1 – Charlie

0

Versuchen Sie, die Stoppwörter in einer Mengenauflistung zu speichern und Ihre Zeichenfolge in eine Liste zu überführen. Sie können anschließend einfach "removeAll" verwenden, um das Ergebnis zu erhalten.

Set<String> stopwords = new Set<>() 
//fill in the set with your file 

String s="I love this phone, its super fast and there's so much new and cool things with jelly bean....but of recently I've seen some bugs."; 
List<String> listOfStrings = asList(s.split(" ")); 

listOfStrings.removeAll(stopwords); 
StringUtils.join(listOfStrings, " "); 

Keine For Schleifen benötigt - sie bedeuten in der Regel Probleme.

2

Sie können alle Funktion wie dieses es

String yourString ="I love this phone, its super fast and there's so much new and cool things with jelly bean....but of recently I've seen some bugs." 
yourString=yourString.replaceAll("stop" ,""); 
0

verwenden ersetzen scheint, dass Sie ein Anschlag ein Stoppwort machen, ist in einem Satz Umzug in ein anderes Stoppwort entfernt: Sie müssen alle Wörter in jedem Satz aufhören entfernen .

sollten Sie versuchen, Ihren Code zu ändern:

Von:

for(int ii = 0; ii < wordsList.size(); ii++){ 
    for(int jj = 0; jj < k; jj++){ 
     if(stopwords[jj].contains(wordsList.get(ii).toLowerCase())){ 
      wordsList.remove(ii); 
      break; 
     } 
    } 
} 

Um so etwas wie:

for(int ii = 0; ii < wordsList.size(); ii++) 
{ 
    for(int jj = 0; jj < k; jj++) 
    { 
     if(wordsList.get(ii).toLowerCase().contains(stopwords[jj]) 
     { 
      wordsList.remove(ii); 
     } 
    } 
} 

Beachten Sie, dass break entfernt und stopword.contains(word) wird word.contains(stopword) geändert.

-1

Kürzlich eines der Projekt benötigt die Funktionalität, um die stopping/stemm und Schimpfwörter aus dem gegebenen Text oder der Datei zu filtern, nach dem Durchlaufen der wenigen Blogs und Zuschreibungen. erstellt eine einfache Bibliothek zum Filtern von Daten/Datei und zur Verfügung gestellt in Maven. hoffe, das kann jemandem helfen.

https://github.com/uttesh/exude

 <dependency> 
     <groupId>com.uttesh</groupId> 
     <artifactId>exude</artifactId> 
     <version>0.0.2</version> 
    </dependency> 
+0

Dies ist eine fehlerhafte Bibliothek – MFARID

+0

@MFARID könnten Sie bitte die Erklärung liefern, auf welcher Basis es Buggy-Bibliothek ist? –

Verwandte Themen