Cet article est une continuation de [Job Change Conference] Word2vec est utilisé pour traiter les avis en langage naturel pour classer les entreprises.
La dernière fois, j'ai écrit que j'avais pu rechercher des entreprises et des mots similaires à la suite du traitement du bouche-à-oreille de la réunion de changement d'emploi avec word2vec en langage naturel, mais cette fois, je vais visualiser le résultat.
Comme je l'ai écrit dans l'article précédent, cette méthode avait l'inconvénient que «je comprends que le bouche-à-oreille parle des heures supplémentaires, mais je ne sais pas s'il y en a plus ou moins».
Cette visualisation n'a pas corrigé le défaut, j'espère donc que vous pouvez la voir comme un exemple de visualisation.
Aussi, la dernière fois je l'ai écrit sur le calendrier de l'Avent de l'entreprise, mais cette fois je l'ai écrit en tant qu'individu, donc le contenu de cet article n'a rien à voir avec les vues de l'organisation à laquelle j'appartiens.
[Ici dans l'article précédent](http://qiita.com/naotaka1128/items/2c4551abfd40e43b0146#2-gensim-%E3%81%A7-doc2vec-%E3%81%AE%E3%83%A2%E3% Lire le modèle enregistré par 83% 87% E3% 83% AB% E6% A7% 8B% E7% AF% 89).
model = models.Doc2Vec.load('./data/doc2vec.model')
J'ai défini la méthode pour écrire la carte de distribution comme suit.
Habituellement, la représentation vectorielle d'un mot est formée par un modèle en 100 ou 300 dimensions. La visualisation est effectuée après avoir été compressée dimensionnellement et déposée en deux dimensions.
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
def draw_word_scatter(word, topn=30):
"""Une méthode pour dessiner une carte de distribution des mots qui sont similaires au mot entré"""
#Utilisez les fonctionnalités suivantes de Gensim word2vec pour trouver des mots similaires
# model.most_similar(word, topn=topn)
words = [x[0] for x in sorted(model.most_similar(word, topn=topn))]
words.append(word)
#Trouvez la représentation vectorielle de chaque mot. Gensim le plus_Basé sur des
#Une méthode qui renvoie un vecteur de mots(model.calc_vec)Est défini
#L'implémentation est décrite à la fin de cet article car elle sera longue.
vecs = [model.calc_vec(word) for word in words]
#Carte de distribution
draw_scatter_plot(vecs, words)
def draw_scatter_plot(vecs, tags, clusters)
"""Diagramme de dispersion basé sur le vecteur d'entrée(Avec étiquette)Méthode de dessin"""
# Scikit-Réduction de la dimension PCA de Learn et sa visualisation
pca = PCA(n_components=2)
coords = pca.fit_transform(vecs)
#Visualisation avec matplotlib
fig, ax = plt.subplots()
x = [v[0] for v in coords]
y = [v[1] for v in coords]
#Considérez le cluster si un cluster pour chaque point est défini
#La gestion des erreurs est appropriée
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()
Je dessinerai une carte de distribution lorsque je serai prêt.
# "heures supplémentaires"Visualisez des mots similaires à
draw_word_scatter('heures supplémentaires', topn=40)
Le résultat était quelque chose que je ne pouvais pas voir sans larmes.
La zone où le retour du matin, le matin, le dernier train et les heures supplémentaires sont regroupés au milieu et légèrement au-dessus est particulièrement misérable. Encore plus effrayant, le «sommeil» est le plus éloigné de la zone. Je ne peux m'empêcher de ressentir la mélancolie du salarié et le danger de mort par surmenage ...
Je suis un peu seul, alors j'essaierai même des mots positifs.
# "Récompense"Visualisez des mots similaires à
draw_word_scatter('Récompense')
C'est très différent de la carte de distribution précédente ...! Il est bon d'être fier, gratifiant et de donner des rêves. Soit dit en passant, nous recherchons des boursiers de renom qui accompliront ensemble un travail enrichissant.
Si vous exploitez un site Web, vous souhaiterez peut-être regrouper les mots.
Personnellement, je pense que l'une des raisons pour lesquelles WELQ et MERY étaient extrêmement puissants en SEO était l'influence de la superposition appropriée des balises et du regroupement. Il peut également être utilisé pour de telles choses, et il serait bien de créer une page de destination en classant automatiquement les mots-clés d'entrée dans la liste des publicités.
Ici, dessinons un dendrogramme pour une superposition et un regroupement appropriés.
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):
"""Une méthode pour dessiner un dendrogramme de mots qui ressemblent au mot entré"""
# draw_word_Identique à scatter(Je l'ai écrit de manière redondante pour l'article qiita)
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]
#Visualisation à l'aide des fonctions SciPy
#J'ai fait référence au code de 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()
Je vais l'écrire.
# "heures supplémentaires"Écrivez un dendrogramme de mots similaires à
draw_similar_word_dendrogram('heures supplémentaires')
Je suis désolé que les lettres du mot soient petites, mais j'ai pu dessiner un dendrogramme tel quel. Evidemment, même ici, le retour du matin, le matin et le dernier train sont alignés l'un avec l'autre. Rentrer chez soi plus tot ...
Le regroupement peut être fait en coupant ce dendrogramme à une hauteur appropriée.
Ensuite, dessinons une carte de distribution de l'entreprise.
Ici, écrivons une carte de distribution de chaque entreprise à partir du bouche-à-oreille de chaque entreprise ** culture d'entreprise uniquement **. L'objectif est de trouver une entreprise avec une culture d'entreprise similaire.
Utilisez la fonction appelée infer_vector de Gensim Doc2Vec lors du calcul de la représentation vectorielle en utilisant le modèle qui a déjà été appris. À propos, cette fonction a été commentée dans l'article l'autre jour, mais honnêtement, elle n'est pas très précise.
Cependant, je pense que ce n'est pas un gros problème par rapport au problème que word2vec est impliqué dans le traitement des avis des entreprises en premier lieu, donc je l'utilise tel quel.
Tout d'abord, calculez la représentation vectorielle de l'entreprise. La cible était une entreprise basée sur le Web avec un certain nombre d'avis ou plus.
#Lire le modèle
model = models.Doc2Vec.load('./data/doc2vec.model')
#Compagnie,Lecture de données de bouche à oreille à partir de la base de données
companies = connect_mysql(QUERY_COMPANIES, DB_NAME)
reviews = connect_mysql(QUERY_COMPANY_CULTURE, DB_NAME)
#Analyse morphologique des données de bouche à oreille
# utils.La tige contient le traitement de l'analyse morphologique par MeCab
words = [utils.stems(review) for review in reviews]
#Calculer la représentation vectorielle de chaque entreprise à partir des données de bouche à oreille
vecs = [models.Doc2Vec.infer_vector(model, word) for word in words]
Maintenant que nous avons calculé la représentation vectorielle, visualisons-la.
#Visualisation à l'aide de la méthode définie ci-dessus
draw_scatter_plot(vecs, companies)
C'est encombré et difficile à voir, mais la série de recrutement est bloquée dans la partie supérieure et les sociétés de jeux sont rassemblées dans la partie inférieure.
Cependant, est-il vrai que Glee et Mixy sont dans des positions similaires? Parce qu'il y a certains endroits, il peut y avoir un problème avec la précision de word2vec et infer_vector, et une distorsion qui a forcé le vecteur à 100 dimensions en 2D.
La carte de répartition présentée ci-dessus était encombrée et difficile à voir.
Si vous effectuez un clustering et coloriez le tracé, ce sera un peu plus facile à voir, alors dessinons une carte de distribution après avoir trouvé le cluster de chaque entreprise.
import pandas as pd
from sklearn.cluster import KMeans
def kmeans_clustering(tags, vecs, n_clusters):
"""Méthode de la moyenne K Méthode de clustering"""
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)
Exécution du clustering et de la visualisation en le considérant
#Le nombre de clusters est approprié(J'ai recherché un nombre raisonnable par la méthode du coude Ichiou)
clusters = kmeans_clustering(companies, vecs, 10)
#Tracer la carte de distribution avec les informations de cluster
draw_scatter_plot(vecs, companies, clusters)
Je me demande si cela ne change pas grand-chose ... Cependant, il peut être avantageux de pouvoir voir la distorsion qui a été abandonnée de force en deux dimensions.
De plus, Cookpad et DMM sont dans des positions similaires et sont susceptibles de provoquer des ondulations, mais je suis sûr qu'ils vivent ensemble à Ebisu Garden Place, donc c'est similaire à un magasin où vous allez manger, et je pense qu'il aura une culture d'entreprise similaire. , Masu ... (excuse douloureuse)
Cette fois, la visualisation de l'agrégation n'était pas bonne, mais elle peut être améliorée dans une certaine mesure en modifiant la méthode de compression de dimension. Il semble qu'il vaut la peine de concevoir diverses améliorations telles que le changement de la partie PCA en manifold.TSNE de Scikit-learn.