2

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)
+0

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

+0

Das ist ein gültiger Punkt, k3b. –

Antwort

4

Anstatt von Grund auf neu zu schreiben, werfen Sie einen Blick auf mahout.apache.org. Es hat die Clustering-Algorithmen, die Sie suchen, sowie die Empfehlung Algorithmen. Es funktioniert neben Hadoop, so dass Sie einfach scale it out können.

Dies ermöglicht Ihnen, ähnliche Dokumente in einem Cluster basierend auf Ihren Keywords und/oder der Beschreibung des Videos zu ermitteln.

https://cwiki.apache.org/MAHOUT/k-means-clustering.html

hat eine kurze Einführung über Clustering von Dokumenten eine Reuters Dataset. Es ist ziemlich ähnlich zu dem, was Sie erreichen möchten. Mahout enthält Empfehlungsalgorithmen wie Slope One, benutzerbasiert, Item basiert und ist unglaublich einfach zu erweitern. Es hat auch einige ziemlich nützliche Clustering-Algorithmen, die Funktionen zur Dimensionsreduktion unterstützen. Dies ist nützlich für Sie, wenn Ihre Matrix spärlich ist (das heißt, viele Tags, die nur sehr wenige Nutzungsstatistiken haben).

Schauen Sie sich auch Lucene an, um seine tfidf-Funktionen zum Clustering von Tags und Dokumenten zu verwenden. Überprüfen Sie auch Solr. Beides sind Apache-Projekte.

3

Recommendation Algorithm wäre sehr hilfreich, da es einen Standardalgorithmus für den Umgang mit Ihrem Zweck aufführt.

Aktualisiert:

Ich denke, was Sie ist Collaborative Quality Filtering und nicht nur Collaborative Filtering suchen, ich habe zu Papier beigefügten Link, hoffen, das hilft.

+0

Soweit ich es verstanden habe, basieren diese Algorithmen alle auf Benutzerbewertungen oder Ähnlichkeiten. –

+0

Sie berücksichtigen auch Produktspezifikationen. Sobald der Benutzer ein bestimmtes Produkt auswählt, werden andere relevante Empfehlungen entsprechend dem Produkttyp gegeben. – Rachel

+0

OK, auf welchen Algorithmus beziehen Sie sich?Amazon führt Item-Item-Berechnungen durch, jedoch nur für Teilmengen, die aus dem Benutzerverhalten generiert werden, und nicht für jedes Element, das mit jedem anderen Element des gesamten Sets verglichen wird. –

3

K-means clustering kann sein, was Sie wollen.

N. B .:

Die Anzahl der Cluster k ist ein Eingabeparameter: eine unpassende Wahl von k kann schlechte Ergebnisse liefern ... Es funktioniert sehr gut auf einigen Datensätzen, während kläglich auf andere scheitern.

Also sollten Sie überlegen, wie viele Cluster, wie viele Tags und welche Metrik.

Siehe auch Stapel   Überlauf questions/tagged/k-means.

1

Bevor Sie mit der Implementierung, Anpassung oder Verwendung der vorhandenen Bibliothek beginnen, stellen Sie sicher, dass Sie die Domäne kennen. etwas wie "Collective Intelligence in Action" zu lesen ist ein guter Anfang.

1

Sie möchten eine auf Elementen basierende kollaborative Filterung statt benutzerbasiert. Dafür gibt es eine Reihe von Algorithmen auf Google. Artikelbasierte Lösungen skalieren immer besser als benutzerbasierte Lösungen.Item based collaborative filtering in PHP hat einige einfach zu folgen Beispielcode und passt, was Sie suchen:

2

http://taste.sourceforge.net/old.html

Geschmack ist ein flexibles, schnelles Collaborative Filtering-Engine für Java. Die Engine nimmt Präferenzen für Artikel ("Geschmäcker") und gibt geschätzte Einstellungen für andere Artikel zurück. Zum Beispiel könnte eine Website, die Bücher oder CDs verkauft kaufen, um herauszufinden, welche CDs ein Kunde interessiert sein könnte zu hören.

Geschmack bietet eine breite Palette an Komponenten, aus denen Sie konstruieren ein individuelles recommender System aus einer Auswahl von Algorithmen. Geschmack ist entworfen, zu sein; betriebsbereit; Es ist für Leistung, Skalierbarkeit und Flexibilität ausgelegt. Es unterstützt eine Standard- EJB-Schnittstelle für J2EE-basierte Anwendungen, aber Geschmack ist nicht nur für Java; Es kann als externer Server ausgeführt werden, der die Empfehlung Logik für Ihre Anwendung über Web Dienste und HTTP verfügbar macht.

http://savannah.nongnu.org/projects/cofi/

Derzeit Programmierer, die Collaborative Filtering verwenden wollen, müssen die Literatur lesen und ihre eigenen Algorithmen zu implementieren. Mehr als oft nicht, Programmierer wahrscheinlich ihre eigenen Algorithmen und sie werden in der Regel produzieren suboptimale Algorithmen. Wir wollen eine Grundlage von bereits getesteten Algorithmen bauen und dokumentieren, dass in einem weiten Bereich von Kontexten von Forschung zu Anwendungen verwendet werden kann. Das Leitprinzip ist, dass das Design dünn sein sollte. Cofi will nicht alles für alle Menschen sein. Der Fokus liegt also auf , die sehr wenige Codezeilen liefert, und auf den Programmierer für angewiesen, der den notwendigen Kleber bereitstellt.

paar here

+0

Beachten Sie, dass "Geschmack" längst in Apache Mahout gerollt wurde. –

0

Sie haben zu entscheiden, was die Ahnlichkeitsmetrik auf die Besonderheiten Ihres Produktes und Ihren gesunden Menschenverstand beruht. Ist die Länge des Videos wichtig? Wenn ja, verdient es hohes Gewicht.

Verwandte Themen