2010-02-03 13 views
11

Verwenden von JavaScript Ich muss ~ 10000 Schlüsselwörter aus einem ~ 100000 Word-Dokument effizient entfernen, von denen ~ 1000 Schlüsselwörter sein werden. Welchen Ansatz würden Sie vorschlagen?effiziente Methode zum Ersetzen mehrerer Wörter im Text

Wäre ein massiver regulärer Ausdruck praktisch? Oder sollte ich nur durch die Zeichen des Dokuments iterieren, die nach Schlüsselwörtern suchen (langweilig)?

Bearbeiten:
Guter Punkt - nur ganze Wörter, keine Teile. Und einige Schlüsselwörter enthalten Leerzeichen.
Ich versuche, alle Client-Seite zu tun, um den Druck auf das Backend zu reduzieren.

+1

Interessante Frage. Auf der einen Seite würde eine in einer kompilierten Sprache handgeschriebene Zustandsmaschine die Regex-Regeln sprengen, aber auf der anderen Seite ist Javascript selbst ziemlich langsam, also müssen Sie versuchen zu vergleichen, ob die Regex-Engine schneller ist . –

+0

Muss es JavaScript sein oder können Sie es zur Transformation auf den Server schieben? Es ist schwer zu sagen, welches ohne einige Daten effizienter sein wird, um es zu testen. Wenn Sie beispielsweise Python verwenden, können Sie die Daten segmentieren und den Prozess fädeln, wenn dies wirklich erforderlich ist. –

+0

Müssen Sie auch nur ganze Wörter oder Wortteile ersetzen - zB Wort, Stichwort, Wortstamm, alle haben das Wort "Wort" in sich, wie müssen sie behandelt werden? – meouw

Antwort

6

einen regulären Ausdruck verwendet, kann eine gute Option sein:

var words = ['bon', 'mad']; 
'joe bon joe mad'.replace(new RegExp('(' + words.join('|') + ')', 'g'), ''); 
// 'joe joe ' 

Die Regex nicht sehr kompliziert mit Dingen wie Vorgriff ist, und der regexp Motor in C/C++ geschrieben ist, so Sie können erwarten, dass es ziemlich schnell ist. Dennoch - Benchmark und sehen, ob die Leistung Ihren Bedürfnissen entspricht.

Ich denke nicht, dass die Implementierung Ihres eigenen Parsers schneller sein wird, aber ich könnte falsch liegen - Benchmark.

Das Senden des Dokuments an den Server klingt nicht sehr gut für mich. Mit 100k Worten sehen Sie sich eine Payload im Megabyte-Bereich an, und Sie müssen noch etwas damit auf dem Server machen und es zurückschieben.


Sie könnten zu stimmen haben die regexp etwas mit den Räumen zu tun.

+1

Vielleicht möchten Sie Wortgrenzen Checks hinzufügen? '\\ b (' + words.join ('|') + ') \\ b'' –

+0

Die Regexp könnte einige Liebe verwenden, stimme ich zu, aber es veranschaulicht den Punkt. –

0

Mein Instinkt sagt mir, dass für eine so große Anzahl von Stichwörtern - Sortieren der Schlüsselwörter und Erstellen einer Zustandsmaschine pro Character viel schneller als ein regulärer Ausdruck wäre, da die Zustandsmaschine trivial ist, kann sie automatisch generiert werden.

Verwandte Themen