Berechnen Sie mithilfe des in Python 3.3 implementierten Naive Bayes-Klassifikators die Ähnlichkeit aus der Häufigkeit des gleichzeitigen Auftretens von Wörtern in Sätzen und Zeichenfolgen.

** Dieser Beitrag ist der Artikel zum dritten Tag von Real Escape Advent Calendar 2013. ** ** **

Fassen Sie den Inhalt dieser Zeit in 3 Zeilen zusammen

Ich habe den Code auf Github zusammengestellt. https://github.com/katryo/bing_search_naive_bayes_sim

Inhaltsangabe bis Letztes Mal

--Suchen Sie das Web mit der Bing-API

Ich habe ein solches System gemacht.

Diesmal wurden Funktionen hinzugefügt

Mehr Details

Es wurden zwei Arten von Ähnlichkeitsberechnungsfunktionen hinzugefügt.

Theorie

Zwei Arten von Ähnlichkeitsberechnungsmethoden

Kosinusähnlichkeit

Berechnen Sie den Cosinus der beiden Vektoren und verwenden Sie den Cosinuswert als Ähnlichkeit. Die Anzahl der Dimensionen des Vektors kann 2, 3 oder 100 betragen (spezifische Beispiele werden später beschrieben). Mit zunehmender Anzahl von Dimensionen steigen jedoch natürlich die Berechnungskosten. Daher ist es besser, wenn Sie Möglichkeiten zur Reduzierung der Anzahl von Dimensionen entwickeln können (z. B. das Nichtzählen von Wörtern, die in tfidf zu häufig vorkommen). Übrigens habe ich mir diesmal nichts ausgedacht.

Simpson-Koeffizient

Im Gegensatz zur Kosinusähnlichkeit wird die Ähnlichkeit berechnet, indem zwei "Wortbeutel" anstelle von Vektoren verglichen und die Anzahl der Wörter verwendet werden, die sie gemeinsam haben. Die Frequenz spielt keine Rolle.

Wie Sie anhand des Codes sehen können, wird dasselbe Wort 100 Mal in einer Kategorie (oder in einer Eingabezeichenfolge) oder nur einmal vorkommt (es spielt also keine Rolle!). .. Selbst wenn dasselbe Wort wiederholt vorkommt, erhöht es die Punktzahl nicht.

Auftrittswahrscheinlichkeit und Ähnlichkeit von Naive Bayes

Auftrittswahrscheinlichkeit

Angenommen, Sie möchten die Wahrscheinlichkeit berechnen, dass ein Wort, das Naive Bayes ist (z. B. "Untersuchung"), in eine Kategorie fällt (z. B. "Pollinose").

Wie in 1st erläutert, ist die Wahrscheinlichkeit recht gering. Es ist in üblicher Weise weniger als 0,01.

Außerdem ist diesmal die Eingabe in die Klassifizierung ein Satz, kein Wort. Da mit MeCab eine morphologische Analyse durchgeführt wird, um eine Wortsammlung zu erstellen, die als Satz von Wörtern berechnet wird, ist die Wahrscheinlichkeit sogar noch geringer.

In Naive Bays fällt die Wahrscheinlichkeit, dass der Satz "Wenn Sie an Pollinose leiden, sollten Sie zuerst eine HNO-Klinik aufsuchen" in die Kategorie "Pollinose" fällt, etwa 0,0000 ... 1.

Es ist jedoch viel höher als die Wahrscheinlichkeit, in andere Kategorien zu fallen (wie "Fraktur" und "Magenneigung"). Relativ, aber bei weitem am höchsten. Daher ist es am wahrscheinlichsten, dass "Wenn Sie an Pollinose leiden, sollten Sie zuerst eine HNO-Klinik aufsuchen" in der Kategorie "Pollinose". Das heißt, die Wahrscheinlichkeit ist hoch.

Ähnlichkeitsgrad

Ähnlichkeit ist eine völlig andere Idee als die Wahrscheinlichkeit des Auftretens. Wie die Ähnlichkeit zwischen einer Reihe von Wörtern definiert und berechnet wird, hängt von der Methode ab.

