[PYTHON] Création d'une carte pour résoudre les problèmes de brevets avec Guided LDA (premier semestre)

1. Objet

É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.

image.png 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é.

2. LDA guidé

Voir ici et ici pour un aperçu du LDA guidé. Officiel

3. Flux de processus

Tout d'abord, je vais l'amener au point où il peut être produit.

1. Bibliothèque et définitions de fonction requises

@ title ← [STEP1]( obligatoire </ font>) Préparation à l'exécution

!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

2. Stockez les données de brevet (csv ou excel) dans la trame de données pandas.

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',))

3. Spécifiez la colonne que vous souhaitez traiter (axe du problème et axe de la solution)

@ title ← [STEP2]( required </ font>) Spécifiez la colonne à traiter

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 "")

image.png

4. Axe du problème et solution Spécifiez le mot de l'axe pour chaque axe + Appliquer LDA guidé

Le libellé de l'axe étant gênant, sélectionnez-le de manière appropriée.

@ title ← [STEP3] Task side_Semi-enseignant LDA exécution

#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) image.png

En outre, l'axe de la solution est traité de la même manière.

5. Tableau croisé des résultats de la subvention (le numéro de la demande est inséré dans le carré après la tabulation)

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.

image.png

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)

image.png

4. Évaluation des performances

~~ 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