[PYTHON] [Word2vec] Visualisons le résultat du traitement en langage naturel des avis des entreprises

introduction

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.

Mise en garde

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.

Mokuji

Quoi utiliser

Charger le modèle précédemment formé

[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')

Jouez avec les mots ① Essayez de dessiner une carte de distribution

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)
残業.png

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')
やりがい.png

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.

Jouez avec les mots ② Essayez de dessiner un dendrogramme

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')
残業樹形図.png

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.

Jouez avec l'entreprise ① Essayez de dessiner une carte de distribution

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)
companies_without_clusters.png

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.

Jouez avec l'entreprise ② Essayez de dessiner une carte de distribution en tenant compte du clustering

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)
companies_with_clusters.png

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.

Recommended Posts

[Word2vec] Visualisons le résultat du traitement en langage naturel des avis des entreprises
[Traitement du langage naturel] J'ai essayé de visualiser les remarques de chaque membre de la communauté Slack
Traiter le nom de la carte Yugioh en langage naturel --Yugiou Data Science 2. PNL
Apprenez les bases de la classification de documents par traitement du langage naturel, modèle de sujet
Afficher le résultat du traitement de la géométrie en Python
Insoutenable manque d'attention dans le traitement du langage naturel
Python: traitement du langage naturel
RNN_LSTM2 Traitement du langage naturel
Vérification des performances du prétraitement des données dans le traitement du langage naturel
Vue d'ensemble du traitement du langage naturel et de son prétraitement des données
Traitement du langage naturel (données originales) avec Word2Vec développé par des chercheurs Google américains
Visualisons le volume des transactions des actions TSE - Exemple Jpxlab
Types de prétraitement dans le traitement du langage naturel et leur puissance
Traitement linguistique 100 knocks-29: Obtenez l'URL de l'image du drapeau
■ [Google Colaboratory] Prétraitement du traitement du langage naturel et janome
Visualisons le nombre de personnes infectées par le virus corona avec matplotlib
Grattage du résultat de "Schedule-kun"
Visualisons GraphConvModel de DeepChem
Traitement du langage naturel 3 Continuité des mots
Visualisez la trajectoire de Hayabusa 2
Traitement du langage naturel 2 similitude de mots
Flux d'obtention du résultat du traitement asynchrone à l'aide de Django et Celery
Dockerfile avec les bibliothèques nécessaires pour le traitement du langage naturel avec python
Pourquoi l'expression distribuée des mots est-elle importante pour le traitement du langage naturel?
Étudiez le traitement du langage naturel avec Kikagaku
100 traitements du langage naturel frappent le chapitre 4 Commentaire
Traitement du langage naturel pour les personnes occupées
[Traitement du langage naturel] Prétraitement avec le japonais
Langage naturel: Word2Vec Part3 - Modèle CBOW
Langage naturel: Word2Vec Part1 - Corpus japonais
Logivan du langage artificiel et traitement du langage naturel (traitement du langage artificiel)
Traiter le résultat de% time,% timeit
100 traitement du langage knock-59: analyse de la formule S
Se préparer à démarrer le traitement du langage naturel
Résumé de l'installation de l'analyseur de traitement du langage naturel
Visualisez l'état de la réponse du recensement national 2020
Décidons le gagnant du bingo
Langage naturel: Word2Vec Part2 - Modèle de saut-gramme
Résumé du traitement multi-processus du langage de script
De l'introduction de l'API GoogleCloudPlatform Natural Language à son utilisation
Remplissage facile des données pouvant être utilisées dans le traitement du langage naturel
Parlons de la courbe de tonalité du traitement d'image ~ LUT est incroyable ~
J'ai essayé de résoudre 100 traitements linguistiques Knock version 2020 [Chapitre 3: Expressions régulières 25-29]
Création d'une extension Chrome qui utilise la puissance du traitement du langage naturel pour chasser les sites sombres du monde