Boardunity & Video Forum

Boardunity & Video Forum (https://boardunity.de/)
-   Projekt Forum (https://boardunity.de/projekt-forum-f21.html)
-   -   Idee: Foren vernetzen über ähnl. Themen (https://boardunity.de/idee-foren-vernetzen-ber-hnl-themen-t5005.html)

Jendrik 28.12.2008 18:40

Jetzt übertreibst du aber.

Bitte denke daran, das wir keine Größe wie Google haben. Wenn die sowas machen ist das ja noch ok, aber wir 3 (?) solle ein eigenes Datenbanksystem entwickeln?

Bitte denk dran, es muss nicht sofort perfekt sein! Wenn es funktioniert und sinnvolle Ergebnisse liefert, ist das schon ganz gut.

Vlt. ist die einfachste Lösung doch die Sinnvollste: Datensätze mit Link und Stichwörtern, keine Vernetzung, usw.

codethief 28.12.2008 18:46

Ja, stimmt. Vielleicht ist das fürs Erste doch ein wenig übertrieben. Aber die Vernetzung würde ich trotzdem beibehalten. Das scheint mir nämlich das einzige System zu sein, das einigermaßen gute Ergebnisse liefert.

Jendrik 28.12.2008 19:46

warum sollte ein System wie ich es unten beschrieben habe keine guten Ergebnisse liefern?

codethief 28.12.2008 21:04

Wie willst du denn die ähnlichen Themen genau herausfinden? Bisher hast du nur beschrieben, wie du die Stichwörter sammeln würdest.

Jendrik 28.12.2008 21:52

Ich schreibe ein Thema neu oder lese es nur, Frage der Implementierung.
Dabei wird lokal (auf dem Forum) ein Script eingebunden, das die Stichworte aus diesem Thema extrahiert und diese zusammen mit dem Link zu diesem Thema ans BUN sendet.

Dieses speichert den Datensatz ab, falls er noch nicht existiert.

Anschließend sucht das BUN anhand der Stichworte (vom neuen Thema) alle Datensätze hinaus, in denen auch eins dieser Stichworte (vom neuen Thema) als Stichwort (vom Datensatz) angegeben ist und sortiert diese danach, wie viele Stichworte (vom neuen Thema) in den einzelnen Datensätzen vorhanden sind.

codethief 28.12.2008 23:27

Hab gerade etwas entdeckt: Objektdatenbank ? Wikipedia

Jendrik 29.12.2008 13:19

Was sagts du denn zu meinem vorherigen Post?

codethief 29.12.2008 14:31

Oh entschuldige, hatte ganz vergessen zu antworten. :)
Dein Ansatz ist natürlich recht einfach und dennoch sicherlich nicht einmal schlecht, aber ich vermisse da ein wenig die Lernfähigkeit des Systems. Beispielsweise müssen wir ja davon ausgehen, dass Typfehler gemacht werden. Ein neuronales Netz könnte da eher Ausbesserungen vornehmen.
Außerdem gestaltet sich das Laden der ähnlichen Themen aus der Datenbank bei deinem System vermutlich schwieriger. Gehen wir mal davon aus, dass wir einen Crawler haben, der die Stichwörter eines Themas erfasst, und der von den Foren benachrichtigt wird, sobald ein neues Thema erstellt wurde, und einen Loader, der zu einem bereits in der Datenbank vorhandenen Thema die ähnlichen Themen liefert und an die Foren sendet. Bei deinem Ansatz müssten aufwändig die Stichwörter miteinander abgeglichen werden, bei Einsatz eines neuronalen Netzes (in Verbindung mit einer MySQL-Datenbank) könnte das in etwa so aussehen:

Code:

SELECT n2.* FROM nodes AS n1, nodes AS n2, links AS l WHERE n1.url='url_des_aufgerufenen_themas' AND l.node1 = n1.id AND l.node2 = n2.id AND n2.type = 'TOPIC' ORDER BY l.strength DESC LIMIT 5
(Keine Ahnung, ob das so stimmt, mein SQL ist ein wenig eingerostet, wie ich gerade feststellen musste. :()

Jendrik 29.12.2008 14:44

Keine Sorge meins ist noch eingerosteter. Kapiere rein garnichts.

codethief 29.12.2008 14:52

Kein Problem. :)
Code:

SELECT n2.* FROM nodes AS n1, nodes AS n2, links AS l WHERE n1.url='url_des_aufgerufenen_themas' AND l.node1 = n1.id AND l.node2 = n2.id AND n2.type = 'TOPIC' ORDER BY l.strength DESC LIMIT 5
heißt letztlich folgendes:
"Suche mir zu einem Thema mit der URL X Themen, die [über die Tabelle links] mit diesem Thema verbunden sind und sortiere sie absteigend nach der Stärke dieser Verbindung. Suche mir jedoch nicht alle heraus, sondern nur die obersten 5."

wurstbrot 29.12.2008 15:39

Hallo,

Ich schalt mich mal in die Diskussion ein, weil ich mich in dem Thema sehr gut auskenne (beweg mich mit meiner Dissertation in dieser Gegend). Die Berechnung der Ähnlichkeiten zwischen zwei Foren-Threads ist theoretisch einfach. Im einfachsten Fall verwendet man das Vektor-Raum-Modell von Salton, das jedes Wort als eigene Dimension in einem sehr hochdimensionalen Vektor realisiert. Die Ähnlichkeit wird dann in der Regel mit einem einfachen cosinus zwischen diesen beiden Vektoren berechnet. Im Prinzip sucht ihr dann nichts anderes wie alle Dokumente, die eine Mindestähnlichkeit haben. Soweit so "einfach".

Ein neuronales Netz dürfte euch dabei gar nichts bringen, weil ihr ja keine Muster erlernt. Das Problem ist auch nicht, dass ihr keine relevanten Seiten findet, sondern das Problem ist die extrem große Anzahl an Daten, die ihr handhaben musst, so dass das Problem nicht das "Auffinden" von verwandten Seiten ist, sondern vielmehr das Auffinden in verantwortbarer Zeit. Die Berechnung on the fly könnt ihr also vergessen, solang ihr nicht eine entsprechende Serverfarm habt.

Was man aber machen könnte wäre folgendes:

1. Zentrale Datenbank an Beiträgen (das ist braucht man auf jeden Fall, weil man die Daten ja vorrätig haben muss, sonst kann man nichts finden).
2. Nach einem neuen Post eines Benutzers wird der gesamte Thread an die zentrale Datenbank geschickt, welche die internen Daten aktualisiert und verwandte Seiten zurückliefert. Dieses Ergebnis kann ein paar Sekunden dauern und muss deshalb dann gespeichert werden.

Das wäre eine handhabbare Möglichkeit, die funktionieren müsste.

Wurstbrot

Jendrik 29.12.2008 15:40

Das klingt das schon mal verständlicher.
Also Stichworte rausfinden ist ja kein problem (relativ gesehen), aber um zu vermeiden das ähnliche Wörter in das Netz kommen könnte man ja die php funktion levenshtein levenshtein() benutzen.

//Edit: Da war wohl jemand schneller.

wurstbrot 29.12.2008 16:10

Hallo,

der Levenshtein-Abstand ist leider für die Anfrage viel zu langsam. Er wird in der Regel in der Vorverarbeitung für automatisierte Rechtschreibkorrekturen verwendet. State of the Art ist eben die Cosinus-Suche. Die Frage ist nur, ob auf binär-Daten (wort kommt vor oder nicht) wie große Suchmaschinen oder auf float-Werte (beachtet die Relevanz besser).

Und nochmal: ein neuronales Netz wird euch nicht viel helfen. Ein neuronales Netz ist ein Muster-Erkennungs-System. Das heißt, ihr könnt (theoretisch) jede beliebige Funktion mit einem neuronalen Netz approximieren. Das NN kann das dann nahezu perfekt nachbilden. Wenn ihr aber Foren vernetzen wollt, dann muss das System keine Funktion approximieren (es soll ja auch nicht die "Nähe" von gesamten Foren berechnen), sondern es soll relevante Beiträge aus anderen Foren anbieten, so dass der Besucher möglichst viel "relevanten" Inhalt angeboten bekommt und dadurch - hoffentlich - wieder kommt. Soweit hab ich das bisher in diesem Thread zumindest verstanden.

Ich wäre bereit, in den nächsten Wochen mal so ein System zusammen zu häcken. Wer hätte denn Interesse, aus seinem Forum die Daten dann zu übermitteln? Ich stelle mir gerade eine XML-RPC-Schnittstelle vor, die nach dem Übermitteln der Daten die relevanten Seiten im XML-Format zurückliefert.

Wurstbrot

Jendrik 29.12.2008 16:19

man, prügelt das untereinander aus welche methode die bessere ist!

Zum Levenshtein Abstand:
Ich meinte den könnte man für das NN verwenden und zu verhindern, das dort sehr ähnliche Wörter vorkommen, wie "Programmiersprache" und "Programmiersprachen"

Luki 29.12.2008 22:03

Hiho,

ich lese mich später gerne ausführlich durch die Theorien, aber ich würde das erstmal supersimpel machen, alle Threadtitel in einer Datenbank gesammelt/gespidert und anhand von einer Blacklist von der, die, das, hilfe etc. (hat vB auch) kann man schon den MySQL Match Befehl für ähnliche Themen verwenden (und ja das ist gigantisch performant und trifft ziemlich gut!)

Code:

MATCH(threadtopic) AGAINST ('$title') AS score
dafür muss man natürlich ein FULLTEXTINDEX setzen + das cacht MySQL automatisch!

Nicht viel anders macht es das vbulletin selbst bei der Boardunity :)
Performancesorgen habe ich aus Erfahrung nicht :)

