Naive bayes Berechnung in sql

8

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.

  • P (Wort | beliebiges Dokument) sollte gleich sein word_count in total_entity_word für dieses Wort vorbei doc_count in total_entity_sum
  • P (Wort | Dokument erwähnt Entität x ) sollte gleich 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
  • P (word | document nicht sollte entity x ) sollte gleich sein ( 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 )
  • P (Dokument erwähnt Entität x ) sollte doc_count in each_entity_sum für diese Entitäts-ID über doc_count in total_entity_word entsprechen
  • P (Dokument erwähnt nicht entity x ) sollte 1 minus ( 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%     
ʞɔıu 13.04.2009, 15:21
quelle

5 Antworten

6

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:

Ссылка

    
ramanujan 19.04.2009 07:48
quelle
1

Hier ist eine einfache Version für SQL Server. Ich betreibe es auf einer kostenlosen SQL Express-Implementierung und es ist ziemlich schnell.

Ссылка

    
colin campbell 25.02.2014 16:21
quelle
0

Ich habe keine Zeit, um alle Ausdrücke für die NB Formel zu berechnen, aber hier ist die Hauptidee:

%Vor%

Beachten Sie, dass Sie leicht auf das vorherige Feld in SELECT verweisen können, indem Sie sie in korrelierten Unterabfragen verwenden (wie im Beispiel).

    
Quassnoi 13.04.2009 16:13
quelle
0

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.

    
ramanujan 19.04.2009 07:40
quelle
0

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: Ссылка

    
Patrick McCann 22.02.2011 17:54
quelle