steffi: Wörter ersetzen

hi
hab z.b. ne wortsammlung/synonyme in array:
array('aber','jedoch','allerdings')
nun soll in nem text geprüft werden, ob eines der wörter darin vorkommt in form eines einzelnen wortes, also nicht in ner wortzusammensetzung, wie 'aberdoch'(...) o.ä. .  darauf folgen/voranstehen können leerzeichen, sonderzeichen, satzzeichen, ziffern bzw alles außer buchstaben ;)
wenn nun also ein solches wort enthalten ist, sollte es durch eines der anderen synonyme ersetzt werden und das per zufallsfaktor.
nun ist auch noch zu beachten, dass wenn 'Aber' gefunden wird, dass es auch durch 'Jedoch' und nicht durch 'jedoch' ersetzt wird! irgendwie müsste das doch mit einem regex funktionieren...
Danke für hilfe

  1. Hallo steffi,

    Ich wuerde nicht unbedingt einen Regex bemuehen, weil das was du beschreibst, nach einer Menge Arrays mit Synonymen aussieht und regulaere Audruecke nicht sonderlich performant sind. Nehmen wir mal an, dein Text kaeme aus einem Textfile, dann koenntest du mit file() in einer Schleife zeilenweise durchgehen.
    In jeder Zeile koenntest du mit
    if(strpos($zeile, ' ' . $syn_array[$i] . ' ') !== false) fuer jedes Element des Synonymarrays testen, ob das entsprechende Wort vorhanden ist und dann mit einem Randomzugriff auf das Array ein passendes Ersatzwort finden.

    Gruß,

    Dieter

    1. problem: es wird nicht zeilenweise eingelesen, sondern von einer mysql db ausgelesen, wo es auf einen schlag da ist...
      zudem wird die gr/kl schreibung nicht beachtet, wie es erwünscht wird...

      1. Hallo steffi,

        Was die Gross/Kleinschreibung angeht, steht dir ab PHP 5 stripos() zur Verfuegung, aber wenns nicht anders geht, musst du natuerlich einen Regex benutzen, der waere dann \b fuer die Wordboundaries gefolgt vom Wort gefolgt von \b, also \bdaswort\b. Du koennstest zB. alle Synonymarrays wieder in ein Array anordnen und durch dieses dann durschleifen. In jedem Durchgang haettest du also ein Synonymarray.
        Deinen Text explodest du ebenfalls am Leerzeichen und schleifst dann in jedem Durchgang durch das so entstandene Array. Ob das performant ist, musst du selbst testen.

        Gruß,

        Dieter

    2. gudn tach Dieter!

      if(strpos($zeile, ' ' . $syn_array[$i] . ' ') !== false)

      ^ das muessen nicht    ^
                           notw. leerzeichen sein,
                           wenn ich steffi richtig
                           verstand.

      prost
      seth

  2. gudn tach steffi!

    grundsaetzlich sollte man zunaechst immer ueberlegen, ob man auch ohne regexp auskommt, da gewoehnliche string-operationen schneller ausgefuehrt werden.
    da den zu ersetzenden begriffen bestimmte zeichen weder folgen noch voranstehen duerfen, wuerdest du wohl um regexp nur mit denk- und viel schreibaufwand herumkommen, was eine fehlerwahrscheinlichkeit erhoehen wuerde.

    schnell geschrieben hat man afais eine loesung zu dem problem via preg_replace_callback().

    also in etwa

      
    $str=preg_replace_callback("/\b([aA]ber|[jJ]edoch|[aA]llerdings)\b/",'syn_repl',$str);  
      
    function syn_repl($matches){  
      // [link:http://de3.php.net/manual/en/ref.strings.php@title=gewoehnliche operationen]  
      return $result;  
    }  
    
    

    evtl. ist die bei preg_replace_callback() beschriebene variante mit create_function interessant fuer dich.

    prost
    seth

    1. Hi,

      gudn tach steffi!
      [...]

      ja, alles richtig und hilfreich, sehr gut.

      Aber - um noch mal auf das kleine Raetsel zurueck zu kommen - da fehlt mir noch eine irgendwie geartete Stellungnahme Deinerseits. Ausreichen wuerde mir da zum Beispiel ein "Ich weiss nicht, ich kann nicht" oder eine Erklaerung, die das Problem als nicht der Mathematik bzw. der Spieltheorie zugehoerig kennzeichnet. Selbstverstaendlich ist aus meiner Sicht auch eine Termin-Bennenung oder eine irgendwie anders geartete Absichtserklaerung zulaessig und begruessenswert.

      Selbstverstaendlich sind auch andere Einlassungen (also alles ausser dem oben Genannten) willkommen.

      Gruss,
      Ludger

      --
      "Ein Mann, der nicht trinkt, ist mir suspekt."
  3. Hi,

    hab z.b. ne wortsammlung/synonyme in array:
    array('aber','jedoch','allerdings')
    nun soll in nem text geprüft werden, ob eines der wörter darin vorkommt in form eines einzelnen wortes, also nicht in ner wortzusammensetzung, wie 'aberdoch'(...) o.ä. .  darauf folgen/voranstehen können leerzeichen, sonderzeichen, satzzeichen, ziffern bzw alles außer buchstaben ;)

    Damit hast Du ja schonmal den ersten Schritt:
    Teilen des Textes in einzelne Worte. Deine Definition für Wort ist "nur Buchstaben". Wenn Du jetzt auch definieren kannst, was Buchstaben sind (nein, _so_ einfach ist das nicht ;-) hast Du den ersten Part schonmal gelöst.
    Nun klapperst Du jedes so gefundene Wort ab und suchst es in der Wortsammlung.
    Wenn ich es richtig mitbekommen habe kannst Du eine SQL-DB nutzen? Dann solltest Du das auch tun. Meist kann man nur eine Spalte pro Tabelle gleichzeitig indizieren, daher sind auch meist zwei Tabellen nötig (eine mit den ganzen Worten aus der Wortsammlung, die auf eine zweite Tabelle zeigt in der die Wortgruppen versammelt sind). Wenn die Wortgruppen nicht sehr lang sind, könntest Du die auch als CSV-String in eine einzige Spalte packen und die dann indizieren. Ist vielleicht nicht so ganz koscher und dürfte auch einigen DB-Spezialisten die Fußnägel aufrollen, aber es funktioniert -- kostet halt nur etwas Rechenzeit beim Fund.

    Das war der zweite Punkt.

    wenn nun also ein solches wort enthalten ist, sollte es durch eines der anderen synonyme ersetzt werden und das per zufallsfaktor.

    Naja, das schaffst Du dann auch noch selber, oder? ;-)

    nun ist auch noch zu beachten, dass wenn 'Aber' gefunden wird, dass es auch durch 'Jedoch' und nicht durch 'jedoch' ersetzt wird!

    Das könnte man per (ucfirst(Wort_aus_Wortsammlung) == Wort_aus_Text) o.ä. erschlagen. (ucfirst() ist locale-abhängig)

    irgendwie müsste das doch mit einem regex funktionieren...

    Naja, die Worte aus dem Text würde ich schon mit einem Regex raussuchen, der ganze Rest wäre dann aber nur sehr aufwendig mit Regexen zu lösen.

    so short

    Christoph Zurnieden