GuidedLDA로 특허 과제 해결 수단 맵 작성(전반)

7264 단어 파이썬mecabLDA

1. 목적



특허문장은 길기 때문에 효율적으로 읽고 싶거나 특허군으로서 전체적인 경향을 파악하고 싶다. 이때 문장을 '과제(목적)'와 '해결수단'으로 분류하여 맵화할 수 있다고 파악하기 쉽다. 그림으로서는 아래와 같은 느낌.


참조 : h tp // w w. 사토파 t. 이. jp / 혼텐 ts / 세 r ゃ ぃ せ / 에아 미나 치 온 / 후 c 얽힌. HTML

이 과제 축과 해결 수단의 축(라벨)을 문장으로부터 자동적으로 추출하고 싶다. 문제의식은 이 기사 과 거의 같다. 방법의 한개에는 LDA가 있다. 그러나 일반 LDA에서는 주제를 자유롭게 조작할 수 없다. 인간이 "이 주제에는 이런 말이 나온다"를 조정할 수 있는 방법으로 가이드 첨부 LDA(GuidedLDA)가 있다. 이것을 사용해 원하는 대로 축을 잘 ​​설정할 수 있는지 본다.

2. 가이드가 있는 LDA



가이드 LDA의 개요는 여기여기 참조.
공식

3. 처리 흐름



우선은 출력이 가능한 곳까지 가져간다.

1. 필요한 라이브러리와 함수 정의


#@title ←【STEP1】(<font color="red">必須</font>)実行準備
!pip install guidedlda
import numpy as np
import pandas as pd
import guidedlda

#コーパスからonehotエンコード結果を作成するのための関数()
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()

#トピック毎に主要語を抽出する関数
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. 특허 데이터 (csv 또는 excel)를 pandas dataframe에 저장.



mecab로 나누기 (mecab가 아니어도 좋다고 생각한다). col은 처리 대상의 열.
df[col+'_1g']= df[col].apply(wakati,args=('DE',))

3. 처리 대상으로 하고 싶은 열의 지정(과제축과 해결 수단축의 2개)


#@title ←【STEP2】(<font color="red">必須</font>)処理対象の列指定
col_name = "発明が解決しようとする課題_1g" #@param {type:"string"}
col_name2 = "請求の範囲_1g" #@param {type:"string"}

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

#コーパス⇒X(文書単語頻度行列&vocabリスト出力
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))

#コーパス⇒X(文書単語頻度行列&vocabリスト出力
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("抽出された語彙リスト---------------")
print(vocab)
print("単語数:"+str(len(vocab)))
pd.DataFrame(vocab).to_csv(col_name+"単語リスト.csv")
print(vocab2)
print("単語数:"+str(len(vocab2)))
pd.DataFrame(vocab2).to_csv(col_name2+"単語リスト.csv")
print("単語リストが仮想ファイルに「単語リスト.xlsx」として保存されました")



4. 과제 축과 해결 수단 축 각각에 대해 축의 단어를 지정+GuidedLDA 적용



축의 말하고 있지만 귀찮기 때문에, 적당하게 선택.
#@title ←【STEP3】課題側_半教師有りLDA実行
#ほんとはここのワードリストの指定が大事
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数は指定トピック数+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("結果------学習後のtopic毎の代表的な言葉----------------------------------------")
print("最後のtopicは自動的に挿入された「その他」のトピック----------------------------")
dic = out1(model,vocab)

print("各出願へのtopic割当結果--------------------------------------------------------")
print("")
df["no"]=df.index.tolist()
df['LDA結果_subj'] = df["no"].apply(lambda x:"topic" + str(docs[x].argmax()))
df[["出願番号","LDA結果_subj"]]
df['LDA結果_subj'] = df['LDA結果_subj'].replace(dic)



또한, 해결 수단의 축도 마찬가지로 처리된다.

5. 부여 결과를 크로스 집계(집계 후의 매스에는 출원 번호를 삽입)


ct = pd.crosstab(df['LDA結果_kai'], df['LDA結果_subj'], df['出願番号'], aggfunc=','.join)
ct

결과↓
궁리한 점으로서는, 그대로의 출력에서는, 축명이 topic●로 나오기 때문에, 그 주제에 포함되는 대표적인 워드 상위 10위를 출력시키도록 한 점.



건수를 표시하고 싶은 경우는
ct = pd.crosstab(df['LDA結果_kai'], df['LDA結果_subj'], df['出願番号'], aggfunc=np.size)



4. 성능 평가



잔잔했다 ...
적당히 워드를 정리해 주고 있으므로, 다음은 제대로 인간이 만든 맵을 재현할 수 있을까 시험하지 않으면.
그리고 왠지 코드가 중복인 생각이 들기 때문에(2축 처리하기 때문에), 보다 간결하게 쓰는 방법 요 검토.

좋은 웹페이지 즐겨찾기