[PYTHON] Lassen Sie uns ein Clustering durchführen, das eine schöne Vogelperspektive auf den Textdatensatz bietet

Was in diesem Artikel einzuführen

Warum brauchen Sie Clustering?

Wenn Sie an datenbezogenen Recherchen oder Arbeiten beteiligt sind, gibt es viele Fälle, in denen Sie auf neue Daten stoßen.

Da der Inhalt neuer Daten in erster Linie nicht gut verstanden wird, müssen wir zuerst die Daten verstehen, bevor wir Forschungsrichtlinien und Analyserichtlinien berücksichtigen.

In solchen Fällen ist Clustering erforderlich. [^ 1]

Welche Art von Clustering-Anwendungsfällen haben Sie beispielsweise?

Ich habe in der Verarbeitung natürlicher Sprache im Forschungsgeschäft gearbeitet. NLP in der Forschungsbranche kann als Text Mining bezeichnet werden.

Die Basis der Forschungsindustrie ist data aggregation. Die Grundidee besteht darin, einen Umfragebericht zu erstellen, der auf den aggregierten Daten und dem Branchenwissen basiert.

Und natürlich müssen auch die Textdaten aggregiert werden. In vielen Fällen wird als Aggregationseinheit ein "für Untersuchungszwecke geeignetes Etikett" verwendet.

Es ist kein Problem, wenn das "für Untersuchungszwecke geeignete Etikett" von Anfang an bekannt ist.

Bei neuen Textdaten "Welche Art von Beschriftung soll ich überhaupt verwenden? Ich weiß nicht" müssen Sie jedoch zuerst die Beschriftung berücksichtigen.

In einem solchen Fall ist es einfacher, an Beschriftungen zu denken, wenn Sie durch Clustering einen schnellen Überblick über die Daten erhalten.

Gibt es keine andere Methode als Clustering?

Natürlich sind auch andere Ansätze als Clustering möglich.

Zum Beispiel ist der folgende Ansatz möglich.

  1. Probieren und beschriften Sie die Daten. In einigen Fällen ist es in Ordnung, wenn nur die Anzahl der zuverlässigen Abschnitte abgetastet werden kann.
  2. Verwenden Sie verschiedene Text Mining-Tools. Khcoder ist eine etablierte gute Software. Ich benutze es auch von Zeit zu Zeit.

Jedes hat seine eigenen Vor- und Nachteile, daher denke ich, dass die Methode, die zu Ihrem Anwendungsfall passt, die beste ist.

Wenn ich es jedoch leid bin, so zu denken, habe ich eine ungefähre Vorstellung davon, "vorerst mit Clustering zu beobachten".

Clustering? Ist es nicht okay mit Kmeans?

Ich denke, die Kombination von "vektorisiertem Text + Kmeans" ist eine königliche Straße, die seit langer Zeit benutzt wird.

Dies ist jedoch nicht die beste Kombination.

――Ein riesiger Cluster wie "Andere" wird gebildet. Wenn ich jedoch den Inhalt des Clusters betrachte, habe ich das Gefühl, dass er immer noch geteilt werden kann __ ――Wenn Clustering mit einer großen Anzahl von Clustern von Anfang an schwierig wurde, wurde es schwierig zu interpretieren. __ Ich wünschte, ich könnte das erste Mal grob und das zweite Mal etwas feiner teilen __ ――Es gibt einige Feature-Mengen, die "Ich möchte, dass Sie darauf achten und Cluster", und ich wünschte, Sie könnten die verschiedenen Feature-Mengen im ersten Cluster und im zweiten Cluster sehen __

Ich habe den Teil "Ich wünschte, das wäre passiert" in Schwarz hervorgehoben.

Es ist ziemlich mühsam, ein solches Clustering-Programm selbst zu schreiben. Um ehrlich zu sein, ist es mühsam.

Also habe ich ein Paket erstellt, das solche Clustering ausführt.

Einführung von flexible_clustering_tree

Dieses Paket führt beispielsweise Folgendes aus:

――Das erste Mal ist grob geteilt (Anzahl der Cluster = 3) und das zweite Mal ist etwas feiner geteilt (Anzahl der Cluster = 8). ――Das erste Mal wird grob durch Kmeans geteilt, und das zweite Mal wird von DBSCAN unter Berücksichtigung der Verteilung geclustert.

Das folgende Bild ist beispielsweise ein Bild, wenn es unter den folgenden Bedingungen geclustert wird.

Ist es nicht in Ordnung, hierarchische Cluster von unten nach oben zu erstellen?

Bottom-up hierarchisches Clustering ist ebenfalls nicht schlecht. Es gibt Zeiten, in denen hierarchisches Clustering für Anwendungsfälle besser ist.

