Stringketten (inhaltlich) vergleichen - für Profis

  • Themenstarter Themenstarter Kristian-
  • Beginndatum Beginndatum
K

Kristian-

Hiho und zwar habe ich da folgendes Problem:

Ich habe zwei Strings alá:

$string1 = "Das Haus MD532 ist ganz schön lang und grün"
$string2 = "Und eins der grünen Häuser, nämlich MD532 war grün"

Nun gibt es ja dutzende Methoden nativ, oder mit ein bisschen gespiele, mit denen man Differenzen, Übereinstimmungen berechnen kann, da wären z.B. similar_text, levenshtein oder wenn man auf die Aussprache eingeht auch soundex oder "die kölner phonetik". Alles kein Problem, ich denke es ist auch ersichtlich, dass ich Ahnung habe/mich damit auseinander gesetzt habe.

Allerdings haben diese Algos natürlich alle das Problem, dass die einzelnen String in keiner Gewichtung vorliegen. Das heißt: "und" ist genauso gewichtet wie die exakte(!) Hausbeschreibung "MD532". Wenn jedoch die genaue Hausbeschreibung übereinstimmt, kann man ja davon ausgehen, das die Stringketten inhaltlich verwandt sind. Inhaltliche Übereinstimmung != "Stringtechnische" Übereinstimmung. Somit fallen diese Algorithmen größtenteils aus. Mein Plan wäre nun folgender:

Man baut sich eine MySQL Tabelle und befüllt diese mit Wörtern und der jeweilige Gewichtungen, man ließt $string1 und $string2 ein, strtolower, entfernt die Sonderzeichen und überprüft die ganze Geschichte.

Aber:
1. müsste ich wirklich viel Arbeit investieren um die Datenbank zu befüllen
2. Der Algorithmus (den ich Seitenweise als Pseudocode stehen habe) hat wirklich viele Feinheiten und ist stellenweise recht komplex.

Meine eigentliche Frage: Wie würdet ihr rangehen, gibt es sowas sogar evtl. schon fertig als OpenSource?

Lieben Gruß,
Kristian
 
Wörterbücher in DB-Form gibt es eigentlich zuhauf.. Die Frage ist aber, die Wichtung müsstest Du machen, also halte ich diese Idee für fast aussichtslos, denn : uU benutzt man sie nur für die schwach gewichteten Worte, wie zB Ist,das,die,und,auf,um,weil,ganz.. Diese Worte könnte man erstmal simpel löschen, um den Informationsgehalt zu erhöhen und gleichzeitig den Vergleichsalgorithmus seltener zu benutzen. Hast Du denn schon eine Kombination versucht? zB Wort/Wort-Vergleich in kombinierter Wichtung mit Phonetik?

mfg chmee
 
Also mein Gedankengang war (wie du auch schon sagtest)

Schritt 1: string1 & string2 laden.
Schritt 2: beide strings komplett klein schreiben (man erspart sich das rumgehühner mit Case Sensitive)
Schritt 3: sonderzeichen ersetzen, bis nur noch Zahlen und Buchstaben übrigbleiben
Schritt 4: string1 & string2 per explode in jeweils einen Array schreiben
Schritt 5: jedes Wort in beiden string-arrays überprüfen, ob es in dem ignore-word-array steht, wenn ja, dann den wert unsetten und array_values($string[$a]) um "Löcher" zu vermeiden
-------nun fangen die Probleme an:-------
Schritt 6: Wahrscheinlich jeden String in beiden Arrays nach dem Kölner Verfahren codieren
Schritt 7: Anzahl Übereinstimmungen ermitteln
Schritt 8: Deren Gewichtungen(Datenbankgeschichte :-() im Verhätlnis auf deren Gesamtlänge in eine tolle Formel packen. (Zahlen kann man bequem automatisch sehr hoch einstufen)
Schritt 9: Wenn Formelergebniss = über ~80%, dann sind sie inhaltlich gleich

Die "Füllwörterliste" wie "und", "oder", "bei" ist auch relativ fertig.

Hast Du denn schon eine Kombination versucht?: Ja und es war nicht all zu erfreulich, die Schwankungen sind echt sehr, sehr extrem. Ich kann mir schon vorstellen, dass mit solchen Geschichten sicherlich auch Geld verdient wird -> keiner mal so eben sein Projekt frei zur Verfügung stellt. Anwendungsbereiche wären da ja auch unter anderen "Plagiatsüerprüfungen" und Suchmaschinen.

MfG
Kristian

Btw: Vielleicht erinnerst du dich noch an: http://www.firewing.de? :-) Da versuche ich so einen Algo zu implementieren.
 
Zurück