** Dieser Beitrag ist der Artikel zum dritten Tag von Real Escape Advent Calendar 2013. ** ** **
Ich habe den Code auf Github zusammengestellt. https://github.com/katryo/bing_search_naive_bayes_sim
--Suchen Sie das Web mit der Bing-API
Ich habe ein solches System gemacht.
Es wurden zwei Arten von Ähnlichkeitsberechnungsfunktionen hinzugefügt.
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.
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.
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.
Ä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.
Der Code, den ich gemacht habe, kann in zwei Teile geteilt werden.
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
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.
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
Sucrose's persönlicher Blog http://sucrose.hatenablog.com/entry/2012/11/30/132803
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.
Recommended Posts