Hierarchisches Bottom-up-Clustering hat jedoch die Eigenschaft, dass es schwierig wird, zu berechnen und auszuführen, wenn die Anzahl der Daten sehr groß wird.

Die Idee dieses Pakets ist immer noch die umgekehrte Version des hierarchischen Bottom-up-Clusters.

Ich habe es mit Live Door News Corpus versucht

Es gibt einen Datensatz namens Live Door News Corpus, der von Ronwitt Co., Ltd. veröffentlicht wurde.

Der Livedoor News Corpus ist nach Nachrichtenkategorien unterteilt, aber nehmen wir an, dass es hier kein Kategorielabel gab.

Es macht keinen Spaß, es einfach zu "probieren", deshalb dachte ich, es wäre interessant, eine Analyse-Geschichte zu haben. Daher habe ich das folgende Beispiel als Beispiel in der Nähe des Geschäftsanwendungsfalls betrachtet.

――Sie sind eine Person, die so etwas wie eine Datenanalyse eines Unternehmens durchführt, das einen Webdienst betreibt. »Eines Tages kam ein solches Thema von irgendwoher.

~~ Ah. .. .. Dieser Anwendungsfall scheint mein Beispiel gewesen zu sein ... ~~

Welche Art von Verfahren möchten Sie beobachten?

Ich werde die folgenden Schritte ausführen.

  1. Datenvorverarbeitung. Es heißt Wortteilung.
  2. Quantifizierung der Textmerkmale.
  3. Führen Sie das Clustering durch.
  4. Visualisierung von Inhalten mit D3.js Baumstruktur
  5. Bereiten Sie Daten vor, um den Cluster zu erklären

Datenvorverarbeitung und Wortteilung

Der Live Door News Corpus enthält zwei Arten von Text: "Titel" und "Text".

Lassen Sie uns diesmal diese beiden als separate Merkmalsgrößen behandeln.

Verwenden Sie Mecab, um Wörter zu teilen. Dieses Skript verarbeitet.

Quantifizierung von Textmerkmalen

Der Live Door News Corpus enthält zwei Arten von Text: "Titel" und "Text".

Zunächst der Titeltext. Der Titel ist Kurztext. Mit dieser Kürze sollte die durchschnittliche Einbettung von Wörtern in Ordnung sein.

Als nächstes kommt der Text. Der Text ist ziemlich lang. Es scheint etwas rau zu sein, diese Länge durch Worteinbettung zu mitteln.

Doc2vec ist eine Verschwendung von Zeit und Mühe, um ein Modell zu erstellen. Es ist auch mühsam, Computerressourcen vorzubereiten, die Bert schnell ausführen können.

Es gibt andere Optionen für die Vektoreinbettung von Dokumenten, aber __ Ich habe nicht viel Zeit __

Daher verwenden wir den klassischen Ansatz der Wortfrequenzmatrix und der Matrixkomprimierung.

Der gesamte Ablauf ist dieses Skript.

Clustering durchführen

Ich werde hier erklären, indem ich den Code zeige. Der gesamte Ablauf ist dieses Skript.

Stellen Sie zunächst die Merkmalsmengenmatrix ein.

Die erste Titelmatrix lautet "title_vectors". Die zweite Körpermatrix ist "low_dim_matrix".

Beide sind Matrizen von (Anzahl der Dokumente * Anzahl der Feature-Dimensionen).

Geben Sie an, wie oft Sie "level" festlegen möchten, wenn Sie eine Matrix auf "flexible_clustering_tree.FeatureMatrixObject" setzen.

import flexible_clustering_tree

#Verschiedene Verarbeitungen werden hier weggelassen
feature_1st_layer = flexible_clustering_tree.FeatureMatrixObject(level=0, matrix_object=numpy.array(title_vectors))
feature_2nd_layer = flexible_clustering_tree.FeatureMatrixObject(level=1, matrix_object=low_dim_matrix)

Kombinieren Sie als Nächstes diese beiden FeatureMatrixObjects zu einem.

Die dict_index2-Attribute können Informationen speichern, die als zusätzliche Erklärung für die Daten verwendet werden können (Option). Es wird überhaupt nicht als Feature-Menge verwendet. Diese Informationen werden in dem Baum angezeigt, den Sie später visualisiert haben, was die Interpretation erleichtert. Hier werden Titel, Text und Kategorielabel gespeichert.

Das text_aggregation_field kann eine zweidimensionale Liste [[word]] (Option) enthalten. Wörter werden mit diesen Informationen aggregiert, und die aggregierten Informationen werden im visualisierten Baum angezeigt, was die Interpretation erleichtert. Die zweidimensionale Liste ist "Anzahl der Dokumente * Anzahl der Wörter (variabel und OK)".

