Dieser Artikel ist eine Fortsetzung von [Job Change Conference] Versuchen Sie, Unternehmen zu klassifizieren, indem Sie Mundpropaganda in natürlicher Sprache mit word2vec verarbeiten.
Das letzte Mal schrieb ich, dass ich ähnliche Unternehmen und Wörter nachschlagen konnte, weil ich die Mundpropaganda des Jobwechsel-Meetings mit word2vec in natürlicher Sprache verarbeitet hatte, aber dieses Mal werde ich das Ergebnis visualisieren.
Wie ich im vorherigen Artikel schrieb, hatte diese Methode den Nachteil, dass "ich verstehe, dass Mundpropaganda über Überstunden spricht, aber ich weiß nicht, ob es mehr oder weniger gibt."
Diese Visualisierung hat den Fehler nicht behoben, daher hoffe ich, dass Sie sie als Visualisierungsbeispiel sehen können.
Auch das letzte Mal habe ich es in den Adventskalender des Unternehmens geschrieben, aber dieses Mal habe ich es als Einzelperson geschrieben, sodass der Inhalt dieses Artikels nichts mit den Ansichten der Organisation zu tun hat, zu der ich gehöre.
[Hier im vorherigen Artikel](http://qiita.com/naotaka1128/items/2c4551abfd40e43b0146#2-gensim-%E3%81%A7-doc2vec-%E3%81%AE%E3%83%A2%E3% Lesen Sie das Modell, das mit 83% 87% E3% 83% AB% E6% A7% 8B% E7% AF% 89 gespeichert wurde.
model = models.Doc2Vec.load('./data/doc2vec.model')
Ich habe die Methode zum Schreiben der Verteilungskarte wie folgt definiert.
Normalerweise wird die Vektordarstellung eines Wortes von einem Modell in 100 oder 300 Dimensionen trainiert. Die Visualisierung wird durchgeführt, nachdem sie dimensional komprimiert und in zwei Dimensionen verschoben wurde.
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
def draw_word_scatter(word, topn=30):
"""Eine Methode zum Zeichnen einer Verteilungskarte von Wörtern, die dem eingegebenen Wort ähnlich sind"""
#Verwenden Sie die folgenden Funktionen von Gensim word2vec, um ähnliche Wörter zu finden
# model.most_similar(word, topn=topn)
words = [x[0] for x in sorted(model.most_similar(word, topn=topn))]
words.append(word)
#Finden Sie die Vektordarstellung jedes Wortes. Gensim am meisten_Basierend auf ähnlichen
#Eine Methode, die einen Vektor von Wörtern zurückgibt(model.calc_vec)Ist definiert
#Die Implementierung wird am Ende dieses Artikels beschrieben, da sie langwierig sein wird.
vecs = [model.calc_vec(word) for word in words]
#Verbreitungskarte
draw_scatter_plot(vecs, words)
def draw_scatter_plot(vecs, tags, clusters)
"""Streudiagramm basierend auf dem Eingabevektor(Mit Etikett)Methode zum Zeichnen"""
# Scikit-Die PCA-Dimensionsreduktion von Learn und ihre Visualisierung
pca = PCA(n_components=2)
coords = pca.fit_transform(vecs)
#Visualisierung mit matplotlib
fig, ax = plt.subplots()
x = [v[0] for v in coords]
y = [v[1] for v in coords]
#Betrachten Sie den Cluster, wenn für jeden Punkt ein Cluster festgelegt ist
#Fehlerbehandlung ist angemessen
if clusters:
ax.scatter(x, y, c=clusters)
else:
ax.scatter(x, y)
for i, txt in enumerate(tags):
ax.annotate(txt, (coords[i][0], coords[i][1]))
plt.show()
Ich werde eine Verteilungskarte zeichnen, wenn ich bereit bin.
# "im Laufe der Zeit"Visualisieren Sie Wörter ähnlich wie
draw_word_scatter('im Laufe der Zeit', topn=40)
Das Ergebnis konnte ich ohne Tränen nicht sehen.
Besonders miserabel ist der Bereich, in dem die morgendliche Rückkehr, der morgendliche, der letzte Zug und die Überstunden in der Mitte und etwas darüber liegen. Noch beängstigender ist, dass "Schlaf" am weitesten von der Gegend entfernt ist. Ich kann nicht anders, als die Melancholie des Gehaltsempfängers und die Gefahr des Todes durch Überarbeitung zu spüren ...
Ich bin ein bisschen einsam, also werde ich sogar positive Worte versuchen.
# "Lohnend"Visualisieren Sie Wörter ähnlich wie
draw_word_scatter('Lohnend')
Es unterscheidet sich sehr von der vorherigen Verbreitungskarte ...! Es ist gut, stolz zu sein, zu belohnen und Träume zu geben. Übrigens suchen wir anerkannte Stipendiaten, die gemeinsam lohnende Arbeit leisten.
Wenn Sie eine Website betreiben, möchten Sie möglicherweise Wörter gruppieren.
Persönlich denke ich, dass einer der Gründe, warum WELQ und MERY in der Suchmaschinenoptimierung überwältigend stark waren, der Einfluss einer ordnungsgemäßen Überlagerung von Tags und Gruppierungen war. Es kann auch für solche Dinge verwendet werden, und es wäre schön, die Zuflussschlüsselwörter automatisch in der Auflistung von Anzeigen zu klassifizieren und eine Zielseite zu erstellen.
Zeichnen wir hier ein Dendrogramm für die richtige Überlagerung und Gruppierung.
import pandas as pd
from scipy.spatial.distance import pdist
from scipy.cluster.hierarchy import linkage, dendrogram
def draw_similar_word_dendrogram(word, topn=30):
"""Eine Methode zum Zeichnen eines Dendrogramms von Wörtern, die dem eingegebenen Wort ähneln"""
# draw_word_Gleich wie Streuung(Ich habe es redundant für den Qiita-Artikel geschrieben)
words = [x[0] for x in sorted(model.most_similar(word, topn=topn))]
words.append(word)
vecs = [model.calc_vec(word) for word in words]
#Visualisierung mit SciPy-Funktionen
#Ich bezog mich auf den Code von Python Machine Learning Professional
df = pd.DataFrame(vecs, index=words)
row_clusters = linkage(pdist(df, metric='euclidean'), method='complete')
dendrogram(row_clusters, labels=words)
plt.show()
Ich werde es schreiben.
# "im Laufe der Zeit"Schreiben Sie ein Dendrogramm mit ähnlichen Wörtern wie
draw_similar_word_dendrogram('im Laufe der Zeit')
Es tut mir leid, dass die Buchstaben des Wortes klein sind, aber ich konnte ein Dendrogramm so zeichnen, wie es war. Selbst hier sind die morgendliche Rückkehr, der Morgen und der letzte Zug offensichtlich aneinandergereiht. Geh früh nach Hause ...
Die Gruppierung kann durch Schneiden dieses Dendrogramms in einer geeigneten Höhe erfolgen.
Als nächstes zeichnen wir eine Verteilungskarte des Unternehmens.
Schreiben wir hier eine Verteilungskarte jedes Unternehmens aus der Mundpropaganda der ** Unternehmenskultur ** jedes Unternehmens **. Ziel ist es, ein Unternehmen mit einer ähnlichen Unternehmenskultur zu finden.
Verwenden Sie die Funktion infer_vector von Gensim Doc2Vec, wenn Sie die Vektordarstellung mit dem bereits erlernten Modell berechnen. Übrigens wurde diese Funktion neulich im Artikel kommentiert, aber ehrlich gesagt ist sie nicht sehr genau.
Ich denke jedoch, dass es kein großes Problem ist, verglichen mit dem Problem, dass word2vec in erster Linie an der Verarbeitung von Unternehmensbewertungen beteiligt ist, also verwende ich es so, wie es ist.
Berechnen Sie zunächst die Unternehmensvektordarstellung. Das Ziel war ein webbasiertes Unternehmen mit einer bestimmten Anzahl von Bewertungen oder mehr.
#Modell lesen
model = models.Doc2Vec.load('./data/doc2vec.model')
#Unternehmen,Lesen von Mundpropaganda-Daten aus der DB
companies = connect_mysql(QUERY_COMPANIES, DB_NAME)
reviews = connect_mysql(QUERY_COMPANY_CULTURE, DB_NAME)
#Morphologische Analyse von Mundpropaganda-Daten
# utils.Der Stamm enthält die Verarbeitung der morphologischen Analyse durch MeCab
words = [utils.stems(review) for review in reviews]
#Berechnen Sie die Vektordarstellung jedes Unternehmens aus Mundpropaganda-Daten
vecs = [models.Doc2Vec.infer_vector(model, word) for word in words]
Nachdem wir die Vektordarstellung berechnet haben, visualisieren wir sie.
#Visualisierung mit der oben definierten Methode
draw_scatter_plot(vecs, companies)
Es ist überladen und schwer zu sehen, aber die Rekrutierungsserie steckt im oberen Teil fest, und Spielefirmen sind im unteren Teil versammelt.
Stimmt es jedoch, dass Glee und Mixy sich in ähnlichen Positionen befinden? Da es einige Stellen gibt, liegt möglicherweise ein Problem mit der Genauigkeit von word2vec und infer_vector sowie mit Verzerrungen vor, die den 100-dimensionalen Vektor in 2D zwingen.
Die oben gezeigte Verbreitungskarte war überladen und schwer zu sehen.
Es ist etwas einfacher zu erkennen, ob Sie Clustering durchführen und das Diagramm einfärben. Zeichnen Sie daher eine Verteilungskarte, nachdem Sie die Cluster der einzelnen Unternehmen gefunden haben.
import pandas as pd
from sklearn.cluster import KMeans
def kmeans_clustering(tags, vecs, n_clusters):
"""K Durchschnittsmethode Clustering-Methode"""
km = KMeans(n_clusters=n_clusters,
init='k-means++',
n_init=20,
max_iter=1000,
tol=1e-04,
random_state=0)
clusters = km.fit_predict(vecs)
return pd.DataFrame(clusters, index=tags)
Ausführung von Clustering und Visualisierung unter Berücksichtigung
#Die Anzahl der Cluster ist angemessen(Ich suchte nach einer vernünftigen Zahl nach der Ichiou-Ellbogenmethode)
clusters = kmeans_clustering(companies, vecs, 10)
#Zeichnen Sie die Verteilungskarte mit Clusterinformationen
draw_scatter_plot(vecs, companies, clusters)
Ich frage mich, ob sich nicht viel ändert ... Es kann jedoch von Vorteil sein, die Verzerrung sehen zu können, die gewaltsam in zwei Dimensionen fallen gelassen wurde.
Auch Cookpad und DMM befinden sich in ähnlichen Positionen und verursachen wahrscheinlich Wellen, aber ich bin mir sicher, dass sie im Ebisu Garden Place zusammenleben. Es ähnelt also einem Geschäft, in dem Sie essen gehen, und ich denke, es wird eine ähnliche Unternehmenskultur haben. , Masu ... (schmerzhafte Entschuldigung)
Diesmal war die Visualisierung der Clusterbildung nicht gut, kann jedoch durch Ändern der Methode zur Dimensionskomprimierung in gewissem Maße verbessert werden. Es scheint sich zu lohnen, verschiedene Verbesserungen zu entwickeln, z. B. den PCA-Teil auf vielfältig zu ändern. TSNE von Scikit-learn.
Recommended Posts