Von Hinten durchs Auge: Array mit Stopwords Array verbessern (PHP)

Hallo,

ich habe ein Array mit vielen einzelnen Wörtern: $array_inhalt = array("affe","bison","der","die","das"); ein zweites Array enthält Begriffe die nicht im finalen Array auftauchen dürfen: $array_stopwords = array("der","die","damenschuh"); Sowohl das Array_inhalt als auch das Array_stopwords sind nicht wenig umfangreich ( 50.000 Einträge wären wohl normal) Bsp. für eine Stopwordliste: https://github.com/solariz/german_stopwords/blob/master/german_stopwords_full.txt

Wie kann ich nun effizent das Array Inhalte mit dem Array Stopwords vergleichen und ggf. Inhalte löschen. Eine verschachtelte foreach wäre möglich, aber wohl weit weg von mal schnell bearbeit.

Viele Dank und ich freue mich auf reichlich Diskussion.

  1. Tach!

    Wie kann ich nun effizent das Array Inhalte mit dem Array Stopwords vergleichen und ggf. Inhalte löschen.

    Schau mal die Liste der Array-Funktionen an, da ist auch eine dabei, die diese Aufgabe erfüllt, irgendwas mit diff oder intersect im Namen.

    dedlfix.

    1. Hallo,

      habe gerade mal in den Sourcecode von array_diff geguckt - die bauen aus den Parametern 2-n eine Hashmap auf und geben dann aus dem ersten Array alles zurück, was nicht in der Hashmap ist.

      Wenn Du die Stopwort-Liste nur auf ein Array anwenden musst, ist das wohl der effektivste Weg.

      Wenn Du sie aber auf MEHRERE Arrays anwenden musst, ist es ggf. nicht effizient, weil du keine Möglichkeit hast, die intern erzeugte Hashmap für mehrere Einsätze wiederzuverwenden. In dem Fall erzeugst Du die Hashmap besser selbst, und zwar mit dem schon erwähnten array_flip. Und dann läufst Du über das Array, aus dem die Stopworte entfernt werden sollen, und prüfst für jedes mit isset nach, ob das Wort in der Hashmap steht.

      Statt eines Standard-Array kannst du Dir auch die PECL-Extension Data Structures anschauen, darin die Klasse set. Sie dürfte auf jeden Fall speichersparender sein als ein Array (was bei deinen Mengen relevant sein kann). Ob die contains-Methode von Set schneller ist als ein isset(array[wort]), muss man wiederum messen. Ich habe keine Benchmarks.

      Ab wann eine eigene Hashmal schneller ist als array_diff, muss man messen. Es hängt von der Größe der Stopwortliste ab; ggf. sind 2-3 Anwendungen von array_diff noch schneller, aber irgendwann müsste sich die eigene Hashmap auszahlen.

      Rolf

      --
      sumpsi - posui - clusi
  2. Was heisst denn hier "gegebenenfalls"? Welche Bedingungen schweben dir da vor? Wenn du da eingreifen willst, mach es mit foreach, oder array_filter(). Wenn du die einfach nur kicken willst, benutze array_diff().