php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Scripts > BRAINSTORMING PHP/SQL/HTML/JS/CSS
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


BRAINSTORMING PHP/SQL/HTML/JS/CSS Ihr habt eine Idee, aber keinen genauen Ansatz? Diskutiert mit anderen Usern des Forums über eure Gedankengänge um evtl. hilfreiche Ideen zu bekommen!
Normale Fragen bitte weiterhin in die entsprechenden Foren!

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 15-07-2009, 14:19
st@tic
 Registrierter Benutzer
Links : Onlinestatus : st@tic ist offline
Registriert seit: Mar 2004
Beiträge: 344
st@tic ist zur Zeit noch ein unbeschriebenes Blatt
Standard Anhand Tags den ähnlichsten Eintrag finden (eine Art Scoring)

Ich habe eine etwas kniffilge Aufgabe bei der ich gerne mal ein paar Meinungen und Vorschläge hören würde.

Ausgangspunkt ist folgender:
Ich habe eine Tabelle mit Einträgen, diese Einträge können getagged werden. In einer Suchmaske sollen Suchwörter eingegeben werden und gesucht werden. Der Eintrag der am besten passt soll dann ausgegeben werden.

Es gibt zwei Tabellen

Eine Tabelle mit Einträgen sieht ungefähr so aus
EntryID, EntryName,...

Eine zweite Tabelle mit den zugehörigen Tags sieht so aus
TagID, EntryID, TagName

es ist eine 1:n verknüpfung auch wenn eine n:m Verknüpfung (zwei 1:n) vielleicht etwas besser der Normalform entspräche, musste ich etwas den Aufwand gegen Nutzen aufwägen, daher hab ich mich bewusst (wenn auch nicht ganz mit reinem Gewissen) dagegen entschieden.

Mein Momentaner Stand ist folgendes SQL Statement

Das Statement ist etwas vereinfacht und funktioniert soweit auch
select e.*, COUNT(t.EntryID) as Counting FROM entries e, tags t where e.EntryID= t.EntryID AND (t.TagName = 'suchwort1' OR TagName = 'suchwort2') GROUP BY t.EntryID ORDER BY Counting DESC

Ich bekomme jetzt die Datensätze auf die mindestens ein Suchwort zutrifft und natürlich die Trefferanzahl vom größten zum kleinsten Sortiert.

1. Frage: Um die Trefferwahrscheinlichkeit zu erhöhen würde ich gerne gewisse Zeichen wie Punkt, Komma, Bindestrich ignorieren. Gibt es eine möglichkeit z.b. den Datenbankeintrag A.B.C finden zu lassen wenn das Suchwort abc ist?

Zusätzlich will ich aber noch zusätzlich eine Ähnlickeitssuche mit levenshtein machen (eine entsprechende Prozedur hab ich im Internet schon gefunden und eingefügt, sodass man es ggf im SQL Statement verwenden kann), um z.b. vertipper etwas zu kompensieren. eine notlösung wäre halt die vertipper ebenfalls als tags zu speichern, was zwar funktioniert und leicht umzusetzen ist aber meiner meinung nach nicht die schönste lösung ist.

ich hab mir also gedacht, dass man es vielleicht mit einer Art Scoringverfahren machen könnte, welches dann den Datensatz mit der höchsten Punktzahl zurückgeben würde.
Mein Ansatz wäre etwas im Hunderterbereich zu machen. Quasi jeder Direkte Treffer würde 100 Punkte geben und je größer das Verhältnis zwischen Wortlänge und Lev Distanz ein kleineren Satz, danach entweder summieren und schauen.

2. Frage lässt sich sowas überhaupt in Mysql umsetzen? oder ist es doch eher besser wenn man es von php machen lässt, da die Datenmenge nicht überdimensional wird, würde es notfalls gehen.

3. Frage kann man sowas komplexes mit Storedprocedures berechnen lassen. Das Problem wäre ja die Auswertung von Selectstatements und ich hab mir erstmal ein paar Grundlagen angesehen.

Frage 1 (weiter oben) wäre übrigens eine sehr wichtige frage, damit schon recht gut zumindest die möglichkeiten einschränken kann
Mit Zitat antworten
  #2 (permalink)  
Alt 15-07-2009, 14:26
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von st@tic Beitrag anzeigen
1. Frage: Um die Trefferwahrscheinlichkeit zu erhöhen würde ich gerne gewisse Zeichen wie Punkt, Komma, Bindestrich ignorieren. Gibt es eine möglichkeit z.b. den Datenbankeintrag A.B.C finden zu lassen wenn das Suchwort abc ist?
Sicher kann man da mit irgendwelchen Zeichenkettenfunktionen on-the-fly rangehen - das zieht aber die Performance nach unten.
Effektiver wäre es, gleich beim Abspeichern eine "normalisierte" Form des Tags in einer extra Spalte abzulegen, und dann darin zu suchen.


Gleiches für die Ähnlichkeitssuche, ob mit Levenshtein, SoundEx oder sonstwas realisiert - auch da würde ich das Ergebnis der jeweiligen Funktion vorberechnen und in einer extra Spalte ablegen.

