――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.
OS: macOS Catalina Langage: python3.6.6
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")
--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.
――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.
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.
Recommended Posts