[PYTHON] Erstellen einer Karte mit Lösungen für Patentprobleme mit Guided LDA (erste Hälfte)

1. Zweck

Da der Patenttext lang ist, möchte ich ihn effizient lesen oder die allgemeine Tendenz als Gruppe von Patenten erfassen. Zu diesem Zeitpunkt ist es leicht zu verstehen, ob die Sätze nach "Problem (Zweck)" und "Lösung" kategorisiert und zugeordnet werden können. Die Abbildung sieht wie unten aus.

image.png Referenz: http://www.sato-pat.co.jp/contents/service/examination/facture.html

Ich möchte diese Problemachse und die Lösungsachse (Beschriftung) automatisch aus dem Text extrahieren. Das Problembewusstsein ist fast dasselbe wie bei diesem Artikel. Eine der Methoden ist LDA. Themen können jedoch in normaler LDA nicht frei manipuliert werden. Guided LDA (Guided LDA) ist eine Möglichkeit für Menschen, anzupassen, dass "dieses Thema solche Wörter enthält (ich möchte, dass sie erscheinen)". Überprüfen Sie, ob Sie die Achse so einstellen können, wie Sie sie verwenden möchten.

2. Geführte LDA

Eine Übersicht über die geführte LDA finden Sie unter hier und hier. Offiziell

3. Prozessablauf

Zunächst werde ich es an den Punkt bringen, an dem es ausgegeben werden kann.

1. Erforderliche Bibliotheks- und Funktionsdefinitionen

@ title ← [STEP1]( erforderlich </ font>) Vorbereitung für die Ausführung

!pip install guidedlda
import numpy as np
import pandas as pd
import guidedlda

#Funktion zum Erstellen eines nicht codierten Ergebnisses aus corpus () from sklearn.feature_extraction.text import CountVectorizer def get_X_vocab(corpus): vectorizer = CountVectorizer(token_pattern='(?u)\b\w\w+\b') X = vectorizer.fit_transform(corpus) return X.toarray(), vectorizer.get_feature_names()

#Funktion zum Extrahieren des Hauptworts für jedes Thema def out1(model,vocab): n_top_words = 10 dic = {} topic_word = model.topic_word_ for i,topic_dist in enumerate(topic_word): topic_words = np.array(vocab)[np.argsort(topic_dist)][:-(n_top_words+1):-1] print('Topic {}: {}'.format(i, ' '.join(topic_words))) dic['topic'+str(i)] = ' '.join(topic_words) return dic

2. Speichern Sie Patentdaten (CSV oder Excel) im Pandas-Datenrahmen.

Teilen Sie mit Mecab (ich glaube nicht, dass es Mecab ist). col ist die zu verarbeitende Spalte.

df[col+'_1g']= df[col].apply(wakati,args=('DE',))

3. Geben Sie die Spalte an, die Sie verarbeiten möchten (Problemachse und Lösungsachse).

@ title ← [STEP2]( erforderlich </ font>) Geben Sie die zu verarbeitende Spalte an

col_name = "Problem, dass die Erfindung versucht, _1g zu lösen" # @param {type: "string"} col_name2 = "Abrechnungsbereich_1g" # @param {type: "string"}

df[col_name].replace({'\d+':''},regex=True,inplace=True)
df[col_name2].replace({'\d+':''},regex=True,inplace=True)

#Corpus ⇒ X (Ausgabe der Dokumentwortfrequenzmatrix und der Vokalliste corpus = df[col_name].apply(lambda x:" ".join(x.split("|"))) X,vocab = get_X_vocab(corpus) word2id = dict((v,idx) for idx,v in enumerate(vocab))

#Corpus ⇒ X (Ausgabe der Dokumentwortfrequenzmatrix und der Vokalliste corpus2 = df[col_name2].apply(lambda x:" ".join(x.split("|"))) X2,vocab2 = get_X_vocab(corpus2) word2id2 = dict((v,idx) for idx,v in enumerate(vocab2))

print ("Extrahierte Vokabelliste ---------------") print(vocab) print ("word count:" + str (len (vocab))) pd.DataFrame (Vokabeln) .to_csv (col_name + "word list.csv") print(vocab2) print ("word count:" + str (len (vocab2))) pd.DataFrame (vocab2) .to_csv (col_name2 + "word list.csv") print ("Die Wortliste wurde in der virtuellen Datei als" word list.xlsx "gespeichert")

