Frage Python und Tfidf-Algorithmus, machen es schneller?


Ich implementiere das tf-idf Algorithmus in einer Webanwendung mit Python, jedoch läuft es extrem langsam. Was ich grundsätzlich mache ist:

1) Erstellen Sie 2 Wörterbücher:

  • Erstes Wörterbuch: Schlüssel (Dokument-ID), Wert (Liste aller gefundenen Wörter (inkl. Wiederholung) in doc)
  • Zweites Wörterbuch; Schlüssel (Dokument-ID), Wert (Satz enthält eindeutige Wörter des Dokuments)

Jetzt gibt es eine Petition eines Benutzers, um tfidf Ergebnisse von Dokument d zu erhalten. Was ich mache ist:

2) Wiederholen Sie die eindeutigen Wörter des zweiten Wörterbuchs für das Dokument d und für jedes eindeutige Wort w get:

2.1) tf score (wie oft erscheint w in d: loop über die Wörterliste des ersten Wörterbuchs für das Dokument)

2.2) df score (wie viele Dokumente enthalten w: Schleife über den Satz von Wörtern aller Dokumente (zweites Wörterbuch) und prüfen, ob w enthalten ist). Ich benutze ein Set, da es schneller zu prüfen scheint, ob ein Set ein Wort im Vergleich zu einer Liste enthält.

Schritt 2.2 ist schrecklich langsam. Wenn beispielsweise 1000 Dokumente vorliegen und ein Dokument 2313 eindeutige Wörter enthält, dauert die Ausgabe der Ergebnisse etwa 5 Minuten.

Gibt es eine andere Möglichkeit, Schritt 2.2 schneller zu machen? Sind Wörterbücher langsam zum Iterieren?


5
2017-08-27 16:35


Ursprung


Antworten:


Nun, Sie müssen die Art und Weise, wie Sie Ihre Daten halten, neu überdenken und neu entwerfen, oder mit anderen Worten, eine "orthodoxe" Version Ihres "invertierten Index" implementieren.

Ihr Engpass ist die "on-the-fly" Berechnung der Dokumentenhäufigkeit (DF) für die Begriffe. Es wäre eine clevere Idee, dies dynamisch zu gestalten, also jedes Mal, wenn Sie Ihr Korpus aktualisieren (Sammlung von Dokumenten), einige Verarbeitungen vornehmen und die DFs für jeden Ausdruck in einem Dokument aktualisieren (und natürlich die Ergebnisse auf beständige Weise speichern) , aka eine Datenbank etc ..).

Die einzige Struktur, die Sie brauchen, ist ein verschachteltes Wörterbuch wie dieses

{ "term1" : { "DF" : x, "some_doc_id" : tf , "some_other_doc_id" : tf, etc  } ,
  "term2" : ...
  etc..
}

wird jedes Mal aktualisiert, wenn Sie Ihren Korpus "füttern".

Und natürlich, halte deine Korpuskardinalität irgendwo ...

Als Hobby und Teil meiner Arbeit implementiere ich eine Python - Redis - unterstützte kleine Suchmaschine. Sie könnten auch andere Ideen bekommen. Schau mal Hier.


5
2017-08-27 17:03



Ist das ein akademisches Unterfangen oder machst du es für die Produktion? Wenn Sie für die Produktion implementieren, warum verwenden Sie nicht bereits verfügbares http://code.google.com/p/tfidf/) Auf der anderen Seite, wenn Sie es als eine akademische Übung tun, kann ich immer noch einen Blick auf eine bestehende Implementierung werfen, um zu sehen, was sie anders machen (wenn überhaupt).

Ich würde auch vorschlagen, zu verwenden cProfile um Ihren Code zu profilieren, um zu sehen, wo die Kosten liegen.


3
2017-08-27 16:42