GuidedLDA로 특허 과제 해결 수단 맵 작성(전반)
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축 처리하기 때문에), 보다 간결하게 쓰는 방법 요 검토.
Reference
이 문제에 관하여(GuidedLDA로 특허 과제 해결 수단 맵 작성(전반)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/niship2/items/b9c3f62544742a5ab791
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
가이드 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축 처리하기 때문에), 보다 간결하게 쓰는 방법 요 검토.
Reference
이 문제에 관하여(GuidedLDA로 특허 과제 해결 수단 맵 작성(전반)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/niship2/items/b9c3f62544742a5ab791
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#@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
df[col+'_1g']= df[col].apply(wakati,args=('DE',))
#@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」として保存されました")
#@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)
ct = pd.crosstab(df['LDA結果_kai'], df['LDA結果_subj'], df['出願番号'], aggfunc=','.join)
ct
ct = pd.crosstab(df['LDA結果_kai'], df['LDA結果_subj'], df['出願番号'], aggfunc=np.size)
잔잔했다 ...
적당히 워드를 정리해 주고 있으므로, 다음은 제대로 인간이 만든 맵을 재현할 수 있을까 시험하지 않으면.
그리고 왠지 코드가 중복인 생각이 들기 때문에(2축 처리하기 때문에), 보다 간결하게 쓰는 방법 요 검토.
Reference
이 문제에 관하여(GuidedLDA로 특허 과제 해결 수단 맵 작성(전반)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/niship2/items/b9c3f62544742a5ab791텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)