Gruselige Ähnlichkeit der Website

Dies ist ein Artikel über ein Experiment von vor einigen Monaten, wie man Websites findet, die einander ähnlich sind. Die Ähnlichkeit von Websites ist für viele Dinge nützlich, einschließlich der Entdeckung neuer Websites zum Erkunden sowie des Vorschlagens ähnlicher Websites im zufälligen Erkundungsmodus von Marginalia Search. https://explore2.marginalia.nu/ Ein Link zu einer Slapdash-Schnittstelle zum Erkunden experimenteller Daten. Der gewählte Ansatz bestand darin, den Linkgraph zu verwenden, um verlinkte Websites von denselben Websites zu finden. Es stellte sich heraus, dass es bemerkenswert gut funktionierte.

Einige alternative Merkmalsräume hätten verwendet werden können, wie etwa TF-IDF-Daten. Die Verwendung von Incident-Links hat sich als überraschend leistungsfähig erwiesen, fast bis zu einem unheimlichen Grad, da es Ähnlichkeiten sogar zwischen Websites finden kann, die Marginalia nicht indexiert.

Insgesamt weist die Funktion viele Ähnlichkeiten mit dem Aufbau eines Empfehlungsalgorithmus vom Typ „Andere Käufer kauften auch“ auf und zeigt dabei auch, wie beängstigend sie sein können . Sie können keine Empfehlungsmaschine erstellen, ohne ein Profilerstellungstool zu erstellen. Es ist weitgehend dasselbe.

Wenn Sie beispielsweise den Website-Explorer an den Rand der Politik lenken, wird er diesen Webspace mit erschreckender Präzision abbilden.

https://explore2.marginalia.nu/search?domain=qanon.pub Die Nachbarn von qanon.pub Beachten Sie noch einmal, wie wenige dieser Websites tatsächlich von Marginalia indiziert werden. Nur Websites mit "MS"-Links sind! Der Rest ergibt sich aus den Daten. Auf der einen Seite faszinierend und cool, auf der anderen Seite zutiefst verstörend: Wenn ich eine solche Karte auf einem PC in meinem Wohnzimmer erstellen kann, stellen Sie sich vor, was mit einem Rechenzentrum alles möglich wäre.

Du denkst vielleicht: "Nun, was ist los? QAnon verdient die ganze Aufmerksamkeit, gib ihnen kein Versteck!". Abgesehen davon, dass diese Art von Tool genauso gut funktionieren könnte, um Demokratiebefürworter in Hongkong, Putin-Kritiker in Russland, Schwule in Uganda usw. zu erfassen.

Implementierungsdetails In der Praxis wird die Kosinusähnlichkeit verwendet, um die Ähnlichkeit zwischen Websites zu vergleichen. Dies ist vielleicht die am häufigsten verwendete statistische Methode beim maschinellen Lernen, aber sie hat auch andere Verwendungszwecke.

Kosinusähnlichkeit wird berechnet, indem das innere Produkt zweier Vektoren genommen und durch ihre Normen dividiert wird

ein x b p = --------- |a| |b| Wie Sie sich vielleicht aus der linearen Algebra erinnern, ist es ein Maß für die Menge zweier Vektoren, die "in die gleiche Richtung ziehen". Die Kosinus-Ähnlichkeit zweier identischer Vektoren ist eins, und für orthogonale Vektoren ist sie Null.

Diese Daten haben eine extrem hohe Dimensionalität, der Vektorraum besteht aus fast 10 Millionen Domänen, sodass die meisten "Standard"-Tools wie numpy/scipy die Daten nicht ohne eine ernsthafte Massage laden. Dieser Saft scheint es nicht wert zu sein, wenn es genauso einfach ist, das, was Sie brauchen, selbst zu rollen (was Sie wahrscheinlich sowieso tun müssten, um es in diese Werkzeuge zu bekommen, zufällige Zucht oder so etwas).

