Frage

Um in der Lage sein, RT eines bestimmten tweet zu erkennen, plane ich Hashes jeder formatiert tweet speichern in der Datenbank.

Was für Hashing-Algorithmus soll ich verwenden. Cryptic ist natürlich nicht wesentlich. Nur eine minimale Möglichkeit, ein Datum als etwas zu speichern, die dann miteinander verglichen werden können, wenn es das gleiche ist, auf effiziente Art und Weise.

Mein erster Versuch, dies war mit md5 Hashes verwenden. Aber ich dachte, es kann Algorithmen sein Hashing, die viel effizienter sind, als Sicherheit nicht erforderlich ist.

War es hilfreich?

Lösung

Sie versuchen, direkt einen String Hash? Builtin Typen können sofort gehasht werden, nur hash("some string") tun und Sie einige int bekommen. Es ist die gleiche Funktion Python verwendet für dictonarys, so ist es wahrscheinlich die beste Wahl.

Andere Tipps

Haben Sie wirklich brauchen überhaupt Hash? Twitter-Meldungen sind kurz genug (und Speicherplatz billig genug), dass es besser sein kann, zu speichern, nur die gesamte Nachricht, anstatt Taktzyklen zu essen, um es zu Hash.

Ich bin nicht vertraut mit Python (sorry, Ruby-Typ eingeben hier) aber man ein paar Dinge ausprobieren konnte.

Annahmen: Sie werden wahrscheinlich Hunderttausende von Tweets über die Zeit zu speichern, so dass ein Hash gegen „jeden Datensatz“ in der Tabelle ineffizient werden zu vergleichen. Auch RTs sind nicht immer Kohlenstoff Kopien des ursprünglichen Tweet. Schließlich ist der ursprüngliche Name des Autors in der Regel enthalten und einige der 140 Zeichen begrenzt in Anspruch nimmt. So könnten Sie vielleicht eine Lösung verwenden, die genauer als ein „dummen“ Hash übereinstimmt?

  1. Tagging & Indexing

    Tag und indizieren die Bestandteile die Nachricht in einer Standardmethode. Diese umfassen könnte gehasht # Behandlung von ...., at-markiert @ .... und URL-Strings als "Stichworte". Nach dem Entfernen Füllwörter und Zeichensetzung, könnten Sie auch behandeln die verbleibenden Wörter als Tags zu.

  2. schnelle Suche

    Datenbanken sind schrecklich bei der Suche nach mehrere Gruppenmitgliedschaft sehr schnell (ich nehme an, Ihr entweder mit Mysql oder Postgresql, welche auf diese schreckliche). Stattdessen versuchen Sie ein der Freitext Engines wie Sphinx Search . Sie sind sehr sehr schnell an mehrere Gruppenmitgliedschaft Lösung (d wenn die Überprüfung Schlüsselwörter sind vorhanden).

    Mit Sphinx oder ähnlich, suchen wir auf alle „Tags“ wir extrahiert. Diese wird wahrscheinlich eher klein zurückkehren Ergebnismenge von „potential ursprünglichen Tweets“. Dann vergleichen sie eins nach dem anderen Verwendung von Ähnlichkeits Matching-Algorithmus (Hier ist ein in Python http://code.google.com/p/pylevenshtein/)

Nun lassen Sie mich heißen Sie herzlich willkommen in der Welt von Text Mining .

Viel Glück!

echo ich Chris' Kommentar über keinen Hash überhaupt mit (Datenbank-Engine kann hoffentlich Index 140-Zeichen-Felder effizient).

Wenn Sie einen Hash verwenden wollten, MD5 wäre meine erste Wahl als gut (16 Bytes), gefolgt von SHA-1 (20 Byte).

Was auch immer Sie tun, verwenden Sie keine Sum-of-Zeichen. Ich kann nicht sofort mit einer Funktion kommen, die mehr Kollisionen (alle Anagramme Hash gleich) haben würden, und es ist langsamer!

$ python -m timeit -s 'from hashlib import md5' 'd=md5("There once was a man named Michael Finnegan.").digest()'
100000 loops, best of 3: 2.47 usec per loop
$ python -m timeit 'd=sum(ord(c) for c in "There once was a man named Michael Finnegan.")'
100000 loops, best of 3: 13.9 usec per loop

Es gibt ein paar Probleme hier. Zuerst RT ist nicht immer identisch sind. Einige Leute einen Kommentar ein. Andere ändern Sie die URL für die Tracking. Andere fügen in der Person, die sie RT'ing (was nicht die Urheber ist oder nicht).

Also, wenn du gehst den Tweet Hash, müssen Sie es von dem Tweet, um das Fleisch kochen nach unten, und nur dem Hash. Viel Glück.

Oben, jemand erwähnt, dass mit 32-Bit, beginnen Sie Kollisionen bei etwa 65K Tweets haben. Natürlich könnten Sie Kollisionen auf tweet # 2 haben. Aber ich denke, der Autor dieses Kommentars war verwirrt, da 2 ^ 16 = ~ 65K, aber 2 ^ 32 = ~ 4 Billionen Dollar. So haben Sie ein wenig mehr Raum gibt.

Ein besserer Algorithmus könnte sein, zu versuchen, die „einzigartig“ Teile des tweet abzuleiten, und Fingerabdruck es. Es ist nicht ein Hash, es ist ein Fingerabdruck von einem paar wichtigen Worten, die Einzigartigkeit definieren.

Nun, Tweets sind nur 140 Zeichen lang sein, so dass man sogar die gesamte tweet in der Datenbank speichern könnte ...

aber wenn Sie wirklich „hash“ wollen, dass sie irgendwie, ein einfacher Weg sein würde, zu nehmen, nur um die Summe der ASCII-Werte aller Zeichen in dem Tweet:

sum(ord(c) for c in tweet)

Natürlich, wenn Sie ein Spiel von Hashes haben, sollten Sie die Tweets selbst prüfen für Gleichheit, weil die Wahrscheinlichkeit, zwei Tweets zu finden, die den gleichen „sum-Hash“ geben wahrscheinlich nicht zu vernachlässigen ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top