――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.
OS: macOS Catalina Sprache: python3.6.6
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")
id | title | year | description |
---|---|---|---|
1 | (Titel der Erfindung) | (Bewerbungsjahr usw.) | (Text) |
2 | ・ ・ ・ | ・ ・ ・ | ・ ・ ・ |
――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.
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.
Recommended Posts