Das erspart zum einen das Ermitteln des Funktionsergebnisses bei jedem Aufruf, und macht, noch etwas wichtiger, auch die Nutzung eines Index möglich.


Man könnte u.U. auch noch überlegen, den JOIN (bei deinem Statement übrigens ein impliziter, Pfui!) sein zu lassen - erst mal aus der Tag-Tabelle die IDs aller passenden Tags holen, und dann in einer zweiten Query diese IDs im IN-Operator eines SELECTs auf die Eintrags-Tabelle nutzen. Ob das "nötig" ist, oder kaum noch eine Verbesserung bringt, müsste man dann aber am konkreten Beispiel testen.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.

Geändert von wahsaga (15-07-2009 um 14:28 Uhr)
Mit Zitat antworten
  #3 (permalink)  
Alt 15-07-2009, 14:38
st@tic
 Registrierter Benutzer
Links : Onlinestatus : st@tic ist offline
Registriert seit: Mar 2004
Beiträge: 344
st@tic ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von wahsaga Beitrag anzeigen
Effektiver wäre es, gleich beim Abspeichern eine "normalisierte" Form des Tags in einer extra Spalte abzulegen, und dann darin zu suchen.
die normalisierte form abspeichern ist ne gute idee und auch leicht und effektiv umzusetzen.

Zitat:
Zitat von wahsaga Beitrag anzeigen
Gleiches für die Ähnlichkeitssuche, ob mit Levenshtein, SoundEx oder sonstwas realisiert - auch da würde ich das Ergebnis der jeweiligen Funktion vorberechnen und in einer extra Spalte ablegen.
da kann ich jetzt nicht so ganz folgen.

Zitat:
Zitat von wahsaga Beitrag anzeigen
Man könnte u.U. auch noch überlegen, den JOIN (bei deinem Statement übrigens ein impliziter, Pfui!) sein zu lassen
ja das ist auch wahr. der join kam als spontanversuch zustande und da ich kein guter "sqler" bin hab ich mich gefreut aber falls ich den join beibehalten wollte, müsste ich ihn auf INNER JOIN ummoddeln oder?
Mit Zitat antworten
  #4 (permalink)  
Alt 15-07-2009, 14:56
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von st@tic Beitrag anzeigen
da kann ich jetzt nicht so ganz folgen.
Ach so, das geht natürlich nur bei Soundex - Levenshtein nimmt ja zwei Srings als Parameter, und liefert einen Ähnlichkeitswert zurück.

Soundex hingegen nimmt einen String, und wandelt den um - und zwar in einer Art und Weise, dass "ähnliche" Strings gleiche Ergebnisse erzeugen.
Das kann man also, im Gegensatz zu Levenshtein, gut im voraus berechnen und in einer extra Spalte ablegen. Dann muss man nur noch den Suchbegriff ebenfalls mit Soundex behandeln, und kann das dann mit dem statischen Spalteninhalt vergleichen.

Eine genauere Beschreibung gibt's bei der Wikipedia, http://de.wikipedia.org/wiki/Soundex:
Zitat:
Soundex ist ein phonetischer Algorithmus zur Indizierung von Wörtern und Phrasen nach ihrem Klang in der englischen Sprache. Gleichklingende Wörter sollen dabei zu einer identischen Zeichenfolge kodiert werden.
Wohlgemerkt, "nach ihrem Klang in der englischen Sprache" - wenn die Begriffe also überwiegend deutsch sind, ist das mnachmal weniger geeignet. Da tut dann die Kölner Phonetik bessere Dienste, http://de.wikipedia.org/wiki/Kölner_Phonetik - entweder selbst implementieren, oder nach was fertigem Suchen. Das kann man dann auch ruhig PHP-seitig schon machen, da muss man keine aufwendige DB-Procedure für Erstellen - beim Eintragen neuer Tags Wert im Script mit berechnen und eintragen, und für den Suchbegriff genauso vor dem Einsetzen in die Query.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #5 (permalink)  
Alt 15-07-2009, 15:04
st@tic
 Registrierter Benutzer
Links : Onlinestatus : st@tic ist offline
Registriert seit: Mar 2004
Beiträge: 344
st@tic ist zur Zeit noch ein unbeschriebenes Blatt
Standard

achso meintest du das.
mit soundex und kölner phonetik hab ich mich auch schon befasst.
wäre vielleicht ne überlegung wert.

für weitere anregungen bin ich weiterhin sehr dankbar
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
RegEx: Alle Inhalte von B-Tags finden Truncate PHP Developer Forum 5 18-12-2007 15:57
Vorwahlen anhand eine PLZ finden. Skaschy Apps und PHP Script Gesuche 5 29-11-2005 18:37
[MySQL 4.0] Datensatz anhand der ersten beiden Stellen finden Schoppy SQL / Datenbanken 4 20-10-2005 11:53
HTML Tags finden Heinzelmännchen PHP Developer Forum 2 21-09-2005 13:40
Ähnlichsten Eintrag aus DB holen thesilencer5 SQL / Datenbanken 1 05-04-2004 19:19

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 19:20 Uhr.