Jendrik 30.12.2008 10:47

Da ist nur die Frage wie gut die Ergebnisse sind.

Ich persönlich stimme dir da zu, das einfach besser ist.

mE wird das wohl auf einen Versuch hinauslaufen.

codethief 30.12.2008 15:00

Zitat:

Zitat von Mathias
Die Berechnung der Ähnlichkeiten zwischen zwei Foren-Threads ist theoretisch einfach. Im einfachsten Fall verwendet man das Vektor-Raum-Modell von Salton, das jedes Wort als eigene Dimension in einem sehr hochdimensionalen Vektor realisiert. Die Ähnlichkeit wird dann in der Regel mit einem einfachen cosinus zwischen diesen beiden Vektoren berechnet.

Aber würde die Berechnung des Winkels zwischen solchen hochdimensionalen Vektoren nicht einen viel zu großen Rechenaufwand bedeuten?

Zitat:

Zitat von Mathias
Ein neuronales Netz dürfte euch dabei gar nichts bringen, weil ihr ja keine Muster erlernt.

Vielleicht habe ich mich auch ein wenig falsch ausgedrückt, so tief stecke ich in der Materie leider auch nicht drin. (Aber seit wann können neuronale Netze nur für Mustererkennung eingesetzt werden?)
Ich hatte eher an ein neuronales Netz zur Wissenrepräsentation gedacht. Ein semantisches Netz, welches ja eigentlich für die Wissenrepräsentation gedacht ist, betrachtet ja die unterschiedlichen Arten von Beziehungen zwischen Begriffen, was ich (u.a. der Einfachheit halber) durch eine reelle Zahl, wie in neuronalen Netzen, ersetzen wollte. Ebenso sollten auch Verbindungen zwischen den Begriffen wie in neuronalen Netzen aufgebaut werden, sodass ein Lernen des Systems möglich ist. Ziel war auch nicht, dass ich das Netz nach ähnlichen Themen frage und es sie mir eigenhändig ausspuckt, sondern ich sie mir selber aus dem Netz heraussuche (eben anhand der Stärke der Verbindungen zwischen den Begriffen).
Mag sein, dass ich da einige Konzepte durcheinandergebracht habe. Nichtsdestotrotz sieht das für mich immer noch nach einem brauchbaren Lösungsansatz aus.

