Ich entwickle gerade eine Anwendung, in der ich ähnliche Artikel gruppieren möchte. Elemente (wie Videos) können von Benutzern erstellt werden und ihre Attribute können später geändert oder erweitert werden (wie neue Tags). Anstatt sich auf die Präferenzen der Benutzer zu verlassen, wie es bei den meisten kooperativen Filtermechanismen der Fall ist, möchte ich die Elementähnlichkeit anhand der Attribute der Elemente (wie ähnliche Länge, ähnliche Farben, ähnliche Tags usw.) vergleichen. Die Berechnung ist für zwei Hauptzwecke erforderlich: Vorschlagen von x
ähnlichen Elementen für ein bestimmtes Element und zum Gruppieren in Gruppen ähnlicher Elemente.Ansätze für inhaltsbasierte Artikelempfehlungen
Meine bisherige Anwendung folgt einem asynchronen Design und ich möchte diese Clustering-Komponente so weit wie möglich entkoppeln. Das Erstellen neuer Elemente oder das Hinzufügen neuer Attribute für ein vorhandenes Element wird angekündigt, indem Ereignisse veröffentlicht werden, die die Komponente dann konsumieren kann.
Berechnungen können Best-Effort und "snapshoted" zur Verfügung gestellt werden, was bedeutet, dass ich mit dem bestmöglichen Ergebnis zu einem bestimmten Zeitpunkt in Ordnung bin, obwohl die Qualität des Ergebnisses schließlich steigen wird.
Also suche ich jetzt nach geeigneten Algorithmen, um ähnliche Elemente und Cluster zu berechnen. Eine wichtige Einschränkung ist die Skalierbarkeit. Zu Beginn muss die Anwendung einige tausend Elemente verarbeiten, später sind aber auch Millionen möglich. Natürlich werden die Berechnungen dann auf zusätzlichen Knoten ausgeführt, aber der Algorithmus selbst sollte skalieren. Es wäre auch schön, wenn der Algorithmus bei partiellen Änderungen der Daten eine Art inkrementellen Modus unterstützt.
Mein erster Gedanke, jedes Element miteinander zu vergleichen und die numerische Ähnlichkeit zu speichern, klingt ein bisschen grob. Es erfordert auch n*(n-1)/2
Einträge zum Speichern aller Ähnlichkeiten und jede Änderung oder neues Element wird schließlich n
Ähnlichkeitsberechnungen verursachen.
Vielen Dank im Voraus!
UPDATE tl; dr
Um zu klären, was ich will, ist hier mein Ziel Szenario:
- Benutzer erzeugen Einträge (von Dokumenten denken)
- Benutzer bearbeiten Eintrag Meta-Daten (denken der Tags)
Und hier ist, was mein System bieten sollte:
- Liste der ähnlichen Einträge zu einem bestimmten Artikel als Empfehlung
- Cluster von ähnlichen Einträgen
Beiden Berechnungen werden soll, basierend auf:
- Die Metadaten/Attribute von Einträgen (d Verwendung von ähnlichen Tags)
- Somit kann der Abstand von zwei Einträgen geeignete Metriken
- NICHT basierend auf Benutzer-Votings, Vorlieben oder Aktionen (im Gegensatz zu Collaborative Filtering). Obwohl Benutzer Einträge erstellen und Attribute ändern können, sollten bei der Berechnung nur die Elemente und ihre Attribute und nicht die zugeordneten Benutzer berücksichtigt werden (genau wie bei einem System, in dem nur Elemente und keine Benutzer vorhanden sind).
Idealerweise sollte der Algorithmus unterstützen:
- dauerhafte Änderungen der Attribute eines Eintrags
- inkrementell ähnliche Einträge/Cluster auf Änderungen berechnen
- Skala
- etwas besser als eine einfache Entfernung Tabelle, wenn möglich (wegen der O (n²) Raumkomplexität)
vielleicht ist es hilfreich, den Begriff "ähnlich" durch eine Messung zu ersetzen, wie weit zwei Aspekte der verglichenen Elemente entfernt sind, und diese zu summieren. OverallDistance = lengthdistance + colordistance + tagsdistance – k3b
Das ist ein gültiger Punkt, k3b. –