Ich habe mit Python Clustering & Dimension Compression & Visualization mit maschinellem Lernen begonnen

</ i> Einführung

Es ist eine Weile her seit der letzten "Datenvorverarbeitung", aber dieses Mal werde ich versuchen, Twitter-Textdaten zu gruppieren.

</ i> Zusammenfassung in 3 Zeilen

  • (Endlich) gruppiert.
  • Das Ergebnis der Clusterbildung wurde mit matplotlib visualisiert. ――Nächstes Mal kann es eine Nebenstraße sein, Visualisierungstricks einzuführen.

</ i> Plötzlich Quellcode (außer Visualisierung)

Letztes Mal Ich habe die Implementierung von ** "Clustering" **** "Dimensionskomprimierung" ** zur Implementierung von "vectorize" hinzugefügt. (Die Quelle der "Visualisierung" ist etwas lang, also später)

tw_ml.py(Auszug)


#! /usr/bin/env python
# -*- coding:utf-8 -*-

import MeCab as mc
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
from sklearn.decomposition import TruncatedSVD

MECAB_OPT = "-Ochasen -d C:\\tmp\\mecab-ipadic-neologd\\"

NUM_CLUSTER = 3
SAMPLE_DATA = [
    #Ausgelassen, weil es das gleiche wie beim letzten Mal ist
]

def mecab_tokenizer(text):
    #Ausgelassen, weil es das gleiche wie beim letzten Mal ist

def main():

    #Initialisierung der Vektorklasse (wie beim letzten Mal)
    vectorizer = TfidfVectorizer(
        min_df=1, stop_words=[u"Perfume", u"HTTPS"],
        tokenizer=mecab_tokenizer)
    #Vektorisierung von Probendaten (wie beim letzten Mal)
    tfidf_weighted_matrix = vectorizer.fit_transform(SAMPLE_DATA)

    # K-Bedeutet die Initialisierung von Clusteranalyseklassen
    km_model = KMeans(n_clusters=NUM_CLUSTER)
    #Führen Sie eine Clusteranalyse durch, indem Sie Vektorinformationen eingeben
    km_model.fit(tfidf_weighted_matrix)

    #Initialisierung der Dimensionskomprimierungsklasse (Singularwertzerlegung)
    lsa = TruncatedSVD(2)
    #Zweidimensionale Komprimierung von Probendaten und Vektorinformationen von Clustermittelpunkten
    compressed_text_list = lsa.fit_transform(tfidf_weighted_matrix)
    compressed_center_list = lsa.fit_transform(km_model.cluster_centers_)

if __name__ == '__main__':
    main()

Werfen wir einen Blick darauf, was wir tun.

</ i> Clustering

python


# K-Bedeutet die Initialisierung von Clusteranalyseklassen
km_model = KMeans(n_clusters=NUM_CLUSTER)
#Führen Sie eine Clusteranalyse durch, indem Sie Vektorinformationen eingeben
km_model.fit(tfidf_weighted_matrix)

Der Verarbeitungsinhalt entspricht dem Kommentar. Das Problem hierbei sind die Parameter, die beim Initialisieren der KMeans-Klasse übergeben wurden. Eine Optimierung ist jedoch fast nicht erforderlich, wenn Sie sie vorerst nur verschieben möchten. Da die Anzahl der Daten, die dieses Mal verarbeitet werden, nur 5 beträgt, wurde die Anzahl der Cluster von der Standardeinstellung ** 8 ** auf ** 3 ** geändert, die anderen bleiben jedoch die Standardeinstellung. (Details zu anderen Parametern: sklearn.cluster.KMeans)

Nach der Initialisierung geben Sie die Daten einfach mit Fit ein und analysieren sie. Die wichtigsten Analyseergebnisse können unter Bezugnahme auf km_model bestätigt werden.

Parameter Inhalt Wertbeispiel
km_model.cluster_centers_ Vektorinformationen des Mittelpunkts für jeden Cluster [[0, 0, 0.46369322, 0.46369322, 0, 0.46369322, 0, 0, 0, 0, 0, 0, 0, 0.37410477]...(So viele wie die Anzahl der Cluster)]
km_model.labels_ Beschriftung für jedes Element der zu analysierenden Daten (Wert, der angibt, zu welchem Cluster es gehört) [2 1 1 0 1]

Selbst wenn Sie dieses Ergebnis sehen können (Liste der numerischen Werte), ist es zu Nanno Kocha. Lassen Sie uns also den Cluster visualisieren. Hierfür ist die folgende ** dimensionale Komprimierung ** erforderlich.

</ i> Dimensionskomprimierung (zur Visualisierung)

python


#Initialisierung der Dimensionskomprimierungsklasse (Singularwertzerlegung)
lsa = TruncatedSVD(2)
#Zweidimensionale Komprimierung von Probendaten und Vektorinformationen von Clustermittelpunkten
compressed_text_list = lsa.fit_transform(tfidf_weighted_matrix)
compressed_center_list = lsa.fit_transform(km_model.cluster_centers_)