Zitat:

Zitat von Mathias
Das Problem ist auch nicht, dass ihr keine relevanten Seiten findet, sondern das Problem ist die extrem große Anzahl an Daten, die ihr handhaben musst,

Das Problem besteht aus meiner Sicht bei allen unseren Lösungsansätzen, die darauf basieren, dass wir Stichwörter abgleichen.


@Luki: Ich bezweifle stark, dass die Ergebnisse dann gut sein werden. Jeder Autor betitelt Themen anders, manche so, dass man schon genau weiß, worum es im Thema geht, und manche eben nicht.

@Jendrik: Auf den ersten Blick scheint die levenshtein()-Funktion natürlich brauchbar zu sein, um Ähnlichkeiten zwischen Stichwörten festzustellen. Aber willst du wirklich jedes Stichwort mit jedem vergleichen?
Ich will deine Idee nicht schlecht reden, ich sage nur, dass die Lösung für dieses Problem der Tippfehler noch nicht komplett ist. ;)
Im Übrigen können wir das vielleicht zunächst auch erst einmal außer Acht lassen, denn so häufig treten Tippfehler ja nun auch nicht auf, als dass sie unser System kaputt machen würden.

JonnyX 30.12.2008 17:23

Müssen dann eigentlich alle Foren diese Systemvoraussetzungen erfüllen?