multi_matrix_obj = flexible_clustering_tree.MultiFeatureMatrixObject(
    matrix_objects=[feature_1st_layer, feature_2nd_layer],
    dict_index2label={i: label for i, label in enumerate(livedoor_labels)},
    dict_index2attributes={i: {
        'file_name': livedoor_file_names[i],
        'document_text': ''.join(document_text[i]),
        'title_text': ''.join(title_text[i]),
        'label': livedoor_labels[i]
    } for i, label in enumerate(livedoor_labels)},
    text_aggregation_field=document_morphs_text_aggregation
)

Geben Sie als Nächstes die Clustering-Methode an. Lassen Sie HDBSCAN das erste Mal unter Berücksichtigung der Gesamtverteilung teilen [^ 2] Da HDBSCAN die Anzahl der Cluster nicht angibt, geben Sie "n_cluster = -1" an.

from hdbscan import HDBSCAN
clustering_operator_1st = flexible_clustering_tree.ClusteringOperator(level=0, n_cluster=-1, instance_clustering=HDBSCAN(min_cluster_size=3))

Das zweite Mal werde ich es in 8 Cluster teilen.

from sklearn.cluster import KMeans
clustering_operator_2nd = flexible_clustering_tree.ClusteringOperator(level=1, n_cluster=8, instance_clustering=KMeans(n_clusters=8))

Kombinieren Sie als Nächstes diese beiden Clustering-Operatoren zu einem.

multi_clustering_operator = flexible_clustering_tree.MultiClusteringOperator([clustering_operator_1st, clustering_operator_2nd])

Dann wird das Clustering ausgeführt.

Wenn Sie "max_depth = 3" angeben, wird es bis zur Tiefe von 3 geteilt. Wenn es nicht geteilt werden kann, stoppt es automatisch.

Die zuletzt angegebene Clusterbedingung wird für das zweite und nachfolgende Clustering verwendet.

Mit anderen Worten, die Textfunktionen werden mit Kmeans gruppiert.

# run flexible clustering
clustering_runner = flexible_clustering_tree.FlexibleClustering(max_depth=3)
index2cluster_no = clustering_runner.fit_transform(multi_matrix_obj, multi_clustering_operator)

Visualisieren Sie den Baum und speichern Sie ihn in HTML.

html = clustering_runner.clustering_tree.to_html()
with open(PATH_OUTPUT_HTML, 'w') as f:
    f.write(html)

Ich möchte die Daten später aggregieren, also geben wir die Tabelle an tsv aus.

#Sie können Tabelleninformationen für Aggregationszwecke abrufen
import pandas
table_information = clustering_runner.clustering_tree.to_objects()
pandas.DataFrame(table_information['cluster_information']).to_csv('cluster_relation.tsv', sep='\t')
pandas.DataFrame(table_information['leaf_information']).to_csv('leaf_information.tsv', sep='\t')

Visualisierung von Inhalten mit D3.js Baumstruktur

Dieser Cluster ist das Ergebnis der Aufteilung nur durch den Titel. Wortaggregationsinformationen werden neben dem Knoten im roten Rahmen angezeigt. Aus den Inhalten von Apps, Android und Google geht hervor, dass es sich um ein Thema zu Android-Smartphones handelt. 001.png

Wie Sie aus diesem Cluster ersehen können ... Wortaggregation, war es immer noch eine Kommunikation mit einer einzelnen Frau. Es könnte Tags wie "# Ich möchte einen reichen Mann heiraten" geben.

002.png

Dieser Baum ist nach Clustergröße von oben nach unten sortiert. Werfen wir einen Blick auf den besten Cluster. Die Clustergröße wird in das Feld "Daten-ID" geschrieben. Es scheint, dass sich 6.515 Dokumente in diesem Cluster befinden. Dies sieht aus wie ein "anderer" Cluster. Dies ist bei Dichteclustern wie HDBSCAN üblich. 003.png

Teilen wir nun den "anderen" Cluster auf. Es wird durch Kmeans geteilt. Das Bild ist ein Cluster mit vielen Sportnachrichten. Aus den Worten kann geschlossen werden, dass der Inhalt so etwas wie "Japan National Sports News" ist.

004.png

Zunächst einmal konnte ich den groben Inhalt des Clustering-Ergebnisses auf diese Weise bestätigen.

Vorbereiten von Daten zur Erläuterung des Clusters

Sie können den Baum mit Ihren eigenen Augen betrachten, aber es fühlt sich ein wenig hart an. Da der Zweck darin besteht, Tags zu entwickeln, benötigen wir gute Informationen, um über Tags nachzudenken.

