Wie kann ich verhindern dass ich doppelte Einträge generiere?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Wie kann ich verhindern dass ich doppelte Einträge generiere?

    Hallo zusammen,

    auf meiner Webseite biete ich unter anderem auch Witze und Rezepte an. Da es natürlich ziemlich blöde wäre, Witze doppelt anzulegen muß ich irgendwie die bestehenden Witze mit dem neu einzufügenden vergleichen.

    Momentan verwende ich similar_text() dazu und schaue ob ein Witz zu 90% übereinstimmt. Tut er das lasse ich ihn ausgeben und kann dann entscheiden ob es ein neuer Witz ist, oder nicht.
    Leider (oder besser zum Glück) werden es immer mehr Witze und die Zeit bis der Vergleich abgeschlossen wird, steigt immer weiter an.

    Wie macht ihr soetwas? Ist mein Ansatz korrekt? Gibt es bessere (effizientere) ?

    Danke für eure Hilfe

    Grüßle

    lach
    mal wieder auf Books for free! vorbeigeschaut?
    Jetzt mit mehr als 1200 Texten / Tutorials
    Wir veröffentlichen auch eure Texte!

  • #2
    guck dir mal die mysql_errno() 1062 an. dublicate entry

    ist aber nur für exaxt den gleichen eintrag.

    zum thema similar_text in mysql hatten wir letztens einen thread. guck mal was da rausgekommen ist.

    Kommentar


    • #3
      Hi & danke,

      aber das taugt leider für mich nicht, denke ich.

      Zwei Witze sind gleich, wenn sie in ihrem Wortlaut gleich sind.
      Ob ein Leerzeichen, ein Satzzeichen oder ein Wort unterschiedlich sind, interessiert mich da nicht so.

      Vielleicht versteh ich das ja auch falsch, denn ausser

      mysql doku finde ich nix vernünftiges


      edit: lol jetzt war ich zu schnell
      mal wieder auf Books for free! vorbeigeschaut?
      Jetzt mit mehr als 1200 Texten / Tutorials
      Wir veröffentlichen auch eure Texte!

      Kommentar


      • #4
        soundex() klingt ja so wie ich das brauche,

        aber leider ist es zu wenig fehlertolerant finde ich.

        Ich habe gerade nach allen Witzen gesucht, die einem Witz ähnlich sind, den ich aus der Datenbank genommen habe und nur ein Wort gelöscht habe. (Wort: das) Leider wurde nix mehr gefunden.
        Solange ich nur Leerzeichen entfernt oder Groß/Kleinschreibung geändert habe, hats funktioniert.

        Hm, vielleicht sollte ich mein similar_text auf die ersten 100 Zeichen des Witzes beschränken. Wenn das passt, sollte der Rest auch passen.

        Oder habt ihr noch andere Ideen?

        Wie machten das denn die richtig großen Seiten?
        mal wieder auf Books for free! vorbeigeschaut?
        Jetzt mit mehr als 1200 Texten / Tutorials
        Wir veröffentlichen auch eure Texte!

        Kommentar


        • #5
          Original geschrieben von lachesis
          Hm, vielleicht sollte ich mein similar_text auf die ersten 100 Zeichen des Witzes beschränken. Wenn das passt, sollte der Rest auch passen.
          meinst du wirklich?

          wie viele witze fangen mit "gehen ein deutscher, ein holländer und ein amerikaner in eine ..." an, und laufen dann aber doch jeweils auf eine andere pointe hinaus ...?
          I don't believe in rebirth. Actually, I never did in my whole lives.

          Kommentar


          • #6
            Hallo lachesis
            Das Problem ist wohl dass der Server ALLE Texte in der DB bearbeiten muss.

            Hab' 'ne Idee und weiss nicht ob sie was taugt.
            Wenn Du die Textzeichen mit ORD in Zahlen umwandelst und
            davon die Quersumme bildest kannst Du diese Zahl in der DB speichern ->A.
            Das gleiche beim Neueintrag->B.
            abs( (A/B)-1) gibt dann eine Zahl >=0 und <=1, 0 heisst identisch.


            Du musst also diesen Wert 1x berechnen und mit den fertig gerechneten gespeicherten Werten in der DB vergleichen.

            Wenn das auch nur einigermassen klappt könntest DU so auch 'mal GROB vorsortieren und dann
            similar_text nur noch auf ein paar Einträge in der DB loslassen zur
            "Endprüfung".

            PS: poste doch 'mal den Link

            Kommentar


            • #7
              Für einen "Grobfilter" kannst Du auch die Anzahl eines häufigen Buchstabens berechnen, z.B. "E", und in der DB abspeichern.
              Wichtig ist natürlich, dass der Grobfilter so eingestellt wird, dass er ZU VIELE Ergebnisse bringt, d.h. richtige müssen in jedem Fall 'drin sein.

              Kommentar


              • #8
                Hi,

                ich werde mal einen "Grobfilter" auf Basis der Zeichenanzahl einbauen.
                Wenn zB die Länge um mehr als 10% abweicht, müssen es unterschiedliche Witze sein.
                Oder meint ihr das paßt nicht?



                @fuser: die webseite steht in meiner Sig. Was hälst Du davon?
                mal wieder auf Books for free! vorbeigeschaut?
                Jetzt mit mehr als 1200 Texten / Tutorials
                Wir veröffentlichen auch eure Texte!

                Kommentar


                • #9
                  Oder meint ihr das paßt nicht?
                  ja, imho paßt das so nicht. für mich sind zwei witze (zumindest fast) gleich, wenn sie auf die selbe pointe hinauslaufen ... also, ki schreiben, die humor erkennt ...
                  Die Zeit hat ihre Kinder längst gefressen

                  Kommentar


                  • #10
                    Original geschrieben von lachesis
                    Hi, ich werde mal einen "Grobfilter" auf Basis der Zeichenanzahl einbauen.
                    Ich würde schon einen Buchstaben zählen, damit die Zeilenumbrüche,
                    Leerzeichen und Satzzeichen ignoriert werden.

                    Du kannst vielleicht 'mal versuchen mehrere Buchstaben zu zählen,
                    z.B.

                    e, r, t und f.

                    Mit diesen 4 Kriterien kannst Du vielleicht auch "richtig" filtern.

                    Kommentar


                    • #11
                      Hi,

                      ich hab das jetzt mal implementiert. Einfach per

                      ... AND abs(1-CHAR_LENGTH(beschr)/$l)<0.1

                      $l ist die Zeichenlänge des neuen Strings.

                      Dadurch hab ich eine Beschleunigung von 5 (bei Zeichenlängen die häufig vorkommen) bis hin zu 500 erreicht (sehr lange Witze bzw. sehr kurze)

                      Hat super funktioniert! Danke für eure Hilfe!

                      Obs noch viel schneller würde, wenn die Länge direkt in der Datenbank hinterlegt wäre?

                      Grüßle
                      mal wieder auf Books for free! vorbeigeschaut?
                      Jetzt mit mehr als 1200 Texten / Tutorials
                      Wir veröffentlichen auch eure Texte!

                      Kommentar

                      Lädt...
                      X