複合テーマの分析
複数のサブテーマの公報データを結合してテーマ全体の公報データを作成し、このテーマ全体の公報データに対して以下の処理を行い、特許出願動向調査のレポートを作成する。
・コード化(1桁目はサブテーマのコードを割り当てる)
・集計
・図表作成
・コメント作成
・レポート作成
# コードの1桁目はサブテーマとし、2桁目以下はIPCを集計・分析してコード化する。
サンプルスクリプト
# スクリブト1 サブテーマ対照表読み込み
import pandas as pd
import numpy as np
import collections
import openpyxl
import sys
# サブテーマ読み込み
subtema_data = pd.read_excel('テーマ設定data.xlsx',sheet_name='subテーマ')
subtema_data = subtema_data.dropna(how='all') # 全列がNaNである行を削除
print('サブテーマ数=',len(subtema_data))
# コード読み込み
subtema_data01 = subtema_data.iloc[:,0]
subtema_list01 = []
for str1 in subtema_data01:
subtema_list01.append(str1)
print('サブテーマコード=',subtema_list01)
# サブテーマ読み込み
subtema_data02 = subtema_data.iloc[:,1]
subtema_list02 = []
for str1 in subtema_data02:
subtema_list02.append(str1)
print('サブテーマ名=',subtema_list02)
subcode = subtema_list01[0]
subtema = subtema_list02[0]
print('サブコード=',subcode)
print('サブテーマ=',subtema)
# スクリブト7 コアクラスに3桁コードを付与
## 出現頻度がmin_clst以上のクラスをコアクラスとして3桁コードを付与
coreclcode_list = ['a'] # コアクラスコード グローバル変数
corecltxt_list = ['a'] # コアクラス内容 グローバル変数
def coreclass_fuyo():
global cl_list
global cltxt_list
global hindo_list3
global coreclass_list
global coreclcode_list
global corecltxt_list
global min_clst
# min_clst以上のクラスを読み込み
coreclass_list = []
for n1, nhindo in enumerate(hindo_list3):
if nhindo > min_clst:
bclass = ipc_list3[n1]
coreclass_list.append(bclass)
# coreclass_listでソート
coreclass_list = sorted(coreclass_list)
# コアクラスに3桁コードを付与
classcode_list = []
n_chr =64
for str1 in coreclass_list:
n_chr = n_chr + 1
str1 = chr(n_chr)
classcode_list.append(str1)
# コード内容付与
ct1 = 0
coreclcode_list= []
corecltxt_list = []
for n1,str1 in enumerate(coreclass_list):
# コード付与
ct1 = ct1 + 1
if ct1 <= 9: ct1_str = '0' + str(ct1)
if ct1 >= 10: ct1_str = str(ct1)
str2 = subcode + ct1_str
coreclcode_list.append(str2)
# コード内容を追加
for n2, str3 in enumerate(cl_list):
if str1 == str3:
corecltxt_list.append(cltxt_list[n2])
# DataFrame化
df1 = pd.DataFrame(data=coreclass_list,columns=['特許分類'])
df2 = pd.DataFrame(data=coreclcode_list,columns=['コード'])
df3 = pd.DataFrame(data=corecltxt_list,columns=['コード内容'])
# 集計表にまとめる
df4=pd.concat([df1, df2, df3], axis=1)
# CSVとして書き出し
df4.to_csv('./中間data/class_code表.csv',encoding='utf-8', index=False)
print('class_code表.csvを書き出しました')
return coreclass_list, coreclcode_list, corecltxt_list
# スクリブト8 IPCサブクラス別出現頻度を集計
subcl_list4 = ['a'] # サブクラスのグローバル変数
subclhindo_list4 = 0 # サブクラス出現回数のグローバル変数
def subclass_shukei():
global subcl_list4
global subclhindo_list4
# 公報データを分割し、サブクラスに修正
subclass_list = []
for str1 in ipc_list02:
ipc_split = str1.split(';') # 分割
list1 = []
for str2 in ipc_split: # 展開し、サブクラスに修正
str2 = str2[0:4]
list1.append(str2)
subclass_list.append(list1)
# [[]]を[]に変換
list2 = []
for str1 in subclass_list:
list2=list2 + str1
# IPC別に集計
ct_ipc = collections.Counter(list2)
ipc_n = list(ct_ipc.items()) # keyとvalueをリストに格納
ipc_n_list = []
ipc_list = []
for str1 in ipc_n:
str2 = list(str1)
ipc_n_list.append(str2)
ipc_list.append(str2[0])
# 出現頻度の高い順にソート
ipc_n_list = sorted(ipc_n_list, key=lambda x:x[1], reverse=True)
# IPC4桁(サブクラス)別の集計表(クラス集計表)を作成
subcl_list4 = []
subclhindo_list4 = []
for n,str1 in enumerate(ipc_n_list):
subcl_list4.append(str1[0])
subclhindo_list4.append(str1[1])
# DataFrame化
df1 = pd.DataFrame(data=subcl_list4,columns=['サブクラス'])
df2 = pd.DataFrame(data=subclhindo_list4,columns=['出現頻度'])
# 集計表にまとめる
df3=pd.concat([df1, df2], axis=1)
# CSVとして書き出し
df3.to_csv('./中間data/subclass_hindo表.csv',encoding='utf-8', index=False)
print('subclass_hindo表.csvを書き出しました')
return subcl_list4, subclhindo_list4
# スクリブト9 コアサブクラス毎に4桁コードを付与
## コアクラス毎に出現頻度がmin_clst/2以上(以下なら上位3個)のサブクラスを抽出し、
## 抽出したサブクラスをコアサブクラスとし、4桁コードを付与
subcl_list01 = ['a'] # コアサブクラスのグローバル変数
coresubcd_list = ['a'] # コアサブクラスコードのグローバル変数
coresubtxt_list = ['a'] # コアサブクラス内容のグローバル変数
def corsubcl_fuyo():
global subcl_list4
global subclhindo_list4
global coreclcode_list
global corecltxt_list
global min_clst
global subcl_list01
global coresubcd_list
global coresubtxt_list
# コアクラスに属しかつmin_clst/2以上のサブクラスをコアサブクラスとして読み込む
coresubclass_list = []
subclasscode_list = []
subcl_list4
for n1, str1 in enumerate(subcl_list4):
for n2, str2 in enumerate(coreclass_list):
if str2 in str1:
if subclhindo_list4[n1] > min_clst/2:
coresubclass_list.append(str1)
str4 = coreclcode_list[n2] + 'A' # 仮コード'A'を付与classcode_list
subclasscode_list.append(str4)
# DataFrame化
df1 = pd.DataFrame(data=coresubclass_list,columns=['特許分類'])
df2 = pd.DataFrame(data=subclasscode_list,columns=['コード'])
# 結合
df20=pd.concat([df1, df2], axis=1)
# サブクラスでソート
df20 = df20.sort_values('コード', ascending=True) # 昇順
# df20読み込み
# 新コアサブクラス読み込み
coresubclass_list = df20.iloc[:,0]
subcl_list01 = []
for str1 in coresubclass_list:
subcl_list01.append(str1)
# 新コアサブクラスコード読み込み
coresubclass_list = df20.iloc[:,1]
subcl_list02 = []
for str1 in coresubclass_list:
subcl_list02.append(str1)
# コアサブクラスの4桁コードを修正
bcode = ''
n_chr = 64
coresubcd_list = []
for str1 in subcl_list02:
# コード追加
if str1 != bcode: n_chr = 64
n_chr = n_chr + 1
str3 = chr(n_chr)
str4 = str1[0:3] + str3
coresubcd_list.append(str4)
bcode = str1
# コード内容付与
coresubtxt_list = []
for n1,str1 in enumerate(subcl_list01): # 新コアサブクラス
# クラス内容付与
for n2, str2 in enumerate(subc_list): # サブクラス
if str1 == str2:
str3 = subctxt_list[n2]
break
coresubtxt_list.append(str3)
# DataFrame化
df1 = pd.DataFrame(data=subcl_list01,columns=['特許分類'])
df2 = pd.DataFrame(data=coresubcd_list,columns=['コード'])
df3 = pd.DataFrame(data=coresubtxt_list,columns=['コード内容'])
# subclasscode集計表にまとめる
df4=pd.concat([df1, df2, df3], axis=1)
# CSVとして書き出し
df4.to_csv('./中間data/subclass_code表.csv',encoding='utf-8', index=False)
print('subclass_code表.csvを書き出しました')
return subcl_list01, coresubcd_list, coresubtxt_list
# スクリブト10 IPC別出現頻度を集計
ipc_list4 = ['a'] # IPCのグローバル変数
hindo_list4 = 0 # IPC出現回数のグローバル変数
def ipc_shukei():
global ipc_list02
global ipc_list4
global hindo_list4
ipc_list = []
for str1 in ipc_list02:
ipc_split = str1.split(';') # 分割
list1 = []
for str2 in ipc_split: # 展開
list1.append(str2)
ipc_list.append(list1)
# [[]]を[]に変換
list2 = []
for str1 in ipc_list:
list2=list2 + str1
# IPC別に集計
ct_ipc = collections.Counter(list2)
ipc_n = list(ct_ipc.items()) # keyとvalueをリストに格納
ipc_n_list = []
ipc_list = []
for str1 in ipc_n:
str2 = list(str1)
ipc_n_list.append(str2)
ipc_list.append(str2[0])
# 出現頻度の高い順にソート
ipc_n_list = sorted(ipc_n_list, key=lambda x:x[1], reverse=True)
# IPC全桁別の集計表(IPC全桁集計表)を作成
ipc_list4 = []
hindo_list4 = []
for n,str1 in enumerate(ipc_n_list):
ipc_list4.append(str1[0])
hindo_list4.append(str1[1])
# DataFrame化
df1 = pd.DataFrame(data=ipc_list4,columns=['IPC'])
df2 = pd.DataFrame(data=hindo_list4,columns=['出現頻度'])
# 集計表にまとめる
df3=pd.concat([df1, df2], axis=1)
# CSVとして書き出し
df3.to_csv('./中間data/IPC_hindo表.csv',encoding='utf-8', index=False)
print('IPC_hindo表.csvを書き出しました')
return ipc_list4, hindo_list4
# スクリブト11 コアIPC毎に6桁コードを付与
## コアサブクラス毎に出現頻度がmin_clst/4以上(以下なら上位3個)のIPCを抽出し、
## 抽出したIPCをコアIPCとし、6桁コードを付与する。
coreipc_list02 = ['a'] # コアIPCのグローバル変数
ipccode_list05 = ['a'] # コアIPCコードのグローバル変数
codetxt_list = ['a'] # コアIPC内容のグローバル変数
def coreipc_fuyo():
global ipc_list4
global subcl_list01
global coreipc_list02
global ipccode_list05
global codetxt_list
global ipc_list
global ipctxt_list
global ipccode_list02
# コアサブクラスに属しかつmin_clst/4以上のIPCをコアIPCとして読み込む
coreipc_list = []
ipccode_list = []
for n1, str1 in enumerate(ipc_list4): # コアIPC毎に
for n2, str2 in enumerate(subcl_list01):
if str2 in str1:
if hindo_list4[n1] > min_clst/4:
coreipc_list.append(str1)
str4 = coresubcd_list[n2] + '01' # 仮コード'01'を付与
ipccode_list.append(str4)
# DataFrame化
df1 = pd.DataFrame(data=coreipc_list,columns=['特許分類'])
df2 = pd.DataFrame(data=ipccode_list,columns=['コード'])
# 結合
df20=pd.concat([df1, df2], axis=1)
# IPCでソート
df20 = df20.sort_values('特許分類', ascending=True) # 昇順
# df20読み込み
# 新コアIPC読み込み
coreipc_list01 = df20.iloc[:,0]
coreipc_list02 = []
for str1 in coreipc_list01:
coreipc_list02.append(str1)
# 新コアIPCコード読み込み
coreipccode_list02 = df20.iloc[:,1]
ipccode_list02 = []
for str1 in coreipccode_list02:
ipccode_list02.append(str1)
# 新コアIPCの3桁コードを修正(3桁が異なればct1を加算)
bcode = ''
ct1 = 0
ipccode_list03 = []
for n1, str1 in enumerate(coreipc_list02):
str2 = str1[0:3]
if str2 != bcode:
ct1 = ct1 + 1
if ct1 <= 9: ct1_str = '0' + str(ct1)
if ct1 >= 10: ct1_str = str(ct1)
str3 = subcode + ct1_str
ipccode_list03.append(str3)
else:
ipccode_list03.append(str3)
bcode = str2
# 新コアIPCの4桁コードを修正(3桁が同じで4桁目が異なればn_chrを加算)
# 新コアIPCの4桁コードを修正(3桁が同じで「/」までが異なればn_chrを加算)
bcode1 = '' # 3桁
bcode2 = '' # 「/」まで
n_chr = 64 # chr(65)='A'
ipccode_list04 = []
for n1, str1 in enumerate(coreipc_list02):
str2 = str1[0:3]
npos = str1.find('/')
str3= str1[0: npos +1]
if str2 != bcode1:
n_chr = 65
str5 = ipccode_list03[n1] + chr(n_chr)
ipccode_list04.append(str5)
if str2 == bcode1:
if str3 != bcode2:
n_chr = n_chr + 1
str4 = chr(n_chr)
str5 = ipccode_list03[n1] + chr(n_chr)
ipccode_list04.append(str5)
else:
str5 = ipccode_list03[n1] + chr(n_chr)
ipccode_list04.append(str5)
bcode1 = str2
bcode2 = str3
# 新コアIPCの6桁コードを修正(4桁が同じで「/」までが異なればct1を加算)
## 「/」まで同じIPCを別ード化(H01L31/とH01L51/を別コード化)
bcode1 = '' # 4桁
bcode2 = '' # 「/」まで
ct1 = 0
nmax = 0
ipccode_list05 = []
for n1, str1 in enumerate(coreipc_list02):
npos = str1.find('/')
str2= str1[0: npos +1]
if str2 != bcode1:
ct1 = 1
str3 = ipccode_list04[n1] + str('01')
ipccode_list05.append(str3)
if str2 == bcode1:
if str1 != bcode2:
ct1 =ct1 + 1
if ct1 > nmax: nmax = ct1
if ct1 <= 9: ct1_str = '0' + str(ct1)
if ct1 >= 10: ct1_str = str(ct1)
str3 = ipccode_list04[n1] + ct1_str
ipccode_list05.append(str3)
else:
str3 = ipccode_list04[n1] + ct1_str
ipccode_list05.append(str3)
bcode1 = str2
bcode2 = str1
# print('5-6桁の最大数=',nmax)
# コード内容付与
codetxt_list = []
for n1, str1 in enumerate(coreipc_list02): # 新コアIPC
for n2, str2 in enumerate(ipc_list): # IPC
if str1 == str2:
str3 = ipctxt_list[n2]
codetxt_list.append(str3)
# DataFrame化
df1 = pd.DataFrame(data=coreipc_list02,columns=['特許分類'])
df2 = pd.DataFrame(data=ipccode_list05,columns=['コード'])
df3 = pd.DataFrame(data=codetxt_list,columns=['コード内容'])
# 結合
df4=pd.concat([df1, df2,df3], axis=1)
# CSVとして書き出し
df4.to_csv('./中間data/IPC_code表00.csv',encoding='utf-8', index=False)
# '5-6桁の最大数=',nmaxが15を越えていれば、「/」以下2桁に修正
if nmax > 15:
bcode = ''
coreipc_list03 = []
ipccode_list06 = []
for n1, str1 in enumerate(coreipc_list02):
npos = str1.find('/')
str2= str1[0: npos +3]
if str2 != bcode:
coreipc_list03.append(str2)
str3 = ipccode_list04[n1]
ipccode_list06.append(str3)
bcode = str2
# 「/」以下2桁に修正
bcode1 = '' # 4桁
bcode2 = '' # 全桁
ct1 = 0
nmax = 0
ipccode_list07 = []
for n1, str1 in enumerate(coreipc_list03):
npos = str1.find('/')
str2= str1[0: npos +1]
if str2 != bcode1:
ct1 = 1
str3 = ipccode_list06[n1] + str('01')
ipccode_list07.append(str3)
if str2 == bcode1:
if str1 != bcode2:
ct1 =ct1 + 1
if ct1 > nmax: nmax = ct1
if ct1 <= 9: ct1_str = '0' + str(ct1)
if ct1 >= 10: ct1_str = str(ct1)
str3 = ipccode_list06[n1] + ct1_str
ipccode_list07.append(str3)
else:
str3 = ipccode_list06[n1] + ct1_str
ipccode_list07.append(str3)
bcode1 = str2
bcode2 = str1
# コード内容付与
codetxt_list = []
for n1, str1 in enumerate(coreipc_list03): # 新コアIPC
flg = 0
for n2, str2 in enumerate(ipc_list02): # IPC
if str1 == str2:
str3 = ipctxt_list[n2]
flg =1
break
else:
str3 = ''
if flg == 0:
# 元のIPCに戻して照合
nlen = len(str1)
else:
nlen = nmax
for str4 in coreipc_list02:
if str1 == str4[0:nlen]:
for n3, str5 in enumerate(ipc_list02): # IPC
if str5 == str4:
str3 = ipctxt_list[n3]
coreipc_list03[n1] = str4
break
else:
str3 = ''
codetxt_list.append(str3)
# DataFrame化
df1 = pd.DataFrame(data=coreipc_list02,columns=['特許分類'])
df2 = pd.DataFrame(data=ipccode_list05,columns=['コード'])
df3 = pd.DataFrame(data=codetxt_list,columns=['コード内容'])
# 集計表にまとめる
df4=pd.concat([df1, df2, df3], axis=1)
# CSVとして書き出し
df4.to_csv('./中間data/IPC_code表.csv',encoding='utf-8', index=False)
print('IPC_code表.csvを書き出しました')
return coreipc_list02, ipccode_list05, codetxt_list
その他は、単一テーマのコード化と大差ないので省略する。