Darüber hinaus besteht im Zusammenhang mit diesem Thema eine hohe Wahrscheinlichkeit, dass "Daten oder Materialien angefordert werden, die das Service-Management-Team den Grund für das Tag verstehen kann".

Sie sind jemand, der Daten analysiert. Sie können also nicht einfach das Service-Management-Team fragen, warum Sie taggen, und sagen: "Ich weiß nicht." Ich würde gerne "basierend auf diesen Daten" gehen (Brille schnell).

Betrachten Sie daher die nächste Strategie.

  1. Erhalten Sie Feature-Wörter mit TF-IDF für jeden Cluster. In eine Excel-Datei exportieren.
  2. Schreiben Sie die entsprechenden Tags, die aus den Feature-Wörtern in der Excel-Datei abgeleitet wurden (manuell).

Zuerst schrieb ich das Ergebnis der TFIDF-Gewichtung in csv. label ist die Clusternummer. Der 374-Cluster ist wahrscheinlich ein Kleidungsinhalt.

スクリーンショット 2019-10-31 16.03.47.png

Schreiben Sie daher "Kleidung" in die Spalte "Tag".

スクリーンショット 2019-10-31 16.06.33.png

Sie müssen diese Arbeit nur wiederholen.

Als ich es tatsächlich ausprobierte, konnte ich das Tag in 20 bis 30 Sekunden pro Cluster erraten.

Da diesmal 348 Cluster vorhanden sind, wird diese Arbeit in 348 Clustern abgeschlossen * 30 Sekunden = 10440 Sekunden = 178 Minuten.

~~ Youtube-Anzeigezeit ~~ Selbst unter Berücksichtigung der Pausenzeit werden die Tag-Rätselraten in 4-6 Stunden abgeschlossen sein.

Dann können Sie ganz einfach einen Arbeitsplan erstellen und es ist einfacher zu verhandeln, "Hey Boss ~. Das Markieren der Arbeit dauert ungefähr 8 Stunden, also ist es gut (Arbeitszeit + Pufferzeit + Überspringzeit)". Ich werde.

Wenn Sie nach dem Erraten des Tags ein schönes Folienmaterial erstellen und es dem Service-Management-Team geben, sind Sie dankbar ~


Das ist mein Gehirngedicht.

Übrigens habe ich das Paket [flexible_clustering_tree] eingeführt (https://pypi.org/project/flexible-clustering-tree/).

Der für das Gedicht im Gehirn verwendete Code befindet sich in diesem Repository.

Wo dieses Paket noch nicht hingegangen ist

In diesem Paket gibt es noch viel Raum für Verbesserungen. PR ist willkommen.

Zum Beispiel

[^ 1]: Dies wird auch als explorative Datenanalyse bezeichnet. [^ 2]: Eine weiterentwickelte Version von DBSCAN. Der Rechenaufwand ist hinsichtlich des Algorithmus geringer als der von DBSCAN, und die Implementierung ist geplant und schnell.

Recommended Posts

Lassen Sie uns ein Clustering durchführen, das eine schöne Vogelperspektive auf den Textdatensatz bietet
Artikel, der Ihnen hilft, den Kollisionsalgorithmus für starre Kugeln ein wenig zu verstehen
Eine Geschichte, die den Aufwand für Betrieb / Wartung reduziert
Erstellen Sie einen BOT, der die Discord-URL verkürzt
#Eine Funktion, die den Zeichencode einer Zeichenfolge zurückgibt
Erzeugen Sie diese Form des Bodens einer Haustierflasche
Eine Geschichte, die die Lieferung von Nico Nama analysierte.
[Python] Ein Programm, das die Positionen von Kängurus vergleicht.
Clustering G-bedeutet, dass die Anzahl der Cluster automatisch bestimmt wird
Ein Werkzeug, das die Gacha von Soshage automatisch dreht
Lassen Sie uns die Analyse der sinkenden Daten der Titanic so durchführen
Ein Programm, das bestimmte Zeichen aus dem eingegebenen Text entfernt
Lassen Sie uns einen Roboter bauen, der den Zauberwürfel löst! 2 Algorithmus
Lassen Sie uns einen Roboter bauen, der den Zauberwürfel löst! 3 Software
Lassen Sie uns einen Roboter bauen, der den Zauberwürfel löst! 1. Übersicht
Eine Reihe von Skriptdateien, die Wordcloud mit Python3 ausführen
Python-Skript, das den Inhalt zweier Verzeichnisse vergleicht
Fassen wir die Grundfunktionen von TensorFlow zusammen, indem wir ein neuronales Netzwerk erstellen, das XOR-Gatter lernt.