Weitere Informationen finden Sie unter Shoto-sans Blog-Artikel und [Datenanalyse / Mining-Welt nach SAS-Wiki-Seite](http: // wikiwiki). .jp / Rohrkolben /?% CE% E0% BB% F7% C5% D9% A4% C8% B5% F7% CE% A5) und Zusammenfassung der Ähnlichkeitsskala Ich denke, Sie sollten um .jp / naid / 110006440287) lesen.

Dieses Mal wurde die Ähnlichkeit unter Verwendung der Kosinusähnlichkeit und des Simpson-Koeffizienten berechnet, es gibt jedoch verschiedene Methoden zur Berechnung der Ähnlichkeit, beispielsweise unter Verwendung des Jaccard-Koeffizienten und des Würfelkoeffizienten. Verwenden wir es entsprechend dem Zweck und dem Umfang der Berechnung richtig.

Code

  1. Ähnlichkeitsrechner
  2. Berechnen Sie die Ähnlichkeit, indem Sie sie in das erstellte System integrieren

Der Code, den ich gemacht habe, kann in zwei Teile geteilt werden.

1. Ähnlichkeitsrechner

Zuerst habe ich die folgende SimCalculator-Klasse erstellt.

sim_calculator.py


import math


class SimCalculator():
    def _absolute(self, vector):
        #Gibt die Länge oder den Absolutwert des Vektors v zurück
        squared_distance = sum([vector[word] ** 2 for word in vector])
        distance = math.sqrt(squared_distance)
        return distance

    def sim_cos(self, v1, v2):
        numerator = 0
        #Wenn v1 und v2 einen gemeinsamen Schlüssel haben, wird das Produkt der Werte hinzugefügt. Es ist das innere Produkt zweier Vektoren.
        for word in v1:
            if word in v2:
                numerator += v1[word] * v2[word]
        
        denominator = self._absolute(v1) * self._absolute(v2)

        if denominator == 0:
            return 0
        return numerator / denominator

    def sim_simpson(self, v1, v2):
        intersection = 0
        #Zählen der Anzahl der Schlüssel, die v1 und v2 gemeinsam haben
        for word in v2:
            if word in v1:
                intersection += 1
        denominator = min(len(v1), len(v2))

        #Wenn der Inhalt von v1 oder v2 0 ist
        if denominator == 0:
            return 0
        return intersection / denominator

if __name__ == '__main__':
    sc = SimCalculator()
    print('Kosinusähnlichkeit ist' + str(sc.sim_cos({'Life Hack': 1, 'Fraktur': 2}, {'Life Hack': 2, 'Arbeitsplätze': 1, 'Hobby': 1})))
    print('Die durch den Simpson-Koeffizienten berechnete Ähnlichkeit beträgt' + str(sc.sim_simpson({'Life Hack': 1, 'Fraktur': 2}, {'Life Hack': 2, 'Arbeitsplätze': 1, 'Hobby': 1})))

Bei der Ausführung ist das Ergebnis wie folgt.

Die Kosinusähnlichkeit ist 0.3651483716701107
Die durch den Simpson-Koeffizienten berechnete Ähnlichkeit beträgt 0.5

Die in der sim_cos-Methode verwendete Methode _absolute, die die Kosinusähnlichkeit berechnet, berechnet die Länge (Absolutwert, Größe) des Vektors. Der Vektor wird hier durch Wörter wie "Life Hack" und "Fraktur" dargestellt. Zum Beispiel im obigen Code

{„Life Hack': 1, 'Fraktur': 2}

Ist ein zweidimensionaler Vektor.

Referenz http://www.rd.mmtr.or.jp/~bunryu/pithagokakutyou.shtml

2. Berechnen Sie die Ähnlichkeit, indem Sie sie in das erstellte System integrieren

Integrieren Sie den in 1 erstellten Ähnlichkeitsrechner in zuletzt erstellter Naive Bayes-Klassifikator.

Mit anderen Worten wird eine Funktion zum Berechnen der Ähnlichkeit zwischen der Standardeingabezeichenfolge und der Kategorie (Wortbeutel der eingegebenen Trainingsdaten) hinzugefügt.

Übrigens klassifiziert es nicht nach Naive Bayes, sondern verwendet nur das Ergebnis, das vom Naive Bayes-Objekt gelernt wurde.

Führen Sie den folgenden Code aus, um ein Terminal-Tool zu werden, das gleichzeitig Klassifizierungs- und Ähnlichkeitsberechnungen durchführen kann.

calc_similarity.py


from sim_calculator import SimCalculator
from naive_bayes import NaiveBayes
import constants
import pickle
import sys
import pdb
from collections import OrderedDict


if __name__ == '__main__':
    sc = SimCalculator()
    with open(constants.NB_PKL_FILENAME, 'rb') as f:
        nb_classifier = pickle.load(f)

    #Zug und Wort für die Standardeingabezeichenfolge_Count verwenden{'input': {'Sugi Pollen': 4, 'Medizin':3}}Ich habe es zu einem NB-Objekt gemacht, um es im Format zu formatieren
    #Ich benutze es nicht als Klassifikator, also sollte ich eigentlich eine andere Klasse erstellen, aber es ist ärgerlich.
    nb_input = NaiveBayes()

    for query in sys.stdin:
        nb_input.word_count = {}  #Initialisierung für die zweite und nachfolgende Eingabe
        nb_input.train(query, 'input')  #Die in die Standardeingabe eingegebene Zeichenfolge'input'Lernen Sie als Kategorie
        results = OrderedDict()
        for category in nb_classifier.word_count:
            # sim_sim statt cos_Sie können auch simpson verwenden
            sim_cos = sc.sim_cos(nb_input.word_count['input'], nb_classifier.word_count[category])
            results[category] = sim_cos

        for result in results:
            print('Kategorie "%Der Grad der Ähnlichkeit mit "s"%f' % (result, results[result]))

        # http://cointoss.hatenablog.com/entry/2013/10/16/Ich kann den Maximalschlüssel nicht erhalten, selbst wenn ich 123129 folge(´ ・ ω ・`)
        best_score_before = 0.0
        best_category = ''
        for i, category in enumerate(results):
            if results[category] > best_score_before:
                best_category = category
                best_score_before = results[category]
        try:
            print('Die Kategorie mit dem höchsten Ähnlichkeitsgrad ist "%s "und die Ähnlichkeit ist%f' % (best_category, results[best_category]))
        except KeyError:  #Wenn die Eingabe leer ist
            continue

Tun Sie dies und geben Sie die entsprechende Zeichenfolge ein.

Um die Pollinose so einfach wie möglich zu überwinden, ist es wichtig, geeignete Maßnahmen gegen die Pollinose zu ergreifen. Einführung der grundlegenden Maßnahmen zur Pollinose, die Sie selbst durchführen können, des Pollinose-Tagebuchs und der falschen Maßnahmen zur Pollinose.

Hier ist das Ergebnis der Eingabe der Zeichenfolge aus Geeignete Seite.

Die Ähnlichkeit mit der Kategorie "Magenneigung" ist 0.362058
Die Ähnlichkeit mit der Kategorie "Wurmzahn" ist 0.381352
Die Ähnlichkeit mit der Kategorie "Gegenmaßnahmen gegen Pollinose" ist 0.646641
Die Ähnlichkeit mit der Kategorie "Depression" ist 0.250696
Die Ähnlichkeit mit der Kategorie "Maschine" ist 0.300861
Die Ähnlichkeit zur Kategorie "Fraktur" ist 0.238733
Die Ähnlichkeit mit der Kategorie "steife Schultern" ist 0.326560
Die Ähnlichkeit mit der Kategorie "Dokumente" ist 0.333795
Die Kategorie mit dem höchsten Ähnlichkeitsgrad ist "Gegenmaßnahmen gegen Pollinose" und der Ähnlichkeitsgrad ist 0..646641

Ja, das ist das Ergebnis.

Geben Sie den Text von [hier] ein (http://matome.naver.jp/odai/2137329123912824901).

Als ich Teenager und Zwanzig war, wenn es um gegrilltes Fleisch ging, war es natürlich, Calvi, Tonkatsu als Lende und Ramen als Tonkotsu zu verwenden. Ich habe es geliebt, aber es wird nach und nach entfremdet

Es ist ein Satz, der dich krank zu machen scheint. Wenn Sie dies eingeben.

Die Ähnlichkeit mit der Kategorie "Magenneigung" ist 0.398943
Die Ähnlichkeit mit der Kategorie "Wurmzahn" ist 0.425513
Die Ähnlichkeit mit der Kategorie "Gegenmaßnahmen gegen Pollinose" ist 0.457718
Die Ähnlichkeit mit der Kategorie "Depression" ist 0.300388
Die Ähnlichkeit mit der Kategorie "Maschine" ist 0.340718
Die Ähnlichkeit zur Kategorie "Fraktur" ist 0.256197
Die Ähnlichkeit mit der Kategorie "steife Schultern" ist 0.339602
Die Ähnlichkeit mit der Kategorie "Dokumente" ist 0.322423
Die Kategorie mit dem höchsten Ähnlichkeitsgrad ist "Gegenmaßnahmen gegen Pollinose" und der Ähnlichkeitsgrad ist 0..457718

Das ... ich fühle keinen "Magen" ...?

Berechnen Sie abschließend die Ähnlichkeit des Wurmzahntextes aus hier.

Ursachen für Karies, Behandlungen, Präventionsmethoden, Kinder(Milchzahn)Detaillierte Erklärung der Wurmzähne, Behandlungskosten usw. Bild der Wurmzähne(Foto)Und auch über die Behandlung der frühen Karies

Was wird es sein?

Die Ähnlichkeit mit der Kategorie "Magenneigung" ist 0.404070
Die Ähnlichkeit mit der Kategorie "Wurmzahn" ist 0.445692
Die Ähnlichkeit mit der Kategorie "Gegenmaßnahmen gegen Pollinose" ist 0.427097
Die Ähnlichkeit mit der Kategorie "Depression" ist 0.306610
Die Ähnlichkeit mit der Kategorie "Maschine" ist 0.381016
Die Ähnlichkeit zur Kategorie "Fraktur" ist 0.241813
Die Ähnlichkeit mit der Kategorie "steife Schultern" ist 0.346461
Die Ähnlichkeit mit der Kategorie "Dokumente" ist 0.394373
Die Kategorie mit dem höchsten Ähnlichkeitsgrad ist "Wurmzahn" und der Ähnlichkeitsgrad ist 0..445692

War gut.

Es ist wahrscheinlich, dass der Grund, warum der Text, der sich auf den Magen zu stützen scheint, als Gegenmaßnahme gegen Pollinose beurteilt wurde, darin bestand, dass es viel Lärm gab.

Wörter wie "o" und "ha" erscheinen in jeder Kategorie. Diese sind aus menschlicher Sicht für die Kategorisierung nicht nützlich, aber da die obige Methode die Ähnlichkeit einfach basierend auf der Häufigkeit aller vorkommenden Wörter berechnet, wird sie für die Ähnlichkeitsberechnung verwendet.

Die Leistung kann verbessert werden, indem das Gewicht häufiger Wörter verringert und das Gewicht seltener Wörter erhöht wird, beispielsweise durch Verwendung von tf-idf.

Ergänzung

Wie ich in den Kommentaren geschrieben habe, habe ich die Standardeingabe in das NaiveBayes-Objekt nb_input eingefügt. Dies liegt daran, dass die train-Methode und die word_count-Methode verwendet werden. Da dies jedoch kein NaiveBayes-Klassifizierer ist, ist es besser, eine separate Klasse zu erstellen, damit NaiveBayes auch diese Klasse erbt.

Übrigens habe ich um die Endergebnisausgabe herum versucht, "den Schlüssel und den Wert desjenigen mit dem Maximalwert aus dem Diktat zu erhalten" und eine coole Schreibweise untersucht. Dieser Artikel schrieb genau das, was er wollte, aber es funktionierte nicht. Ich denke, das liegt daran, dass sich die Spezifikationen in Python3 geändert haben.

Wenn ich tatsächlich maschinelles Lernen verwende, denke ich, dass die Verwendung einer Bibliothek wie scikit-learn schnell und fehlerfrei ist. Die Implementierung selbst wie in diesem Artikel dient nur zu Studienzwecken. Sie können auch eine Bibliothek verwenden, die die Qualität im praktischen Gebrauch beibehält.

Github Ich habe den Code auf Github gepostet. https://github.com/katryo/bing_search_naive_bayes_sim

Referenz

Sucrose's persönlicher Blog http://sucrose.hatenablog.com/entry/2012/11/30/132803

Vorschau beim nächsten Mal

Als nächstes werden wir tf-idf implementieren und versuchen, die Leistung zu verbessern. Es wäre interessant, die Berechnungsmethode für die Ähnlichkeit zu ändern und den Würfelkoeffizienten und den Jaccard-Koeffizienten zu verwenden.

Ich dachte, aber ich entschied mich, tf-idf mit scicit-learn zu berechnen.

Fortsetzung hier

Recommended Posts

Berechnen Sie mithilfe des in Python 3.3 implementierten Naive Bayes-Klassifikators die Ähnlichkeit aus der Häufigkeit des gleichzeitigen Auftretens von Wörtern in Sätzen und Zeichenfolgen.
Beachten Sie, dass ich den Algorithmus des maschinell lernenden Naive Bayes-Klassifikators verstehe. Und ich habe es in Python geschrieben.
Visualisieren Sie die Häufigkeit von Wortvorkommen in Sätzen mit Word Cloud. [Python]
Lernen Sie Naive Bayes, das in Python 3.3 implementiert ist, auf einer Webseite kennen, die mit der Bing-API abgerufen wurde. Lassen Sie die Sätze klassifiziert werden
Ich habe die Geschwindigkeit der Referenz des Pythons in der Liste und die Referenz der Wörterbucheinbeziehung aus der In-Liste verglichen.
Implementierte den Algorithmus von "Algorithm Picture Book" in Python3 (Heap Sort Edition)
Studie aus Python Hour8: Verwenden von Paketen
Wie kann man schnell die Häufigkeit des Auftretens von Zeichen aus einer Zeichenfolge in Python zählen?
Berechnen Sie mit Python Millionen von Stellen in der Quadratwurzel von 2
Implementierte den Algorithmus von "Algorithm Picture Book" in Python3 (Bubble Sort)
Verschiedene Methoden zur Berechnung der Ähnlichkeit zwischen Daten mit Python
Prognostizieren Sie das Geschlecht anhand des Namens mithilfe der Gender-API und von Pykakasi in Python
[Tipps] Probleme und Lösungen bei der Entwicklung von Python + Kivy
Beurteilung der emotionalen Polarität von Sätzen mit dem Textklassifikator fastText
Implementierte den Algorithmus von "Algorithm Picture Book" in Python3 (Selective Sort)
Implementieren Sie Naive Bayes in Python 3.3
Zählen Sie die Anzahl der thailändischen und arabischen Zeichen in Python gut
Berechnen Sie die Ähnlichkeit zwischen Sätzen mit Doc2Vec, einer Weiterentwicklung von Word2Vec
So erhalten Sie mithilfe der Mastodon-API Follower und Follower von Python
Rufen Sie den Wert des Dropdown-Menüs mit Python und Selen ab und legen Sie ihn fest
Holen Sie sich den Titel und das Lieferdatum von Yahoo! News in Python
Richten Sie mit Python einen Dummy-SMTP-Server ein und überprüfen Sie den Sendevorgang von Action Mailer
Ich habe versucht, E-Mails von Node.js und Python mithilfe des E-Mail-Zustelldienstes (SendGrid) von IBM Cloud zuzustellen!