[PYTHON] Zweidimensionale Visualisierung von Dokumentvektoren mit einem von Word2Vec trainierten Modell

Überblick

――Es ist schwierig, ein Lernmodell zu erstellen, das eine große Datenmenge als Eingabe mit persönlichen PC-Spezifikationen verwendet, aber ich würde es begrüßen, wenn Sie das trainierte Modell auf diese Weise veröffentlichen könnten.

Umgebung

OS: macOS Catalina Sprache: python3.6.6

Code

Hier ist der Code, den ich erstellt habe. MeCab wird für die japanische morphologische Analyse verwendet. Das Word2Vec-Modell hat 300 Dimensionen und verwendet TSNE von scikit-learn, um es auf zwei Dimensionen zu reduzieren.

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

#Eingabedaten lesen
df = pd.read_csv('input.csv', encoding="utf-8")
#Titel und Zusammenfassung kombinieren
df['text'] = df['title'].str.cat(df['abstract'], sep=' ')

#Liste der Stoppwörter (ggf. zu dieser Liste hinzufügen)
stop_words = []

#MeCab Tokenizer
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: #Stoppwörter ausschließen
            if pos[6] != '*': #Fügen Sie alle gefundenen Wörter hinzu
                token_list.append(pos[6])
            else: #Wenn nicht, fügen Sie ein Oberflächenwort hinzu
                token_list.append(node.surface)
        node = node.next
    return list(token_list)

#Zahlen entfernen
df['text_clean'] = df.text.map(lambda x: re.sub(r'\d+', '', x))
#Alle englischen Zeichen werden in Kleinbuchstaben zusammengefasst
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))

#Laden des Word2Vec-Modells
model = word2vec.Word2Vec.load("patent_w2v_d300_20191125.model")

#Initialisieren Sie den Datenrahmen in ein 300-dimensionales Array
doc_vec = np.zeros((df.shape[0], 300))
#Bereiten Sie eine Liste vor, um die Modellabdeckung der angezeigten Wörter in jedem Dokument zu speichern
coverage = []
#Speichern Sie den Durchschnittsvektor jedes Dokuments in einem Array
for i,doc in enumerate(df['text_tokens']): #Verarbeiten Sie Textinformationen nach morphologischer Analyse in Dokumentreihenfolge
    feature_vec = np.zeros(300) #Initialisieren Sie 300 Dimensionen auf 0
    num_words = 0
    no_count = 0
    for word in doc: #Verarbeiten Sie Wort für Wort in jedem Dokument
        try: #Verarbeitung zum Hinzufügen von Wortvektoren
            feature_vec += model.wv[word]
            num_words += 1
        except: #Wörter, die nicht im analytischen Modell enthalten sind, werden bestanden
            no_count += 1
    #Teilen Sie die Summe der erhaltenen Wortvektoren durch die Anzahl der Wörter, um den Durchschnittswert zu berechnen und als Dokumentvektor zu speichern.
    feature_vec = feature_vec / num_words
    doc_vec[i] = feature_vec
    #Berechnen und speichern Sie die Wortabdeckung für jedes Dokument
    cover_rate = num_words / (num_words + no_count)
    coverage.append(cover_rate)

#Durchschnittliche Wortabdeckung anzeigen
mean_coverage = round(mean(coverage)*100, 2)
print("Word cover-rate: " + str(mean_coverage) + "%")

#t-Dimensionsreduktion durch 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)
#In DataFrame speichern
embedding = pd.DataFrame(embedding, columns=['x', 'y'])
embedding["id"]= df.id
embedding["year"]= df.year
embedding["title"]= df.title
embedding["abstract"]= df.abstract

#Ausgabe als CSV-Datei
embedding.to_csv("output.csv", encoding="utf_8")

Eingabedatenstruktur

id title year description
1 (Titel der Erfindung) (Bewerbungsjahr usw.) (Text)
2 ・ ・ ・ ・ ・ ・ ・ ・ ・

Punkte, die man sich merken sollte

――Zur Zeit wird die Abdeckungsrate der im Modell vorkommenden Wörter so eingestellt, dass sie auf der Konsole angezeigt wird. Dies wird berechnet, indem die Wortabdeckung jedes Dokuments gemittelt wird.

――Da er auf Code basiert, der für andere Zwecke erstellt wurde, haben wir den Vorgang mit Beispieldaten bestätigt, ihn jedoch nicht mit dem tatsächlichen Datensatz von Patentdokumenten ausprobiert. Ich frage mich, ob ich es bei J-PlatPat bekommen soll.

Bild der 2D-Visualisierung

Wenn Sie matplotlib usw. verwenden, können Sie anscheinend sogar nur mit Python visualisieren. Wenn Sie jedoch als Referenz GIS (Geografisches Informationssystem) umleiten und visualisieren, sieht es so aus. Jedes Diagramm besteht aus Dokumentdaten und wird entsprechend dem Konzentrationsgrad auf der zweidimensionalen Ebene wärmekartiert. Ich denke, diese Ausdrücke sind nützlich als Grundlage für die Klassifizierung und Analyse. sample_w2v.png

Recommended Posts

Zweidimensionale Visualisierung von Dokumentvektoren mit einem von Word2Vec trainierten Modell
Implementierung von VGG16 mit Keras, die ohne Verwendung eines trainierten Modells erstellt wurden
Visualisierung gemischter Matrizen mit sklearn.metrics.ConfusionMatrixDisplay
Umleitung trainierter Keras-Modellschichten
Grundlagen der Tableau-Grundlagen (Visualisierung mit geografischen Informationen)
Vorteile der Verwendung von Slugfield im Django-Modell
Veröffentlichung eines geschulten Modells von fastText
Machen Sie Schlussfolgerungen mit dem trainierten Modell des Scicit-Learn in PySpark