bestimmte Wörter in einem Document entfernen
TobiasBuschi
- php
0 XaraX0 Tom0 TobiasBuschi0 Tom
0 TobiasBuschi
0 Christoph Zurnieden
Hallo allerseits,
Ich habe eine Liste mit tausenden von Wörtern die ich in einem Dokument suchen und entfernen will, wie geht das am schnellsten?
bis jetzt habe ich mit explode(" ", $documentContent) alle Wörter in ein Array verpackt und jedes Wort mit dem Array verglichen, indem die zu entfernenden Wörter stehen.
Geht das mit regulären Ausdrücken schneller, oder gibt es sonst noch eine Variante?
mfg Tobias
Hallo TobiasBuschi,
Ich habe eine Liste mit tausenden von Wörtern die ich in einem Dokument suchen und entfernen will, wie geht das am schnellsten?
$woerter=array('böse','gut'/*,[usw.]*/);
$text =str_replace($woeter,'',$text);
Gruß aus Berlin!
eddi
Hello Tobias,
Tobias ist ein d u m_m e s A r_s c h l_o c h
Bitte nimm diese Buchstabenansammlungsammlung nicht persönlich. Sie soll Dir nur verdeutlichen, dass Du gegen Windmühlen reitest.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
hallo und danke für die Blumen :)
Es geht mir nicht darum "böse" Wörter zu entfernen, sondern eine Statistik der Wörter zu generieren, wobei einige wörter nicht zu gebrauchen sind.
Hello,
Es geht mir nicht darum "böse" Wörter zu entfernen, sondern eine Statistik der Wörter zu generieren, wobei einige wörter nicht zu gebrauchen sind.
Da habe ich irgendwann schon mal was gebastelt...
Schau Dir mal http://selfhtml.bitworks.de/wordcount.php an
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Sehr gut, danke
das ist bestimmt schon viel schneller.
$woerter=array('böse','gut'/*,[usw.]*/);
$text =str_replace($woeter,'',$text);
Hi,
Ich habe eine Liste mit tausenden von Wörtern die ich in einem Dokument suchen und entfernen will, wie geht das am schnellsten?
[...]
Geht das mit regulären Ausdrücken schneller, oder gibt es sonst noch eine Variante?
Mit dem Array, vorausgesetzt es ist sortiert, bekommst Du O(n(log(n))). Du könntest statt des Array eine Hashtabelle nehmen, dann hättest Du O(n+k) (k ist hier der Wert für's Hashing), also linear. Besser bekommst Du es nicht hin, da die Reihenfolge der Worte im Dokument ja erhalten bleiben muß.
Was Du mit regulären Ausdrücken möchtest bleibt mir in dem Zusammenhang allerdings verborgen, muß ich zugeben.
so short
Christoph Zurnieden
Hi Christoph,
Mit dem Array, vorausgesetzt es ist sortiert, bekommst Du O(n(log(n))). Du könntest statt des Array eine Hashtabelle nehmen, dann hättest Du O(n+k) (k ist hier der Wert für's Hashing), also linear.
Gibt es diese Möglichkeit (bereits implementiert) in PHP?
Gruß aus Berlin!
eddi
Hi,
Mit dem Array, vorausgesetzt es ist sortiert, bekommst Du O(n(log(n))). Du könntest statt des Array eine Hashtabelle nehmen, dann hättest Du O(n+k) (k ist hier der Wert für's Hashing), also linear.
Gibt es diese Möglichkeit (bereits implementiert) in PHP?
Du bist 'ne faule Sau, Eddi! ;-)
Wenn ich das richtig sehe, kannst Du ein Array dazu überreden. Wenn alle Daten vorher bekannt sind, soll's wohl als Hashtabelle übersetzt werden. Zumindest steht sowas ähnliches hier, ich habe aber keinen PHP-Code hier, das nachzuschauen.
so short
Christoph Zurnieden
Hi Christoph,
Du bist 'ne faule Sau, Eddi! ;-)
Veto! Veto!
Ich bin nicht zu bequem, um zu fragen :þ
Wenn ich das richtig sehe, kannst Du ein Array dazu überreden. Wenn alle Daten vorher bekannt sind, soll's wohl als Hashtabelle übersetzt werden. Zumindest steht sowas ähnliches hier, ich habe aber keinen PHP-Code hier, das nachzuschauen.
UI; PHP im verbose-Modus. Von einer Hashtabelle habe ich auch etwas gelesen, aber leider kein Beispiel entdeckt. Aber wenn ich den Ansatz richtig verstehe, dann müßte man das Dokument nach whitespace abplappern, Auszeichnungen der Schriftsprache filtern und dann wort für Wort abklappern. Also als Ansatz etwa so:
$text=mach_sauber(<<<TEXT
Du bist 'ne faule Sau, Eddi! ;-)
TEXT;);
$stat=array(
'a'=>array('ab'=>12,'an'=>41/* ... */),
'b'=>array(/* ... */)
/* ... */
);
$stat=pruefe($text,$stat);
Gruß aus Berlin!
eddi
Hi,
UI; PHP im verbose-Modus. Von einer Hashtabelle habe ich auch etwas gelesen, aber leider kein Beispiel entdeckt. Aber wenn ich den Ansatz richtig verstehe, dann müßte man das Dokument nach whitespace abplappern, Auszeichnungen der Schriftsprache filtern und dann wort für Wort abklappern. Also als Ansatz etwa so:
[CODE]
Eher so ähnlich, wie Tom das vorschlug:
$countliste = array();
// erster Durchgang: komplette Datei
$text = strtolower($text); // zuerst mal alles
// kleingeschrieben
$space = " "; // für's explode()
// Im Gegensatz zu Tom, der sagt,was er nicht haben will
// sage ich, was ich haben will. Ist immer besser so rum.
// RegExp ist jedoch ziemlich teuer hier.
// zweiter Durchgang: komplette Datei
$text = preg_replace('/[^a-zäöüß]+/',$space,$data);
// str_replace nimmt Arrays als Eingabe an
// dritter Durchgang: nur noch Buchstaben und Leerzeichen
$text = str_replace($stopwords,'',$text);
// vierter Durchgang: Stopworte sind auch noch raus
// vierter Durchgang: es ist jedoch weiterer Speicher nötig
$liste = explode(" ",$text);
// fünfter Durchgang: Menge wie beim viertem Durchgang
foreach($liste as $word){
$word = trim($word);
if (strlen($word)>0){
$countliste[$word]++;
}
}
Das Array $countliste kann nicht vorher in der Größe bestimmt werden (warum eigentlich nicht? Oder kann doch?) sondern wird sukzessive gefüllt. Mit etwas Glück erkennt PHP, das es einen Baum benutzen kann, aber eine Hashtabelle wird PHP wohl kaum benutzen. Macht aber auch nix, Du willst ja eh alles auf einen Rutsch auslesen, oder? Ach ne, nicht Du, der OP, aber ist ja egal ;-)
Auf jeden Fall geht Toms Script fünfmal, wenn man das Auslesen des Resultats noch dazunimmt sogar sechsmal durch die Daten, davon zweimal durch die ganze Datei obwohl theoretisch nur einmal nötig wäre (praktisch ist es etwas mehr, aber egal). Da ich nicht glaube, das Toms PHP-Künste so schlecht sind -- das kann wohl eher von meinen sagen ;-) -- ergibt sich die Frage: ist PHP wirklich _so_ schlecht für eine solche, durchaus nicht unübliche Aufgabe geeignet?
so short
Christoph Zurnieden
Danke für die schönen Formeln¨
Mit dem Array, vorausgesetzt es ist sortiert, bekommst Du O(n(log(n))). Du könntest statt des Array eine Hashtabelle nehmen, dann hättest Du O(n+k) (k ist hier der Wert für's Hashing), also linear. Besser bekommst Du es nicht hin, da die Reihenfolge der Worte im Dokument ja erhalten bleiben muß.
Nein, die Reihenfolge spielt keine Rolle, ich mache eine Statistik der enthaltenen Wörter, wobei die Position keine Rolle spielt. Und viele Wörter kann ich für die Statistik nicht gebrauchen.
Hi,
Nein, die Reihenfolge spielt keine Rolle, ich mache eine Statistik der enthaltenen Wörter, wobei die Position keine Rolle spielt. Und viele Wörter kann ich für die Statistik nicht gebrauchen.
Aha.
Dann parse das Dokument in ein Array. Alle doppelten raus (bzw Strichliste). Nach der PHP Dokumentation wird das als Hashtabelle übersetzt. Um Kollisionen zu vermeiden solltest Du die Größer des Arrays gleich der, na, halben Größe des Dokumentes setzen. (nach der Statistik würde die Quadratwurzel reichen, aber solche Annahmen streng nach Buch gehen meist in die Hose ;-).
Mmh... nein, das wird in PHP komplizierter als nötig und bringt nur marginal etwas zeitlich. Theoretisch könntest Du so Speicher sparen, dazu müßtest Du Dir aber deine Hashtabellen in PHP selber bauen, das macht keinen Sinn.
Und sowieso: O(n+k) reicht ja wohl, oder? Der Rest wäre eh nur Mikrooptimierung, da O(1) nicht erreicht werden kann. Du mußt jedes Wort im Dokument anfassen, da kommst Du halt nicht drumherum.
so short
Christoph Zurnieden