image.png

4. Problemachse und Lösung Geben Sie das Wort der Achse für jede Achse an. + Guided LDA anwenden

Da der Wortlaut der Achse problematisch ist, wählen Sie ihn entsprechend aus.

@ title ← [STEP3] Task side_Semi-Lehrer LDA-Ausführung

Es ist wirklich wichtig, die Wortliste hier anzugeben

topic0_subj = ",".join(vocab[51:60])
topic1_subj = ",".join(vocab[61:70])
topic2_subj = ",".join(vocab[71:80])
topic3_subj = ",".join(vocab[81:90])
topic4_subj = ",".join(vocab[91:100])
topic5_subj = ",".join(vocab[101:110])
topic6_subj = ",".join(vocab[111:120])

input_topic0 = topic0_subj.split(",")
input_topic1 = topic1_subj.split(",")
input_topic2 = topic2_subj.split(",")
input_topic3 = topic3_subj.split(",")
input_topic4 = topic4_subj.split(",")
input_topic5 = topic5_subj.split(",")
input_topic6 = topic6_subj.split(",")

topic_list = [input_topic0
               ,input_topic1
               ,input_topic2
               ,input_topic3
               ,input_topic4
               ,input_topic5]

seed_topic_list = []
for k,topic in enumerate(topic_list):
    if topic[0]=="":
        pass
    else:
        seed_topic_list.append(topic)

#Topic Number ist die angegebene Anzahl von Themen + 1 num_topic = len(seed_topic_list)+1

s_conf = 0.12 #@param {type:"slider", min:0, max:1, step:0.01}
model = guidedlda.GuidedLDA(n_topics=num_topic, n_iter=100, random_state=7, refresh=20)
seed_topics = {}
for t_id,st in enumerate(seed_topic_list):
    for word in st:
        seed_topics[word2id[word]] = t_id

model.fit(X,seed_topics=seed_topics,seed_confidence=s_conf)
docs = model.fit_transform(X,seed_topics={},seed_confidence=s_conf)
print(docs)

print ("Ergebnis --- Typische Wörter für jedes Thema nach dem Lernen ------------------------------ ---------- ") print ("Das letzte Thema wurde automatisch eingefügt" Anderes "Thema ----------------------------") dic = out1(model,vocab)

print ("Ergebnis der Themenzuweisung für jede Anwendung ------------------------------------ ---------------- ") print("") df["no"]=df.index.tolist() df ['LDA result_subj'] = df ["no"] .apply (Lambda x: "topic" + str (docs [x] .argmax ())) df [["Anwendungsnummer", "LDA result_subj"]] df ['LDA result_subj'] = df ['LDA result_subj']. replace (dic) image.png

Ferner wird die Achse der Lösung auf die gleiche Weise verarbeitet.

5. Kreuztabelle der Zuschussergebnisse (Antragsnummer wird nach der Tabellierung in das Quadrat eingefügt)

ct = pd.crosstab (df ['LDA result_kai'], df ['LDA result_subj'], df ['Anwendungsnummer'], aggfunc = ','. join) ct

Ergebnis ↓ Als einen Punkt, den ich mir ausgedacht habe, wird der Achsname als Thema ● angezeigt, wenn die Ausgabe so ist, wie sie ist. Daher habe ich versucht, die 10 wichtigsten typischen Wörter des Themas auszugeben.

image.png

Wenn Sie die Anzahl der Fälle anzeigen möchten,

ct = pd.crosstab (df ['LDA result_kai'], df ['LDA result_subj'], df ['Anwendungsnummer'], aggfunc = np.size)

image.png

4. Leistungsbewertung

~~ Es war ein Durcheinander ... ~~ Ich habe die Wörter richtig zusammengestellt, also muss ich das nächste Mal versuchen, die von Menschen erstellte Karte richtig zu reproduzieren. Ich habe auch das Gefühl, dass der Code redundant ist (für die 2-Achsen-Verarbeitung), daher muss ich überlegen, wie ich ihn präziser schreiben kann.

Recommended Posts