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.
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.
Eine Übersicht über die geführte LDA finden Sie unter hier und hier. Offiziell
Zunächst werde ich es an den Punkt bringen, an dem es ausgegeben werden kann.
!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
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',))
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")
Da der Wortlaut der Achse problematisch ist, wählen Sie ihn entsprechend aus.
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)
Ferner wird die Achse der Lösung auf die gleiche Weise verarbeitet.
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.
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)
~~ 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