Wenn Sie "dimensionale Kompression" hören, kommen Ihnen die letzten ○ Antagy V und VIII reflexartig in den Sinn. Es ist eine Figur, die an etwas SF-ähnliches erinnert. Der Zweck ist jedoch nur zu sagen "Ich kann keine hochdimensionalen Informationen anzeigen, deshalb möchte ich sie in 2D von xy konvertieren (weil es eine Annäherung ist) **". Es ist auch kein Wort.

Da die Anzahl der Dimensionen diesmal "die Art des Wortes ist, das in allen Texten vorkommt", sind die Beispieldaten die folgenden 14-dimensionalen Daten. Es ist schwierig, dies zu veranschaulichen. [0, 0, 0.46369322, 0.46369322, 0, 0.46369322, 0, 0, 0, 0, 0, 0, 0, 0.37410477]

Dies wird durch Dimensionskomprimierung in die folgenden zwei Dimensionen gebracht. Wenn dies der Fall ist, können Sie es auf dem 2-Achsen-Diagramm von xy darstellen. [9.98647967e-01, 0.00000000e+00]

Es gibt verschiedene Methoden zur Dimensionskomprimierung, aber dieses Mal werde ich ** Latent Meaning Analysis (LSA) ** verwenden. Dies scheint auch stark zu sein, aber wie im obigen Quellcode gezeigt, ist es einfach, wenn Sie scicit-lean verwenden (ich werde diesmal TruncatedSVD verwenden, aber es scheint andere zu geben). In der obigen Implementierung werden die Vektorinformationen der 14-dimensionalen Probendaten und die Vektorinformationen des Mittelpunkts des Clusteranalyseergebnisses in 2 Dimensionen konvertiert.

Jetzt können Sie visualisieren.

</ i> Quellcode (visualisierter Teil)

Mit der bisherigen Implementierung verfügen wir über alle Informationen, die zur Visualisierung des Clusters erforderlich sind. Fügen wir also einen Zeichenprozess mit matplotlib hinzu.

tw_ml.py(Auszug aus dem Visualisierungsteil)



import matplotlib.pyplot as plt
from matplotlib import cm
import matplotlib.font_manager as fm

FP = fm.FontProperties(
    fname=r'C:\WINDOWS\Fonts\YuGothL.ttc',
    size=7)

def draw_km(text_list, km_text_labels,
            compressed_center_list, compressed_text_list):

    #Mit dem zeichnen beginnen.
    fig = plt.figure()
    axes = fig.add_subplot(111)
    for label in range(NUM_CLUSTER):

        #Separate Farben für jedes Etikett.
        #Überlassen Sie die Farbe der Farbkarte (cool).
        color = cm.cool(float(label) / NUM_CLUSTER)

        #Zeichnen Sie die Mitte des Etiketts
        xc, yc = compressed_center_list[label]
        axes.plot(xc, yc,
                  color=color,
                  ms=6.0, zorder=3, marker="o")

        #Cluster-Label ebenfalls gezeichnet
        axes.annotate(
            label, xy=(xc, yc), fontproperties=FP)

        for text_num, text_label in enumerate(km_text_labels):

            if text_label == label:
                #Zeichnen Sie Text mit passendem Etikett
                x, y = compressed_text_list[text_num]
                axes.plot(x, y,
                          color=color,
                          ms=5.0, zorder=2, marker="x")

                #Text auch gezeichnet
                axes.annotate(
                    text_list[text_num], xy=(x, y), fontproperties=FP)

                #Zeichnen Sie die Linie vom Mittelpunkt des Etiketts
                axes.plot([x, xc], [y, yc],
                          color=color,
                          linewidth=0.5, zorder=1, linestyle="--")

    plt.axis('tight')
    plt.show()

def main():
    #Weggelassen, da es bis zur Dimensionskomprimierung gleich ist

    #Daten visualisieren
    # ※km_model.labels_BEISPIELEN_Die Beschriftungsinformationen jedes Elements von DATA werden gespeichert.
    draw_km(SAMPLE_DATA, km_model.labels_,
            compressed_center_list, compressed_text_list)

if __name__ == '__main__':
    main()

Das Ergebnis sieht so aus! figure_1.png

Text Cluster
Nocchi süß#Perfume https://t.co/xxx 2
Die Produktion von Parfüm ist erstaunlich#prfm #Perfume_um https://t.co/xxx 1
Schokoladendisco/ Perfume #NowPlaying https://t.co/xxx 1
Ich ging zu Perfume A Gallery Experience in London https://t.co/xxx 0
Die Produktion von Schokoladendisco ist cool. Ich möchte live gehen.#Perfume https://t.co/xxx 1

Das Erscheinungsbild ist empfindlich, da die Anzahl der Daten gering ist. Aber irgendwie habe ich das Gefühl, ich kann sie klassifizieren!

</ i> Endlich gruppiert!

Der Touch-Teil des Clustering von Textdaten mit der K-Means-Methode wurde abgeschlossen. Wenn Sie km_models mit neuen Daten versorgen, sollten Sie eine Lösung finden, welcher Cluster klassifiziert werden soll. (Das heißt, * Textklassifikator! *)

Das nächste Mal werden wir tatsächlich neue Daten klassifizieren und das Ergebnis der Erhöhung der Datenanzahl sehen. Ich gehe in eine Seitenstraße, aber ich würde gerne einen kleinen Weg finden, um es in matplotlib zu zeigen.

Recommended Posts