Cela fait un moment depuis le dernier "Prétraitement des données", mais cette fois je vais essayer de regrouper les données textuelles Twitter.
Dernière fois J'ai ajouté l'implémentation de ** "clustering" **** "dimension compression" ** à l'implémentation de "vectorize". (La source de "visualisation" est un peu longue, donc plus tard)
tw_ml.py(Extrait)
#! /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 = [
#Omis car c'est la même chose que la dernière fois
]
def mecab_tokenizer(text):
#Omis car c'est la même chose que la dernière fois
def main():
#Initialisation de la classe vectorielle (identique à la dernière fois)
vectorizer = TfidfVectorizer(
min_df=1, stop_words=[u"Perfume", u"HTTPS"],
tokenizer=mecab_tokenizer)
#Vectorisation des échantillons de données (identique à la dernière fois)
tfidf_weighted_matrix = vectorizer.fit_transform(SAMPLE_DATA)
# K-Signifie l'initialisation de la classe d'analyse de cluster
km_model = KMeans(n_clusters=NUM_CLUSTER)
#Effectuer une analyse de cluster en alimentant des informations vectorielles
km_model.fit(tfidf_weighted_matrix)
#Initialisation de la classe de compression dimensionnelle (décomposition de valeurs singulières)
lsa = TruncatedSVD(2)
#Compression bidimensionnelle des données d'échantillon et des informations vectorielles des points centraux de la grappe
compressed_text_list = lsa.fit_transform(tfidf_weighted_matrix)
compressed_center_list = lsa.fit_transform(km_model.cluster_centers_)
if __name__ == '__main__':
main()
Jetons un coup d'œil à ce que nous faisons.
python
# K-Signifie l'initialisation de la classe d'analyse de cluster
km_model = KMeans(n_clusters=NUM_CLUSTER)
#Effectuer une analyse de cluster en alimentant des informations vectorielles
km_model.fit(tfidf_weighted_matrix)
Le contenu du traitement est tel qu'écrit dans le commentaire. Le problème ici est les paramètres passés lors de l'initialisation de la classe KMeans, mais le réglage est presque inutile si vous voulez juste la déplacer pour le moment. Étant donné que le nombre de données traitées cette fois est aussi petit que 5, le nombre de clusters a été modifié de ** 8 ** par défaut à ** 3 **, mais les autres restent la valeur par défaut. (Détails des autres paramètres: sklearn.cluster.KMeans)
Après l'initialisation, alimentez simplement les données avec ajustement et analysez. Les principaux résultats de l'analyse peuvent être confirmés en se référant à ce qui suit de km_model.
Paramètres | Contenu | Exemple de valeur |
---|---|---|
km_model.cluster_centers_ | Informations vectorielles du point central pour chaque cluster | [[0, 0, 0.46369322, 0.46369322, 0, 0.46369322, 0, 0, 0, 0, 0, 0, 0, 0.37410477]...(Autant que le nombre de clusters)] |
km_model.labels_ | Libellé de chaque élément des données à analyser (valeur indiquant à quel cluster il appartient) | [2 1 1 0 1] |
Cependant, même si vous pouvez voir ce résultat (liste de valeurs numériques), c'est trop Nanno Kocha, alors visualisons le cluster. La ** compression dimensionnelle ** suivante est requise pour cela.
python
#Initialisation de la classe de compression dimensionnelle (décomposition de valeurs singulières)
lsa = TruncatedSVD(2)
#Compression bidimensionnelle des données d'échantillon et des informations vectorielles des points centraux de la grappe
compressed_text_list = lsa.fit_transform(tfidf_weighted_matrix)
compressed_center_list = lsa.fit_transform(km_model.cluster_centers_)
Lorsque vous entendez «compression dimensionnelle», les ○ antagy finaux V et VIII vous viennent à l'esprit par réflexe. C'est un personnage qui rappelle quelque chose de SF. Cependant, le but est simplement de dire "Je ne peux pas afficher les informations de haute dimension, donc je veux les convertir en 2D de xy (car c'est une approximation) **". Ce n'est pas non plus un mot.
Plus précisément, étant donné que le nombre de dimensions est "le type de mot qui apparaît dans tous les textes" cette fois, les exemples de données sont les données à 14 dimensions suivantes. Il est difficile d'illustrer cela. [0, 0, 0.46369322, 0.46369322, 0, 0.46369322, 0, 0, 0, 0, 0, 0, 0, 0.37410477]
Ceci est fait dans les deux dimensions suivantes par compression de dimension. Si tel est le cas, vous pouvez le tracer sur le diagramme à 2 axes de xy. [9.98647967e-01, 0.00000000e+00]
Il existe différentes méthodes de compression de dimension, mais cette fois j'utiliserai ** Analyse sémantique latente (LSA) **. Cela semble également être fort, mais comme le montre le code source ci-dessus, c'est facile si vous utilisez scicit-lean (cette fois, j'utiliserai le SVD tronqué, mais il semble y en avoir d'autres). Dans la mise en œuvre ci-dessus, les informations vectorielles des données d'échantillon à 14 dimensions et les informations vectorielles du point central du résultat de l'analyse en grappes sont converties en 2 dimensions.
Vous êtes maintenant prêt à visualiser.
Avec l'implémentation jusqu'à présent, nous avons toutes les informations nécessaires pour visualiser le cluster, ajoutons donc un processus de dessin à l'aide de matplotlib.
tw_ml.py(Extrait de la partie visualisation)
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):
#Commence à dessiner.
fig = plt.figure()
axes = fig.add_subplot(111)
for label in range(NUM_CLUSTER):
#Couleurs séparées pour chaque étiquette.
#Laissez la couleur à la carte des couleurs (cool).
color = cm.cool(float(label) / NUM_CLUSTER)
#Tracez le centre de l'étiquette
xc, yc = compressed_center_list[label]
axes.plot(xc, yc,
color=color,
ms=6.0, zorder=3, marker="o")
#Étiquette de cluster également tracée
axes.annotate(
label, xy=(xc, yc), fontproperties=FP)
for text_num, text_label in enumerate(km_text_labels):
if text_label == label:
#Tracer le texte avec l'étiquette correspondante
x, y = compressed_text_list[text_num]
axes.plot(x, y,
color=color,
ms=5.0, zorder=2, marker="x")
#Texte également tracé
axes.annotate(
text_list[text_num], xy=(x, y), fontproperties=FP)
#Tracez la ligne à partir du point central de l'étiquette
axes.plot([x, xc], [y, yc],
color=color,
linewidth=0.5, zorder=1, linestyle="--")
plt.axis('tight')
plt.show()
def main():
#Omis car c'est la même chose jusqu'à la compression dimensionnelle
#Visualisez les données
# ※km_model.labels_Vers l'échantillon_Les informations d'étiquette de chaque élément de DATA sont stockées.
draw_km(SAMPLE_DATA, km_model.labels_,
compressed_center_list, compressed_text_list)
if __name__ == '__main__':
main()
Le résultat ressemble à ceci!
texte | grappe |
---|---|
Nocchi mignon#Perfume https://t.co/xxx | 2 |
La production de parfum est incroyable#prfm #Perfume_um https://t.co/xxx | 1 |
discothèque au chocolat/ Perfume #NowPlaying https://t.co/xxx | 1 |
Je suis allé à Perfume A Gallery Experience à Londres https://t.co/xxx | 0 |
La production de disco au chocolat est cool. Je veux aller vivre.#Perfume https://t.co/xxx | 1 |
L'apparence est délicate car le nombre de données est faible. Mais d'une manière ou d'une autre, j'ai l'impression de pouvoir les classer!
La partie tactile du regroupement des données textuelles à l'aide de la méthode K-means est terminée. Nourrir km_models avec de nouvelles données devrait vous donner une solution quant au cluster à classer. (Autrement dit, * classificateur de texte! *)
La prochaine fois, nous classerons les nouvelles données et verrons le résultat de l'augmentation du nombre de données. Je ne suis pas sur la touche, mais j'aimerais imaginer un petit moyen de le montrer dans matplotlib.
Recommended Posts