Ich möchte naive Bücher verwenden, um Dokumente in eine relativ große Anzahl von Klassen zu klassifizieren. Ich möchte bestätigen, ob eine Erwähnung eines Entitätsnamens in einem Artikel wirklich diese Entität ist, basierend darauf, ob dieser Artikel Artikeln ähnlich ist, in denen diese Entität korrekt verifiziert wurde.
Sagen wir, wir finden den Text "General Motors" in einem Artikel. Wir haben eine Reihe von Daten, die Artikel und die richtigen Entitäten enthält, die in erwähnt. So, wenn wir gefunden haben "General Motors" in einem neuen Artikel erwähnt, sollte es in diese Klasse von Artikeln in den früheren Daten, die eine bekannte echte enthalten Erwähnen Sie "General Motors" gegen die Klasse von Artikeln, die diese Entität nicht erwähnt haben?
(Ich erstelle keine Klasse für jede Entität und versuche, jeden neuen Artikel in jede mögliche Klasse zu klassifizieren. Ich habe bereits eine heuristische Methode, um plausible Erwähnungen von Entitätsnamen zu finden, und ich möchte nur die Plausibilität der begrenzte Anzahl von Objektnamen-Erwähnungen pro Artikel, die die Methode bereits erkennt.)
Da die Anzahl potentieller Klassen und Artikel ziemlich groß ist und naive Bayes relativ einfach ist, wollte ich das Ganze in SQL machen, aber ich habe Probleme mit der Scoring-Abfrage ...
Folgendes habe ich bisher:
%Vor% Jeder Artikel in den markierten Daten wird in verschiedene Wörter aufgeteilt und für jeden Artikel für jede Entität wird jedes Wort zu each_entity_word
hinzugefügt und / oder seine word_count
wird erhöht und doc_count
wird in entity_word_sum
erhöht. beide in Bezug auf entity_id
. Dies wird für jede Einheit wiederholt, von der bekannt ist, dass sie in diesem Artikel erwähnt wird.
Für jeden Artikel, unabhängig von den darin enthaltenen Entitäten, wird für jedes Wort total_entity_word
total_entity_word_sum
ähnlich inkrementiert.
word_count
in total_entity_word
für dieses Wort vorbei
doc_count
in total_entity_sum
word_count
in sein
each_entity_word
für dieses Wort für entity_id
x über doc_count
in
each_entity_sum
für entity_id
x
word_count
in total_entity_word
minus word_count
in each_entity_word
dafür Wort für diese Entität) over (die doc_count
in total_entity_sum
minus doc_count
für diese Entität in each_entity_sum
) doc_count
in each_entity_sum
für diese Entitäts-ID über doc_count
in total_entity_word
entsprechen
doc_count
in each_entity_sum
für x 's Entitäts-ID über doc_count
in% sein co_de%). Für einen neuen Artikel, der hereinkommt, teilen Sie ihn in Wörter und wählen Sie einfach, wo Wort in ('I', 'wollen', 'zu', 'verwenden' ...) gegen total_entity_word
oder each_entity_word
. In der db-Plattform, mit der ich arbeite, sind (mysql) IN-Klauseln relativ gut optimiert.
Es gibt auch keine product () - Aggregatfunktion in sql. Sie können also einfach sum (log (x)) oder exp (Summe (log (x))) verwenden, um das Äquivalent von Produkt (x) zu erhalten.
Also, wenn ich einen neuen Artikel bekomme, ihn in verschiedene Wörter zerlege und diese Wörter in eine große IN () - Klausel und eine potentielle Entitäts-ID zum Testen bringe, wie bekomme ich die naive Bayesianische Wahrscheinlichkeit, dass der Artikel fällt in die Klasse dieser Entity-ID in SQL?
BEARBEITEN:
Versuchen Sie # 1:
%Vor%Verwenden Sie eine R to Postgres (oder MySQL usw.) Schnittstelle
Alternativ würde ich empfehlen, ein festgelegtes Statistikpaket mit einem Konnektor zur Datenbank zu verwenden. Dadurch wird Ihre App viel flexibler, wenn Sie von Naive Bayes zu etwas anspruchsvolleren wechseln möchten:
%Vor%Sie wollen dann das e1071-Paket installieren, um Naive Bayes zu machen. An der R-Eingabeaufforderung:
%Vor%Weitere Informationen:
Hier ist eine einfache Version für SQL Server. Ich betreibe es auf einer kostenlosen SQL Express-Implementierung und es ist ziemlich schnell.
Wenn Sie Oracle verwenden, ist Data Mining eingebaut
Ich bin mir nicht sicher, welche db Sie ausführen, aber wenn Sie Oracle verwenden, werden Data Mining-Funktionen in die Datenbank eingebunden:
... einschließlich Naive Bayes:
und eine Menge anderer:
Das war überraschend für mich. Definitiv einer der Wettbewerbsvorteile, die Oracle gegenüber den Open-Source-Alternativen in diesem Bereich hat.
Hier ist ein Blog-Post, der genau beschreibt, wonach Sie suchen: Ссылка
Ich habe viele Versionen von NB-Klassifizierern in SQL programmiert. Die obigen Antworten für wechselnde Analysepakete waren nicht skalierbar auf meine hohen Anforderungen an Daten und Verarbeitungszeit. Ich hatte eine Tabelle mit einer Zeile für jede Wort / Klassen-Kombination (nrows = Wörter * Klassen) und eine Koeffizientenspalte. Ich hatte eine andere Tabelle mit einer Spalte für Dokument-ID und Wort. Ich habe gerade diese Tabellen auf Wort, gruppiert nach Dokument, zusammengefügt und die Koeffizienten summiert und dann die Summen für die Klassenwahrscheinlichkeit angepasst. Das hat mir eine Tabelle mit document_id, class, score hinterlassen. Ich habe dann einfach die Mindestpunktzahl gewählt (da ich einen ergänzenden naiven Bay-Ansatz gewählt habe, was meiner Meinung nach in einer Mehrklassensituation besser funktioniert hat).
Als Nebenbemerkung habe ich festgestellt, dass viele Transformationen / Algorithmus-Modifikationen meine Holdout-Vorhersagen sehr verbessert haben. Sie werden in der Arbeit von Jason Rennie über "Die schlechten Annahmen von naiven Bayes-Textklassifizierern" beschrieben und hier zusammengefasst: Ссылка
Tags und Links sql mysql machine-learning nlp bayesian