Ghostt: [Regex] wiederhollte sätze entfernen

ich habe einen text in dem ähnliche sätze (fast gleiche) vorkommen die doppelt natürlich überflüssig sind . (es handelt sich hierbei um eine liste für die suche autocomplete funktion...)

beispiele:

"Der Text ist fast gleich wie der andere"
"Dieser Text ist etwa genauso gleich wie der andere oben"

Wie kann ich es realisieren das nur ein text stehen bleibt ?

falls das zu kompliziert ist kann man als notlösung auch identische sätze löschen..

lösungsansatz:

$text = ereg_replace("\b(\w+)\b\s*\1\b","",$text);

http://www.codeproject.com/KB/dotnet/regextutorial.aspx (unter Punkt 20. \b(\w+)\b\s*\1\b Find repeated words )

  1. Hallo erstmal!

    beispiele:

    "Der Text ist fast gleich wie der andere"
    "Dieser Text ist etwa genauso gleich wie der andere oben"

    Das ist mit RegEx nicht hinzubekommen. Auch String-Funktionen, etwa levenshtein(), similar_text() oder soundex(), die man für Rechtschreibeaufgaben nutzen könnte, werden das nicht bewältigen können. Beide Herangehensweisen müssten andernfalls den Inhalt verstehen, was aber für ihren simplen Aufbau viel zu komplex ist.

    falls das zu kompliziert ist kann man als notlösung auch identische sätze löschen..

    Hier böte sich ein Datenfeld an, das mit den entsprechenden Sätzen befüllt ist und mit der Eingabe als Vergleich durchsucht wird.

    Gruß aus Berlin!
    eddi

    1. der text de suche autocomplete funktion wird täglich neu generiert.

      ist es auch einfach zu lösen in dem ich einfach sage:

      WENN mehr als 30% der worte die mind 4 buchstaben haben in einer zeile gleich sind,
       werden dann alle gleichen zeilen entfernt, so das nur noch 1 ne zeile übrig ist, welche nur 1 mal vorkommt.

      1. Re:

        WENN mehr als 30% der worte die mind 4 buchstaben haben in einer zeile gleich sind,
        werden dann alle gleichen zeilen entfernt, so das nur noch 1 ne zeile übrig ist, welche nur 1 mal vorkommt.

        Wie doch aber die Wortspielereien von Andreas und Gunnar zeigen sollten, kannst Du so teilweisen durch bereits ein einzeln in Groß- und Kleinschreibung abweichenden Buchstaben unterschiedliche Inhalte vernichten.

        Gruß aus Berlin!
        eddi

        1. Wie doch aber die Wortspielereien von Andreas und Gunnar zeigen sollten, kannst Du so teilweisen durch bereits ein einzeln in Groß- und Kleinschreibung abweichenden Buchstaben unterschiedliche Inhalte vernichten.

          das ist nicht das problem da in meinem generierten text alles klein geschrieben ist.

          1. würde jemand gegen bezahlung ein fähiges script hierzu machen?

  2. Hi,

    ich habe einen text in dem ähnliche sätze (fast gleiche) vorkommen die doppelt natürlich überflüssig sind .

    Dazu müßtest Du erst mal definieren, was ähnlich ist und was nicht.

    Helft den armen Vögeln.
    Helft den Armen Vögeln.

    Bis auf einen Buchstaben identisch (und auch da nur Groß-/Kleinschreibung). Aber inhaltlich doch ziemlich unähnlich.

    lösungsansatz:
    $text = ereg_replace("\b(\w+)\b\s*\1\b","",$text);

    Wie bereits in Deinem anderen Thread erwähnt: bau nicht noch mehr ereg*-Aufrufe ein, da ereg* deprecated sind und demnächst (V6.x?) wohl aus PHP rausfliegen sollen.

    Dieser Regex findet gleiche Worte, nicht ähnliche Sätze.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
    1. @@MudGuard:

      nuqneH

      Helft den armen Vögeln.
      Helft den Armen Vögeln.

      Bis auf einen Buchstaben identisch (und auch da nur Groß-/Kleinschreibung).

      Es sollten aber zwei sein: Helft den Armen vögeln.

      „Helfen“ steht mit Verb im Infinitiv (bzw. Infinitiv mit „zu“), nicht mit Substantiv. (Es sei denn, mit Präposition: Helft den Armen beim Vögeln.)

      Qapla'

      --
      Alle Menschen sind klug. Die einen vorher, die anderen nachher. (John Steinbeck)
      1. Hallo Gunnar!

        Helft den Armen beim Vögeln

        Und den Beinen?

        Viele Grüße aus Frankfurt/Main,
        Patrick

        --
        _ - jenseits vom delirium - _

           Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
        Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
  3. hi,

    beispiele:

    "Der Text ist fast gleich wie der andere"
    "Dieser Text ist etwa genauso gleich wie der andere oben"

    Wie kann ich es realisieren das nur ein text stehen bleibt ?

    erst mal musst du dir überlegen, ob es dir auf die Zeichenunterschiede oder auf die Wortunterschiede ankommt. Jedoch wäre meiner Meinung nach bei beiden Möglichkeiten nicht mit Regexen zu arbeiten.
      a) Zeichenunterschiede: Hier müsstest du mit cmp-Funktionen (= Zeichenkettenvergleichsfunktionen) arbeiten, mit abs() die Rückgabe auf einen positiven Wert trimmen und das Löschen eines Strings dann mit if($Unterschied <= $Tolleranzbereich) abhängig machen.
      b) Wortunterschiede (die Wortreihenfolge wird nicht beachtet): Hier könntest du dir mit str_word_count (Format 1) alle Worte der Satzstrings ausgeben lassen und diese dann mit array_merge() zusammenführen. Mit array_unique() entfernst du dann doppelte Werte und danach lässt sich das Löschen eines Strings mit if(count($Array) <= $Tolleranzbereich) äbhängig machen.

    Falls bei dir standardmäßig die Sätze in einem String zusammengefasst werden, müsstest du mit preg_split('/([\.!\?])\s([A-ZÄÖÜ])/', $Text, -1, PREG_SPLIT_DELIM_CAPTURE) den Text in Sätze aufteilen. Leider könnten somit auch Abkürzungen vor einem Hauptwort als Satztrennungen aufgefasst werden. Außerdem besteht jetzt auch der Satz-"string" aus mehreren Teilen des Arrays, welche erst mühsam mit for() und + (Arrayoperator) zusammengesetzt werden müssen.

    lg JeSchnell