Da es sich bei den fraglichen Vektoren nur um Bitmaps handelt, kann das Vektorprodukt zu einer logischen UND-Verknüpfung vereinfacht werden, unabhängig davon, ob eine Website einen Link enthält oder nicht. Der erste Versuch, das Problem zu lösen, war die Verwendung von RoaringBitmaps.

DoppelkosinusÄhnlichkeit (RoaringBitmap a, RoaringBitmap b) { double andCardiality = RoaringBitmap.andCardiality(a, b); andCardinality /= Math.sqrt(a.getCardinality()); andCardinality /= Math.sqrt(b.getCardinality()); Rückkehr und Kardinalität; } Es funktioniert, aber es ist nur ein bisschen zu langsam, um praktikabel zu sein. Es ist notwendig, etwas Speicher für die Geschwindigkeit zu opfern. Roaring Bitmaps ist speichereffizient, aber eine Allzweckbibliothek. Es ist einfach, einen direkten Ersatz zu erstellen, der andCardinality() und getCardinality() nur so implementiert, dass die Besonderheiten der Daten berücksichtigt werden.

Ein einfacher 64-Bit-Bloom-Filter erspart einen Großteil der Berechnung, da viele Vektoren klein sind und sich nicht überlappen. Vektordaten werden in sortierten Listen gespeichert. Der sortierte Listenvergleich ist sehr schnell und Cache-freundlich, während er relativ wenig Speicher verbraucht. Das Speichern eines dichten Arrays würde RAM in der Größenordnung von Hunderten von Terabyte erfordern, also ist das nicht gut.

Der eigentliche Code, der der Kürze halber in Skizzenform umgeschrieben wurde, berechnet die Kardinalität und sieht so aus und läuft für diesen speziellen Anwendungsfall etwa 5-20x schneller als RoaringBitmaps:

