Announcement

Collapse
No announcement yet.

Probleme beim Aufbau von Songtext-DB / Refrain in Extra TBL ?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme beim Aufbau von Songtext-DB / Refrain in Extra TBL ?

    Guten Tag!

    Ich habe folgendes Problem: Ich entwickle derzeit eine Songtext Datenbank und möchte die Refrains in einer eigenen Tabelle ablegen um einen Schritt mehr in Richtung Normalisierung zu gehen.

    Dabei stellt sich mir das Problem wie ich herausfinden soll welches der Refrain in einem Songtext ist. Man müsste die Sache eigentlich so angehen, dass man Wort für Wort abtastet und vergleicht wie oft es vorkommt. Wenn es nochmal vorkommt wird das nächste Wort zu einer Kette hinzugefügt usw.. (Das hab jetzt mich sicherheit nur ich kapiert ;-)

    Sie alle kennen mein Problem hoffe ich? Wer kann mir helfen?

    Danke,
    Gruss Christian

  • #2
    Hm. Was Du vorhast ist nicht gerade trivial. So aus dem Stehgreif würde ich das folgendermaßen angehen:<br />
    Lies den Songtext zeilenweise in ein Array ein. Erzeuge aus diesem Array ein zweites in folgender Form:<br /><br />
    $hashes[md5($lines[$i])]=$i;<br /><br />
    dabei prüfst Du, ob dieser Arrayeintrag schon existiert, wenn ja, dann extrahiere im Originalarray diese Zeile als Refrain und packe diesen Zeilentext in eine Variable $refrain.
    Das hab jetzt wahrscheinlich nur ich kapiert ;o

    Comment


    • #3
      Hallo Xafford!

      Guter Vorschlag. Was geschieht allerdings wenn in Zeile 8 und in Zeile 15 eine Übereinstimmung der Zeilen gefunden wird obwohl der Refrain dort eigentlich nicht liegt. Man müsste noch ein zweites Array anlegen um zu prüfen in welchen Zeilen die meisten übereinstimmungen gefunden wurden, auch wenn es sich hierbei nicht um den Refrain handelt. Die Anzahl der am meisten übereinstimmenden Zeilen wäre dann der Refrain.

      Oder was denkst du?

      Gruss Christia

      Comment


      • #4
        Deswegen dachte ich, daß man als Indiz einen Zeilenhash nimmt. Um einzelne Zeilenüberienstimmungen zu übergehen könnte man die Bedingung vorsehen, daß Zeile + 1 oder Zeile -1 auch identisch sein muß.<br />
        Je nachdem, wie die Texte vorliegen könnte man auch die Hashes ganzer Absätze generieren, oder mehrzeilige Hashes nehmen.<br />
        Wie gesagt, es ist nicht trivial )..

        Comment


        • #5
          Hi !

          Das muss ich erstmal kapieren. Was bewirkt den die Codezeile, also die Kopie des Textes in Zeilen genau? Es wird ein Abbild des Textes im Array $lines[] gespeichert. Aber wozu md5() ?
          <PRE>
          $hashes[md5($lines[$i])]=$i;
          </PRE>

          danke
          Gruss Christia

          Comment


          • #6
            Der md5() ist ein Hashwert. Hashwerte haben die Eigenschaft, daß zwei unterschiedliche Ausgangswerte (hier die Zeilentexte) nie den gleichen Hashwert liefern. Insofern bedeutet ein identischer Hash, daß der Text in der betreffenden Zeile identisch ist. Der Vorteil des Hash ist, daß er immer gleich lang ist, insofern hast Du ein recht homogene indiziertes Array, anhand dessen Du mit <br />
            <br />
            isset($hashes[md5($lines[$i])])
            <br /><br />
            überprüfen kannst, ob diese Zeile/Ansatz schon einmal vorhanden ist und dies dann entsprechend manipulieren kannst. $i ist darin, damit Du den Bezug zum eigentlichen Songtext-Array zur Verfügng hast

            Comment


            • #7
              Hi !

              Mittlerweile bin ich hier am verzweifeln. Das ganze scheint eindeutig aber es gibt eben so viele Ausnahmefälle die diese Methode unbrauchbar macht.

              Weiß denn niemand ob es eine Funktion dazu schon gibt? Es muss sich doch schonmal jemand die Arbeit gemacht haben (auch im Hinblick auf DB-Normalisierung) einen Textbestandteil in einem großen String der wiederholt vorkommt in eine Extra Tabelle zu packen!?

              Danke Xafford, aber ich werde jetzt erstmal suchen - vielleicht find ich sowas irgendwo und brauch dieses Rad nicht nochmal neu zu erfinden.

              Danke + Gruss
              Christia

              Comment


              • #8
                Hi !

                Bin immer noch am basteln. Ich habe jetzt was geschrieben was mir dabei Abhilfe schaffen soll. Vielleicht kann mal jemand einen Blick drauf werfen. Scheint allerdings noch nicht ganz zu klappen. Weiß jemand wo der Fehler liegen könnte ?

                <PRE>

                <p>$lyric2= "There is a girl her name is bitch&lt;br>she loves my boy&lt;br>and she isnt rich&lt;br>She always buys in City Girl&lt;br>thats the cheapest shop in the world&lt;br>&lt;br>He doesnt love her&lt;br>He is just loveing us &lt;br>He is going to forget this ugly bitch &lt;br>&lt;br>This bitch hate us &lt;br>because she knows&lt;br>that we are better than she&lt;br>She will lose against us&lt;br>she will get fater and never come into the bus&lt;br>&lt;br>He doesnt love her&lt;br>He is just loveing us &lt;br>He is going to forget this ugly bitch &lt;br>&lt;br>To all the ladys &lt;br>you are better than she<br>
                ";<br>
                <br>
                <br>
                $str = $lyric2;<br>
                $chars = preg_split('/ /', $str, -1, PREG_SPLIT_OFFSET_CAPTURE);<br>
                <br>
                for($i=0; $i&lt;=count($chars);$i++){<br>
                echo $chars[$i]." ";<br>
                }<br>
                <br>
                echo "&lt;hr>";<br>
                <br>
                for($i=0; $i&lt;=count($chars);$i++){<br>
                $abbruch=="false";<br>
                <br>
                ##### Wenn Ein Feld des Char Array leer ist: Operation nicht ausführen:<br>
                if(!($chars[$i]=="")){<br>
                <br>
                ##### Wenn das Wort $char[] im Array an Stelle $i mehr oder mindestens<br>
                ##### zweimal im gesamten Text vorkommt dann gehe weiter...<br>
                if(substr_count($lyric2,$chars[$i])>="2"){<br>
                <br>
                ##### $s enthält die Zeigerposition des char Arrays die benötigt wird<br>
                ##### um weitere Wörter an die Zeichenkette $naechstes_wort anzuhängen.<br>
                ##### Das $naechste_wort beginnt immer mit dem aktuellen Wort auf das<br>
                ##### der Zeiger im Array der obersten Schleife zeigt.<br>
                $s = $i+1;<br>
                $naechstes_wort = $chars[$s];<br>
                <br>
                ##### So lange $abbruch nicht true ist, also das aktuelle Wort auf das<br>
                ##### der Zeiger im Array chars zeigt + das naechstes_wort (also ein Wort<br>
                ##### weiter) wird gearbeitet. $abbruch wird true wenn aktuelles Wort aus<br>
                ##### Array $chars + $naechstes_wort nicht mindestens einmal im Text auftauchen.<br>
                while(!($abbruch=="true")){<br>
                <br>
                ##### Taucht aktuelles Wort + $naechstes_wort mehr oder einmal auf dann weiter<br>
                if(substr_count($lyric2,$chars[$i]." ".$naechstes_wort)>="1"){<br>
                $s++;<br>
                $naechstes_wort = $naechstes_wort." ".$chars[$s];<br>
                }<br>
                ##### Taucht aktuelles Wort + $naechstes_wort nicht mehr als einmal oder einmal auf dann weiter<br>
                else{<br>
                $abbruch="true";<br>
                }<br>
                #####<br>
                <br>
                } ##### Ende der while schleife<br>
                $ketten [$i] = $chars[$i]." ".$naechstes_wort;<br>
                $ketten_l[$i] = strlen($chars[$i]." ".$naechstes_wort);<br>
                <br>
                } ##### Ende der if schleife die nur bei mind. zwei Vorkommen des aktuellen<br>
                ##### Wortes im Gesamttext eine Aktion zulässt.<br>
                <br>
                } ##### Ende der if schleife die nur Felder zulässt die nicht leer sind.<br>
                <br>
                } ##### Ende der for haupt schleife<br>
                <br>
                arsort($ketten_l);<br>
                while (list($key, $value) = each ($ketten_l)) {<br>
                echo "[".$value."]".$ketten[$key]."&lt;br>";<br>
                }<br>
                <br>
                #foreach($ketten as $k){<br>
                # echo $k."&lt;hr>";<br>
                #}<br>
                <br>
                ?></p>

                </PRE&gt

                Comment


                • #9
                  Ha das ganze sieht schon besser aus wenn man das pattern abändert:

                  $chars = preg_split('/(<\/?(?:a .*|h1|h2|b|i|br)>)/', $str, -1, PREG_SPLIT_OFFSET_CAPTURE);

                  Sieht jemand Fehler in meinem Code

                  Comment

                  Working...
                  X