Es ist eine Weile her seit der letzten "Datenvorverarbeitung", aber dieses Mal werde ich versuchen, Twitter-Textdaten zu gruppieren.
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.
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.
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.
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!
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!
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