int andCardiality(AndCardIntSet a, AndCardIntSet b) { if ((a.hash & b.hash) == 0) { gibt 0 zurück; } int i = 0, j = 0; int map = 0; Machen { int diff = a.backingList.getQuick(i) - b.backingList.getQuick(j); ...

Gruselige Ähnlichkeit der Website
Dies ist ein Artikel über ein Experiment von vor einigen Monaten, wie man Websites findet, die einander ähnlich sind. Die Ähnlichkeit von Websites ist für viele Dinge nützlich, einschließlich der Entdeckung neuer Websites zum Erkunden sowie des Vorschlagens ähnlicher Websites im zufälligen Erkundungsmodus von Marginalia Search. https://explore2.marginalia.nu/ Ein Link zu einer Slapdash-Schnittstelle zum Erkunden experimenteller Daten. Der gewählte Ansatz bestand darin, den Linkgraph zu verwenden, um verlinkte Websites von denselben Websites zu finden. Es stellte sich heraus, dass es bemerkenswert gut funktionierte.

Einige alternative Merkmalsräume hätten verwendet werden können, wie etwa TF-IDF-Daten. Die Verwendung von Incident-Links hat sich als überraschend leistungsfähig erwiesen, fast bis zu einem unheimlichen Grad, da es Ähnlichkeiten sogar zwischen Websites finden kann, die Marginalia nicht indexiert.

Insgesamt weist die Funktion viele Ähnlichkeiten mit dem Aufbau eines Empfehlungsalgorithmus vom Typ „Andere Käufer kauften auch“ auf und zeigt dabei auch, wie beängstigend sie sein können . Sie können keine Empfehlungsmaschine erstellen, ohne ein Profilerstellungstool zu erstellen. Es ist weitgehend dasselbe.

Wenn Sie beispielsweise den Website-Explorer an den Rand der Politik lenken, wird er diesen Webspace mit erschreckender Präzision abbilden.

https://explore2.marginalia.nu/search?domain=qanon.pub Die Nachbarn von qanon.pub Beachten Sie noch einmal, wie wenige dieser Websites tatsächlich von Marginalia indiziert werden. Nur Websites mit "MS"-Links sind! Der Rest ergibt sich aus den Daten. Auf der einen Seite faszinierend und cool, auf der anderen Seite zutiefst verstörend: Wenn ich eine solche Karte auf einem PC in meinem Wohnzimmer erstellen kann, stellen Sie sich vor, was mit einem Rechenzentrum alles möglich wäre.

Du denkst vielleicht: "Nun, was ist los? QAnon verdient die ganze Aufmerksamkeit, gib ihnen kein Versteck!". Abgesehen davon, dass diese Art von Tool genauso gut funktionieren könnte, um Demokratiebefürworter in Hongkong, Putin-Kritiker in Russland, Schwule in Uganda usw. zu erfassen.

Implementierungsdetails In der Praxis wird die Kosinusähnlichkeit verwendet, um die Ähnlichkeit zwischen Websites zu vergleichen. Dies ist vielleicht die am häufigsten verwendete statistische Methode beim maschinellen Lernen, aber sie hat auch andere Verwendungszwecke.

Kosinusähnlichkeit wird berechnet, indem das innere Produkt zweier Vektoren genommen und durch ihre Normen dividiert wird

ein x b p = --------- |a| |b| Wie Sie sich vielleicht aus der linearen Algebra erinnern, ist es ein Maß für die Menge zweier Vektoren, die "in die gleiche Richtung ziehen". Die Kosinus-Ähnlichkeit zweier identischer Vektoren ist eins, und für orthogonale Vektoren ist sie Null.

Diese Daten haben eine extrem hohe Dimensionalität, der Vektorraum besteht aus fast 10 Millionen Domänen, sodass die meisten "Standard"-Tools wie numpy/scipy die Daten nicht ohne eine ernsthafte Massage laden. Dieser Saft scheint es nicht wert zu sein, wenn es genauso einfach ist, das, was Sie brauchen, selbst zu rollen (was Sie wahrscheinlich sowieso tun müssten, um es in diese Werkzeuge zu bekommen, zufällige Zucht oder so etwas).

Da es sich bei den fraglichen Vektoren nur um Bitmaps handelt, kann das Vektorprodukt zu einer logischen UND-Verknüpfung vereinfacht werden, unabhängig davon, ob eine Website einen Link enthält oder nicht. Der erste Versuch, das Problem zu lösen, war die Verwendung von RoaringBitmaps.

DoppelkosinusÄhnlichkeit (RoaringBitmap a, RoaringBitmap b) { double andCardiality = RoaringBitmap.andCardiality(a, b); andCardinality /= Math.sqrt(a.getCardinality()); andCardinality /= Math.sqrt(b.getCardinality()); Rückkehr und Kardinalität; } Es funktioniert, aber es ist nur ein bisschen zu langsam, um praktikabel zu sein. Es ist notwendig, etwas Speicher für die Geschwindigkeit zu opfern. Roaring Bitmaps ist speichereffizient, aber eine Allzweckbibliothek. Es ist einfach, einen direkten Ersatz zu erstellen, der andCardinality() und getCardinality() nur so implementiert, dass die Besonderheiten der Daten berücksichtigt werden.

Ein einfacher 64-Bit-Bloom-Filter erspart einen Großteil der Berechnung, da viele Vektoren klein sind und sich nicht überlappen. Vektordaten werden in sortierten Listen gespeichert. Der sortierte Listenvergleich ist sehr schnell und Cache-freundlich, während er relativ wenig Speicher verbraucht. Das Speichern eines dichten Arrays würde RAM in der Größenordnung von Hunderten von Terabyte erfordern, also ist das nicht gut.

Der eigentliche Code, der der Kürze halber in Skizzenform umgeschrieben wurde, berechnet die Kardinalität und sieht so aus und läuft für diesen speziellen Anwendungsfall etwa 5-20x schneller als RoaringBitmaps:

int andCardiality(AndCardIntSet a, AndCardIntSet b) { if ((a.hash & b.hash) == 0) { gibt 0 zurück; } int i = 0, j = 0; int map = 0; Machen { int diff = a.backingList.getQuick(i) - b.backingList.getQuick(j); ...

What's Your Reaction?

like

dislike

love

funny

angry

sad

wow