4 Stimmen

Wortstopp und Wortstammgenerator in Java

Ich denke an ein Stop-Wörter in meinem Ähnlichkeitsprogramm und dann ein Stemmer (gehen für Porter 1 oder 2 hängt davon ab, was am einfachsten zu implementieren)

Ich habe mich gefragt, dass, da ich meinen Text aus Dateien als ganze Zeilen lesen und speichern Sie sie als eine lange Zeichenfolge, so dass, wenn ich zwei Zeichenfolgen ex bekam.

String one = "I decided buy something from the shop.";
String two = "Nevertheless I decidedly bought something from a shop.";

Jetzt, wo ich diese Saiten habe

Stemming: Kann ich einfach den Stemmer-Algorithmus direkt darauf anwenden, ihn als String speichern und dann die Arbeit an der Ähnlichkeit fortsetzen, wie ich es vor der Implementierung des Stemmer-Algorithmus in das Programm getan habe, z. B. durch Ausführen von one.stem(); usw.?

Stoppwort: Wie wird das funktionieren? O.o Verwende ich einfach; one.replaceall("I", ""); oder gibt es eine spezielle Methode für diesen Vorgang? Ich möchte mit der Zeichenkette weiterarbeiten und eine Zeichenkette erhalten, bevor ich die Ähnlichkeitsalgorithmen auf sie anwende, um die Ähnlichkeit zu erhalten. Wiki sagt nicht viel aus.

Ich hoffe, Sie können mir weiterhelfen! Danke!

Bearbeiten: Es ist für ein schulisches Projekt, wo ich ein Papier über die Ähnlichkeit zwischen verschiedenen Algorithmen schreibe, also glaube ich nicht, dass ich Lucene oder andere Bibliotheken verwenden darf, die die Arbeit für mich erledigen. Außerdem möchte ich versuchen zu verstehen, wie es funktioniert, bevor ich anfange, Bibliotheken wie Lucene und Co. zu benutzen. Ich hoffe, das ist nicht zu viel Aufwand ^^

11voto

WhiteFang34 Punkte 69056

Wenn Sie dies nicht aus akademischen Gründen implementieren, sollten Sie die Lucene Bibliothek. In jedem Fall kann sie als Referenz gut sein. Sie enthält Klassen für Tokenisierung, Stoppwort-Filterung, Stemming und Ähnlichkeit. Hier ist ein kurzes Beispiel, in dem Lucene 3.0 Stoppwörter entfernt und einen Eingabe-String stemmt:

public static String removeStopWordsAndStem(String input) throws IOException {
    Set<String> stopWords = new HashSet<String>();
    stopWords.add("a");
    stopWords.add("I");
    stopWords.add("the");

    TokenStream tokenStream = new StandardTokenizer(
            Version.LUCENE_30, new StringReader(input));
    tokenStream = new StopFilter(true, tokenStream, stopWords);
    tokenStream = new PorterStemFilter(tokenStream);

    StringBuilder sb = new StringBuilder();
    TermAttribute termAttr = tokenStream.getAttribute(TermAttribute.class);
    while (tokenStream.incrementToken()) {
        if (sb.length() > 0) {
            sb.append(" ");
        }
        sb.append(termAttr.term());
    }
    return sb.toString();
}

Die, wenn sie auf Ihren Saiten so verwendet werden:

public static void main(String[] args) throws IOException {
    String one = "I decided buy something from the shop.";
    String two = "Nevertheless I decidedly bought something from a shop.";
    System.out.println(removeStopWordsAndStem(one));
    System.out.println(removeStopWordsAndStem(two));
}

Ergibt diese Ausgabe:

decid bui someth from shop
Nevertheless decidedli bought someth from shop

0voto

tucuxi Punkte 16684

Ja, Sie können jeden Stemmer so einpacken, dass Sie etwas schreiben können wie

String stemmedString = stemmer.stemAndRemoveStopwords(inputString, stopWordList);

Intern würde Ihr stemAndRemoveStopwords

  • alle stopWords in einer Map zum schnellen Nachschlagen ablegen
  • Initialisierung eines leeren StringBuilders zur Aufnahme der Ausgabezeichenfolge
  • alle Wörter in der Eingabezeichenkette durchlaufen, und für jedes Wort
    • Suche nach dem Wort in der stopWordList; wenn gefunden, weiter zum Anfang der Schleife
    • andernfalls verwenden Sie Ihren bevorzugten Stemmer und fügen ihn in die Ausgabezeichenfolge ein
  • Rückgabe der Ausgabezeichenfolge

0voto

Eser Aygün Punkte 7204

Sie müssen sich nicht mit dem gesamten Text befassen. Teilen Sie ihn einfach auf, wenden Sie Ihren Stoppwort-Filter und Ihren Stemming-Algorithmus an und bauen Sie die Zeichenkette erneut mit einem StringBuilder :

StrinBuilder builder = new StringBuilder(text.length());
String[] words = text.split("\\s+");
for (String word : words) {
    if (stopwordFilter.check(word)) { // Apply stopword filter.
        word = stemmer.stem(word); // Apply stemming algorithm.
        builder.append(word);
    }
}
text = builder.toString();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X