Oder wird es einen Server geben, der die Daten sammelt, den ansonsten wird dass schon wieder schwerer, da viele Foren diese Servervoraussetzungen nicht verwirklcihen können / wollen

Nur mal so aus reinem interesse, mitarbeiten kann ich eh nicht weil ich da einfach den Skill dazu habe aber die Idee an sich ist nice

codethief 30.12.2008 17:27

Nein, das wird voneinander getrennt. Die Foren müssten nichts anderes tun als das BUN über ein neues Thema zu benachrichtigen und sich die ähnlichen Themen zu holen und auf deren Server zu cachen.

Jendrik 30.12.2008 20:00

Ich würde gerne nochmal die Sache mit den Stichwörtern in Erinnerung bringen.

Das stellt mE den sinnvollsten Kompromiss zwischen Systemlast, Speicherplatzverbrauch und Qualität der Ergebnisse dar.

codethief 30.12.2008 20:12

Zitat:

Zitat von codethief (Beitrag 47056)
Außerdem gestaltet sich das Laden der ähnlichen Themen aus der Datenbank bei deinem System vermutlich schwieriger. Gehen wir mal davon aus, dass wir einen Crawler haben, der die Stichwörter eines Themas erfasst, und der von den Foren benachrichtigt wird, sobald ein neues Thema erstellt wurde, und einen Loader, der zu einem bereits in der Datenbank vorhandenen Thema die ähnlichen Themen liefert und an die Foren sendet. Bei deinem Ansatz müssten aufwändig die Stichwörter miteinander abgeglichen werden

Darauf bist du aber bisher noch gar nicht eingegangen?

Jendrik 30.12.2008 20:54

http://boardunity.de/idee-foren-vern...html#post47050 ?

Ich dachte eingentlich ich hätte das erklärt?
übersehen?

codethief 31.12.2008 00:15

Ja, schon. Nur ist das Abgleichen (und zwar Stück für Stück, Stichwort für Stichwort) extrem aufwendig und führt zu einer extrem hohen Systemlast. Deshalb wollte ich eben noch einmal darauf hinweisen, dass das (zumindest aus meiner Sicht) vielleicht noch nicht zu Ende gedacht war.
Man könnte natürlich alle Stichwörter zu einem Thema speichern und dann die Themen mittels MATCH AGAINST wie von Luki oben beschrieben miteinander vergleichen. Aber überlegt bitte, wie speicher- und rechenintensiv das dann wird.

Jendrik 31.12.2008 14:27

Also ich habe die Suchstichwörter 'Stichwort1', 'Stichwort2', 'Stichwort3'.

Dann für jedes Stichwort:
PHP-Code:

$result mysql_query"SELECT `id` FROM table WHERE (`words` LIKE '".$Stichwort."')"

Für jeden Datensatz (While( $i = mysql_fetch_object( $result ):
PHP-Code:

$array[$i->id] += 1

Und zum Schluss:
PHP-Code:

asort$array 

Somit habe ich am Ende ein Array, welches die Id des Themas (als Key) nach Anzahl der übereinstimmenden Stichwörtern sortiert enthält.

Davon kann ich mir dann zum bsp. die ersten drei Einträge nehmen.

codethief 31.12.2008 21:33

D.h. zum Einen speicherst du alle Stichwörter jedes Themas und gehst die zum Anderen dann auch noch Stück für Stück durch und führst dabei jeweils eine Query aus.

Funktioniert zwar mit Sicherheit, aber es dürfte das System allerdings nicht zu knapp belasten.
Aber da der Aufbau des Systems mit meinem übereinstimmen würde und der Unterschied nur darin bestünde, wie Daten gespeichert und geladen werden, könnten wir ja dann auch beides ausprobieren und Benchmarks erstellen (denn mein System dürfte beim Crawlen ordentlich Last verursachen). ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:43 Uhr.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25