Étant donné que le texte du brevet est long, je veux le lire efficacement, ou je veux saisir la tendance générale en tant que groupe de brevets. À ce stade, il est facile de comprendre si les phrases peuvent être catégorisées par «problème (but)» et «solution» et cartographiées. La figure ressemble à celle ci-dessous.
Référence: http://www.sato-pat.co.jp/contents/service/examination/facture.html
Je souhaite extraire automatiquement cet axe de problème et l'axe de solution (étiquette) du texte. La prise de conscience du problème est presque la même que cet article. L'une des méthodes est LDA. Cependant, les sujets ne peuvent pas être librement manipulés dans un LDA normal. Guided LDA (Guided LDA) est un moyen pour les humains d'ajuster que "ce sujet a de tels mots (je veux qu'ils apparaissent)". Voyez si vous pouvez définir l'axe comme vous voulez qu'il soit utilisé.
Voir ici et ici pour un aperçu du LDA guidé. Officiel
Tout d'abord, je vais l'amener au point où il peut être produit.
!pip install guidedlda
import numpy as np
import pandas as pd
import guidedlda
#Fonction pour créer un résultat encodé onehot à partir de 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()
#Fonction pour extraire le mot principal de chaque sujet 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
Partagez avec mecab (je ne pense pas que ce soit mecab). col est la colonne à traiter.
df[col+'_1g']= df[col].apply(wakati,args=('DE',))
col_name = "Problème à résoudre par l'invention_1g" # @param {type: "string"} col_name2 = "Plage de facturation_1g" # @ param {type: "string"}
df[col_name].replace({'\d+':''},regex=True,inplace=True)
df[col_name2].replace({'\d+':''},regex=True,inplace=True)
#Corpus ⇒ X (matrice de fréquence de mot de document et sortie de liste vocale 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 (matrice de fréquence de mot de document et sortie de liste vocale 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 ("Liste de vocabulaire extraite ---------------") print(vocab) print ("nombre de mots:" + str (len (vocab))) pd.DataFrame (vocab) .to_csv (col_name + "word list.csv") print(vocab2) print ("nombre de mots:" + str (len (vocab2))) pd.DataFrame (vocab2) .to_csv (col_name2 + "word list.csv") print ("La liste de mots a été enregistrée dans le fichier virtuel sous le nom" liste de mots.xlsx "")
Le libellé de l'axe étant gênant, sélectionnez-le de manière appropriée.
#Il est vraiment important de spécifier la liste de mots ici 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 est le nombre spécifié de sujets + 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 ("Résultat --- Mots typiques pour chaque sujet après l'apprentissage ------------------------------ ---------- ") print ("Le dernier sujet a été automatiquement inséré" Autre "sujet ----------------------------") dic = out1(model,vocab)
print ("Résultat de l'affectation des rubriques à chaque application ---------------------------------------- ---------------- ") print("") df["no"]=df.index.tolist() df ['LDA result_subj'] = df ["no"] .apply (lambda x: "topic" + str (docs [x] .argmax ())) df [["Numéro de la demande", "LDA result_subj"]] df ['LDA result_subj'] = df ['LDA result_subj']. replace (dic)
En outre, l'axe de la solution est traité de la même manière.
ct = pd.crosstab (df ['LDA result_kai'], df ['LDA result_subj'], df ['application number'], aggfunc = ','. join) ct
Résultat ↓ Comme point que j'ai imaginé, si la sortie est telle qu'elle est, le nom de l'axe apparaîtra en tant que thème ●, j'ai donc essayé de sortir les 10 principaux mots typiques inclus dans la rubrique.
Si vous souhaitez afficher le nombre de cas,
ct = pd.crosstab (df ['LDA result_kai'], df ['LDA result_subj'], df ['application number'], aggfunc = np.size)
~~ C'était un gâchis ... ~~ J'ai bien rassemblé les mots, donc la prochaine fois, je devrai essayer de reproduire correctement la carte créée par des humains. Je pense également que le code est redondant (pour le traitement à 2 axes), je dois donc réfléchir à la manière de l'écrire de manière plus concise.
Recommended Posts