[PYTHON] Visualisation bidimensionnelle des vecteurs de documents à l'aide du modèle entraîné Word2Vec

Aperçu

――Il est difficile de générer un modèle d'apprentissage qui utilise une énorme quantité de données comme entrée avec des spécifications de PC personnel, mais j'apprécierais que vous puissiez publier le modèle formé de cette manière.

environnement

OS: macOS Catalina Langage: python3.6.6

code

Voici le code que j'ai créé. MeCab est utilisé pour l'analyse morphologique japonaise. Le modèle Word2Vec est de 300 dimensions et utilise le TSNE de scikit-learn pour le réduire à 2 dimensions.

patent_w2v_JP.py


from sklearn.manifold import TSNE
from gensim.models import word2vec
from statistics import mean
import string
import re
import MeCab
import pandas as pd
import numpy as np

#Lecture des données d'entrée
df = pd.read_csv('input.csv', encoding="utf-8")
#Combinez le titre et le résumé
df['text'] = df['title'].str.cat(df['abstract'], sep=' ')

#Liste de mots vides (ajouter à cette liste, le cas échéant)
stop_words = []

#Tokenizer MeCab
def mecab_token_list(text):
    token_list = []
    tagger = MeCab.Tagger()
    tagger.parse('') 
    node = tagger.parseToNode(text)
    while node:
        pos = node.feature.split(",")
        if not node.surface in stop_words: #Exclure les mots vides
            if pos[6] != '*': #Ajouter les mots trouvés
                token_list.append(pos[6])
            else: #Sinon, ajoutez un mot de surface
                token_list.append(node.surface)
        node = node.next
    return list(token_list)

#Supprimer les numéros
df['text_clean'] = df.text.map(lambda x: re.sub(r'\d+', '', x))
#Tous les caractères anglais sont unifiés en minuscules
df['text_clean'] = df.text_clean.map(lambda x: x.lower())
#MeCab Tokenize
df['text_tokens'] = df.text_clean.map(lambda x: mecab_token_list(x))

#Chargement du modèle Word2Vec
model = word2vec.Word2Vec.load("patent_w2v_d300_20191125.model")

#Initialisez la trame de données dans un tableau de 300 dimensions
doc_vec = np.zeros((df.shape[0], 300))
#Préparez une liste pour stocker la couverture du modèle des mots apparaissant dans chaque document
coverage = []
#Stocker le vecteur moyen de chaque document dans un tableau
for i,doc in enumerate(df['text_tokens']): #Traiter les informations textuelles après analyse morphologique dans l'ordre des documents
    feature_vec = np.zeros(300) #Initialiser 300 dimensions à 0
    num_words = 0
    no_count = 0
    for word in doc: #Traitez mot par mot dans chaque document
        try: #Traitement pour ajouter des vecteurs de mots
            feature_vec += model.wv[word]
            num_words += 1
        except: #Les mots non couverts par le modèle analytique passent
            no_count += 1
    #Divisez la somme des vecteurs de mots obtenus par le nombre de mots pour calculer la valeur moyenne et la stocker comme vecteur de document.
    feature_vec = feature_vec / num_words
    doc_vec[i] = feature_vec
    #Calculer et stocker la couverture de mots pour chaque document
    cover_rate = num_words / (num_words + no_count)
    coverage.append(cover_rate)

#Afficher la couverture de mots moyenne
mean_coverage = round(mean(coverage)*100, 2)
print("Word cover-rate: " + str(mean_coverage) + "%")

#t-Réduction de dimension par SNE
tsne= TSNE(n_components=2, init='pca', verbose=1, random_state=2000, perplexity=50, learning_rate=200, method='exact', n_iter=1000)
embedding = tsne.fit_transform(doc_vec)
#Stocker dans DataFrame
embedding = pd.DataFrame(embedding, columns=['x', 'y'])
embedding["id"]= df.id
embedding["year"]= df.year
embedding["title"]= df.title
embedding["abstract"]= df.abstract

#Sortie sous forme de fichier CSV
embedding.to_csv("output.csv", encoding="utf_8")

Structure des données d'entrée

--Les données d'entrée sont supposées être un document de brevet et il est supposé que le format CSV suivant comprend des données telles que l'identifiant, l'année (année de dépôt, etc.), le titre (nom de l'invention), la description (texte). J'aimerais que vous aménagiez cette zone comme il convient.

id title year description
1 (Titre de l'invention) (Année de candidature, etc.) (Texte)
2 ・ ・ ・ ・ ・ ・ ・ ・ ・

--Il est supposé que les données d'entrée (input.csv), le modèle Word2Vec et ce script python sont tous dans le même répertoire. Veuillez organiser cette zone de manière appropriée en fonction de la configuration.

Points à retenir

――Pour le moment, le taux de couverture des mots apparaissant dans le modèle est réglé pour être affiché sur la console. Ceci est calculé en faisant la moyenne du taux de couverture de mots dans chaque document.

Comme il est basé sur du code créé à d'autres fins, nous avons confirmé l'opération avec des exemples de données, mais nous ne l'avons pas essayée avec le jeu de données réel du document de brevet. Je me demande si je devrais l'obtenir sur J-PlatPat.

Image de visualisation 2D

Si vous utilisez matplotlib etc., il semble que vous puissiez même visualiser avec python uniquement, mais pour référence, si vous détournez le SIG (système d'information géographique) et le visualisez, ce sera comme ça. Chaque tracé est une donnée documentaire et est cartographié thermiquement en fonction du degré de concentration sur le plan bidimensionnel. Je pense que ces expressions sont utiles comme base de classification et d'analyse. sample_w2v.png

Recommended Posts

Visualisation bidimensionnelle des vecteurs de documents à l'aide du modèle entraîné Word2Vec
Implémentation de VGG16 à l'aide de Keras créé sans utiliser de modèle entraîné
Visualisation de matrices mixtes à l'aide de sklearn.metrics.ConfusionMatrixDisplay
Détournement de couches de modèle de keras entraînées
Principes de base de Tableau (visualisation à l'aide d'informations géographiques)
Avantages de l'utilisation de slugfield dans le modèle Django
Publication d'un modèle entraîné de fastText
Faire des inférences à l'aide du modèle entraîné de scicit-learn dans PySpark