コード化方法の説明
コード化は機械学習のクラスタリングの考え方を参考にしており、次のように処理している。
・高出現頻度のIPCをコアIPCとし、これに関連するIPC、FIを付加する。
・コアIPCと付加IPC、FIとを結合し、特許分類(IPC,FI)とコードとコード内容の対照表を作成する。
・コード化できなかった公報データを再度集計し、その他の特許分類とコードとコード内容の対照表を作成する。
・その他の特許分類とコードとコード内容を対照表に追加する。
・作成した対照表に基づいて公報データにコードを付加する。
・その他のコードについてトピックKWを作成し、コード内容の代用とする。
サンプルスクリプト
# スクリブト3 IPCクラス別出現頻度を集計
# IPC欄読み込み
ipc_data = pat_data.iloc[:,6]
df07 = pd.DataFrame(data=ipc_data)
# 分割してリスト化
ipc_list01 = []
for str1 in ipc_data:
list1_split = str1.split(';') # 「;」で分割
ipc_list01.append(list1_split)
# 公報データを分割し、クラスに修正
class_list = []
for str1 in ipc_data:
ipc_split = str1.split(';') # 分割
list1 = []
for str2 in ipc_split: # 展開し、クラスに修正
str2 = str2[0:3]
list1.append(str2)
class_list.append(list1)
print('class_list[0:3]=',class_list[0:3])
# [[]]を[]に変換
list2 = []
for str1 in class_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)
class_list.append(str2[0])
# 出現頻度の高い順にソート
ipc_n_list = sorted(ipc_n_list, key=lambda x:x[1], reverse=True)
# IPC3桁(クラス)別の集計表(クラス集計表)を作成
ipc_list3 = []
hindo_list3 = []
for n,str1 in enumerate(ipc_n_list):
ipc_list3.append(str1[0])
hindo_list3.append(str1[1])
print('クラス数=',len(ipc_list3))
# DataFrame化
df1 = pd.DataFrame(data=ipc_list3,columns=['クラス'])
df2 = pd.DataFrame(data=hindo_list3,columns=['出現頻度'])
# 集計表にまとめる
df20=pd.concat([df1, df2], axis=1)
# CSVとして書き出し
df20.to_csv('./中間data/class_hindo表.csv',encoding='utf-8', index=False)
print('class_hindo表.csvを書き出しました')
# スクリブト4 コアクラスに1桁コードを付与
## 出現頻度がmin_clst以上のクラスをコアクラスとして1桁コードを付与する。
# min_clst以上のクラスを読み込み
coreclass_list = []
for n1, nhindo in enumerate(hindo_list3):
if nhindo > min_clst:
bclass = ipc_list3[n1]
coreclass_list.append(bclass)
print('コアクラス数=',len(coreclass_list))
print('コアクラス=',coreclass_list)
# コアクラスに1桁コードを付与
classcode_list = []
n_chr =64
for str1 in coreclass_list:
n_chr = n_chr + 1
str1 = chr(n_chr)
classcode_list.append(str1)
print('クラスコード=',classcode_list)
# クラスデータ読み込み
pat_data2 = pd.read_excel('IPC分類表.xlsx', sheet_name='クラス表')
print('クラス数=',len(pat_data2))
# クラスコード読み込み
cl_data1 = pat_data2.iloc[:,1]
cl_list =[]
for str1 in cl_data1:
cl_list.append(str(str1))
# クラス内容読み込み
cl_data2 = pat_data2.iloc[:,2]
cltxt_list =[]
for str1 in cl_data2:
cltxt_list.append(str(str1))
# コード内容付与
codetxt_list = []
for n,str1 in enumerate(coreclass_list):
# クラス内容付与
if len(str1) == 3:
for n1, str2 in enumerate(cl_list):
if str1 == str2:
str3 = cltxt_list[n1]
break
codetxt_list.append(str3)
print('クラス内容[0:2]=',codetxt_list[0:2])
# DataFrame化
df1 = pd.DataFrame(data=coreclass_list,columns=['特許分類'])
df2 = pd.DataFrame(data=classcode_list,columns=['コード'])
df3 = pd.DataFrame(data=codetxt_list,columns=['コード内容'])
# 集計表にまとめる
df20=pd.concat([df1, df2, df3], axis=1)
# CSVとして書き出し
df20.to_csv('./中間data/class_code表.csv',encoding='utf-8', index=False)
print('class_code表.csvを書き出しました')
# スクリブト5 IPCサブクラス別出現頻度を集計
# IPC欄読み込み
ipc_data = pat_data.iloc[:,6]
df07 = pd.DataFrame(data=ipc_data)
# 分割してリスト化
ipc_list01 = []
for str1 in ipc_data:
list1_split = str1.split(';') # 「;」で分割
ipc_list01.append(list1_split)
print('ipc_list01[0]=',ipc_list01[0]) # IPCリスト
# 公報データを分割し、サブクラスに修正
subclass_list = []
for str1 in ipc_data:
ipc_split = str1.split(';') # 分割
list1 = []
for str2 in ipc_split: # 展開し、サブクラスに修正
str2 = str2[0:4]
list1.append(str2)
subclass_list.append(list1)
print('subclass_list[0:3]=',subclass_list[0:3])
# [[]]を[]に変換
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)
class_list.append(str2[0])
# 出現頻度の高い順にソート
ipc_n_list = sorted(ipc_n_list, key=lambda x:x[1], reverse=True)
# IPC4桁(サブクラス)別の集計表(クラス集計表)を作成
subcl_list4 = []
hindo_list4 = []
for n,str1 in enumerate(ipc_n_list):
subcl_list4.append(str1[0])
hindo_list4.append(str1[1])
print('サブクラス数=',len(subcl_list4))
print('サブクラス[0:5]=',subcl_list4[0:5])
print('出現頻度[0:5]=',hindo_list4[0:5])
# DataFrame化
df1 = pd.DataFrame(data=subcl_list4,columns=['サブクラス'])
df2 = pd.DataFrame(data=hindo_list4,columns=['出現頻度'])
# 集計表にまとめる
df20=pd.concat([df1, df2], axis=1)
# CSVとして書き出し
df20.to_csv('./中間data/subclass_hindo表.csv',encoding='utf-8', index=False)
print('subclass_hindo表.csvを書き出しました')
# min_clst以上のサブクラスをコアサブクラスとして読み込む
coresubclass_list = []
for n1, nhindo in enumerate(hindo_list4):
if nhindo > min_clst:
bclass = subcl_list4[n1]
coresubclass_list.append(bclass)
print('コアサブクラス数=',len(coresubclass_list))
print('コアサブクラス=',coresubclass_list)
# スクリブト6 コアサブクラス毎に3桁コードを付与
## コアクラス毎に出現頻度がmin_clst/2以上のサブクラスを抽出し、コアサブクラスとして3桁コードを付与
## コアサブクラスが無かったコアクラスがあれば、
## 当該コアクラスの代表として上位1個をコアサブクラスとして3桁コードを追加付与する。
# コアサブクラス毎に3桁コードを付与
coresubclass_list = []
subclasscode_list = []
Z03class_list = []
Z03code_list = []
for n1, str1 in enumerate(coreclass_list): # コアクラス毎に
classcode = classcode_list[n1]
ct01 = 0 # コアクラス毎のコード数カウンタ
# min_clst以上のサブクラス読み込み
ct3 = 0 # コード値のカウンタ
flg = 0
for n2, str2 in enumerate(subcl_list4): # サブクラス読み込み
if str2[0:3] == str1:
if hindo_list4[n2] > min_clst/2: # min_clst/2より多ければ
flg = 1
ct01 = ct01 + 1
# コアサブクラス追加
if str2 not in coresubclass_list:
coresubclass_list.append(str2)
# コード追加
ct3 = ct3 + 1
if ct3 <= 9: ct3_str = '0' + str(ct3)
if ct3 >= 10: ct3_str = str(ct3)
subclass = classcode + ct3_str
if subclass not in subclasscode_list:
subclasscode_list.append(subclass)
# コアサブクラスが無かったコアクラスは、そのサブクラスの上位1個にコード付与
if flg == 0:
flg = 1
ct01 = ct01 + 1
for str3 in subcl_list4:
if str3[0:3] == str1:
str4 = str3
break
print('追加コアサブクラス=',str4)
if str2 not in coresubclass_list:
coresubclass_list.append(str4)
ct3 = ct3 + 1
if ct3 <= 9: ct3_str = '0' + str(ct3)
if ct3 >= 10: ct3_str = str(ct3)
subclass = classcode + ct3_str
if subclass not in subclasscode_list:
subclasscode_list.append(subclass)
print('コアサブクラス=',coresubclass_list)
print('サブクラスコード=',subclasscode_list)
# サブクラスデータ読み込み
pat_data3 = pd.read_excel('IPC分類表.xlsx', sheet_name='サブクラス表')
# print('サブクラス数=',len(pat_data3))
# サブクラスコード読み込み
subc_data01 = pat_data3.iloc[:,1]
subc_list =[]
for str1 in subc_data01:
subc_list.append(str(str1))
# print('サブクラス=',subc_list[0:5])
# サブクラス内容読み込み
subc_data02 = pat_data3.iloc[:,2]
subctxt_list =[]
for str1 in subc_data02:
subctxt_list.append(str(str1))
# print('サブクラス内容=',subctxt_list[0:3])
# コード内容付与
codetxt_list = []
for n,str1 in enumerate(coresubclass_list):
# クラス内容付与
if len(str1) == 4:
for n1, str2 in enumerate(subc_list):
if str1 == str2:
str3 = subctxt_list[n1]
break
codetxt_list.append(str3)
print('コード内容[0:2]=',codetxt_list[0:2])
# DataFrame化
df1 = pd.DataFrame(data=coresubclass_list,columns=['特許分類'])
df2 = pd.DataFrame(data=subclasscode_list,columns=['コード'])
df3 = pd.DataFrame(data=codetxt_list,columns=['コード内容'])
# subclasscode集計表にまとめる
df20=pd.concat([df1, df2, df3], axis=1)
# CSVとして書き出し
df20.to_csv('./中間data/subclass_code表.csv',encoding='utf-8', index=False)
print('subclass_code表.csvを書き出しました')
# スクリブト7 IPC別出現頻度を集計
# IPC欄読み込み
ipc_data = pat_data.iloc[:,6]
# 分割してリスト化
ipc_list01 = []
for str1 in ipc_data:
list1_split = str1.split(';') # 「;」で分割
ipc_list01.append(list1_split)
# 公報データをIPC別に分割
ipc_list = []
for str1 in ipc_data:
ipc_split = str1.split(';') # 分割
list1 = []
for str2 in ipc_split: # 展開
list1.append(str2)
ipc_list.append(list1)
print('IPC_list[0:2]=',ipc_list[0:2])
# [[]]を[]に変換
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)
class_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])
print('IPC数=',len(ipc_list4))
# DataFrame化
df1 = pd.DataFrame(data=ipc_list4,columns=['IPC'])
df2 = pd.DataFrame(data=hindo_list4,columns=['出現頻度'])
# 集計表にまとめる
df20=pd.concat([df1, df2], axis=1)
# CSVとして書き出し
df20.to_csv('./中間data/IPC_hindo表.csv',encoding='utf-8', index=False)
print('IPC_hindo表.csvを書き出しました')
# スクリブト8 コアIPC毎に4桁コードを付与
## コアサブクラス毎に出現頻度がmin_clst以上のIPCを抽出し、コアIPCとして4桁コードを付与する。
## コアIPCが無かったコアサブクラスがあれば、
## 当該コアクラスの代表として上位1個をコアIPCとして4桁コードを追加付与する。
# min_clst以上のIPCをコアIPCとして読み込む
coreipc_list = []
for n1, nhindo in enumerate(hindo_list4):
if nhindo > min_clst:
bclass = ipc_list4[n1]
coreipc_list.append(bclass)
print('元コアIPC数=',len(coreipc_list))
print('元コアIPC=',coreipc_list)
# コアIPC毎に4桁コードを付与
coreipc_list01 = []
ipccode_list01 = []
for n1, str1 in enumerate(coresubclass_list): # コアサブクラス毎に
subclasscode = subclasscode_list[n1]
ct01 = 0 # コアクラス毎のコード数カウンタ
n_chr = 64 # コード値の初期化(chr(65)='A')
# min_clst以上のコアIPCに4桁コードを付与
ct3 = 0 # コード値のカウンタ
flg = 0
for n2, str2 in enumerate(ipc_list4): # IPC読み込み
if str2[0:4] == str1:
if hindo_list4[n2] > min_clst: # min_clstより多ければ
flg = 1
ct01 = ct01 + 1
coreipc_list01.append(str2)
n_chr = n_chr + 1
str3 = chr(n_chr)
bcode = subclasscode + str3
ipccode_list01.append(bcode)
# コアIPCが無かったコアサブクラスは、その下位IPCの上位2個にコード付与
if flg == 0:
flg = 1
ct01 = ct01 + 1
ipc2_list = []
for str3 in ipc_list4:
if str1 in str3:
ipc2_list.append(str3)
str2 = ipc2_list[0]
if len(ipc2_list) > 1:
bstr2 = ipc2_list[1]
else:
bstr2 = str2
# print('追加コアIPC=',str2)
coreipc_list01.append(str2)
n_chr = n_chr + 1
str4 = chr(n_chr)
bipc = subclasscode + str4
ipccode_list01.append(bipc)
print('コアIPC数=',len(coreipc_list01))
print('コアIPC=',coreipc_list01)
print('コアIPCコード=',ipccode_list01)
# IPC分類表.csv読み込み
pat_data05 = pd.read_csv('allIPC分類表.csv', encoding='utf-8')
# IPC読み込み
ipc_data01 = pat_data05.iloc[:,2]
ipc_list01 =[]
for str3 in ipc_data01:
ipc_list01.append(str(str3))
# 分類内容読み込み
ipc_data2 = pat_data05.iloc[:,4]
ipctxt_list01 =[]
for str3 in ipc_data2:
ipctxt_list01.append(str(str3))
# コード内容付与/無ければstr1をbstr2に変更
coreipc_list02 = []
ipccode_list02 = []
codetxt_list02 = []
for n1, str1 in enumerate(coreipc_list01):
# コード内容付与
flg = 0
for n2, str2 in enumerate(ipc_list01):
if str1 == str2:
str3 = ipctxt_list01[n2]
coreipc_list02.append(coreipc_list01[n1])
ipccode_list02.append(ipccode_list01[n1])
codetxt_list02.append(str3)
flg = 1
break
if flg == 0: # 無ければstr1をbstr2に変更
for n2, str2 in enumerate(ipc_list01):
if bstr2 == str2:
str3 = ipctxt_list01[n2]
coreipc_list02.append(coreipc_list01[n1])
ipccode_list02.append(ipccode_list01[n1])
codetxt_list02.append(str3)
break
print('IPC内容[0:2]=',codetxt_list02[0:2])
# DataFrame化
df1 = pd.DataFrame(data=coreipc_list02,columns=['特許分類'])
df2 = pd.DataFrame(data=ipccode_list02,columns=['コード'])
df3 = pd.DataFrame(data=codetxt_list02,columns=['コード内容'])
# 集計表にまとめる
df20=pd.concat([df1, df2, df3], axis=1)
# CSVとして書き出し
df20.to_csv('./中間data/IPC_code表.csv',encoding='utf-8', index=False)
print('IPC_code表.csvを書き出しました')
# スクリブト9 コアIPCを含むFIの読み込み
# csvデータ読み込み
ipc_code01 = pd.read_csv('./中間data/IPC_code表.csv', encoding='utf-8')
# コアIPC読み込み
ipc_data = ipc_code01.iloc[:,0]
# リストに変更
ipc_list01 = ipc_data.values
# 読み込むシート名(A~H)を抽出
sheet_name = []
for str1 in ipc_list01:
str2 = str1[0]
sheet_name.append(str2)
sheet_name = list(set(sheet_name)) # 重複を削除
print('シート名',sheet_name)
# メインコードのipcを含むFIの読み取り
ficode_list =[]
fidot_list = []
fiti_list =[]
for str1 in sheet_name: # # sheet選択
# FIコードと分類内容の読み込み
fi_data = pd.read_excel('FI分類表.xlsx',sheet_name=str1)
for str2 in ipc_list01: # コアIPC読み込み
# FIデータ読み込み
ficode_data = fi_data.iloc[:,1]
fidot_data = fi_data.iloc[:,2]
fiti_data = fi_data.iloc[:,3]
for n,str3 in enumerate(ficode_data):
if str3 == 'END': break
# FIのコードとドットとタイトルの読み込み
if ',' in str3:
str4 = str3.split(',')
else:
str4 = str3
if str4[0] == str2:
ficode_list.append(str3) # FIコード
str5 = fidot_data[n]
if str(str5) == 'nan': str5 = '空白'
fidot_list.append(str5) # FIドット
str6 = fiti_data[n]
fiti_list.append(str6) # FIタイトル
# メインコードをFI付きに修正
fi_list1 = []
fi_list2 = []
fi_list3 = []
fi_list4 = []
for n1, str1 in enumerate(ipc_list01): # コアIPC
for n2, str2 in enumerate(ficode_list): # FIコード
str3 = str2.split(',')
if str3[0] == str1:
fi_list1.append(str1)
fi_list2.append(str2)
fi_list3.append(fidot_list[n2])
fi_list4.append(fiti_list[n2])
print('コアIPC[0:4]=',fi_list1[0:4])
print('FIコード[0:4]=',fi_list2[0:4])
print('FIドット[0:4]=',fi_list3[0:4])
print('FIタイトル[0:4]=',fi_list4[0:4])
# DataFrame化
df1 = pd.DataFrame(data=fi_list1,columns=['コアIPC'])
df2 = pd.DataFrame(data=fi_list2,columns=['特許分類'])
df3 = pd.DataFrame(data=fi_list3,columns=['FIドット'])
df4 = pd.DataFrame(data=fi_list4,columns=['コード内容'])
# 集計表にまとめる
df20=pd.concat([df1, df2, df3,df4], axis=1)
# CSVとして書き出し
df20.to_csv('./中間data/FIデータリスト1.csv',encoding='utf-8', index=False)
print('FIデータリスト1.csvを書き出しました')
# スクリブト10 メイングループに対応するFIグループに階層パターンのパターンコードを付与
## メイングループに対応するFIグループの階層パターンを調べ、タイプコードを付与する
### タイプ0 =(nword1=0,nword3=0,nword4=0) nword1+nword3*2+nword4*4 =0
### タイプ1 =(nword1=1,nword3=0,nword4=0) nword1+nword3*2+nword4*4 =1
### タイプ2 =(nword1=0,nword3=1,nword4=0) nword1+nword3*2+nword4*4 =2
### タイプ3 =(nword1=1,nword3=1,nword4=0) nword1+nword3*2+nword4*4 =3
### タイプ4 =(nword1=0,nword3=0,nword4=1) nword1+nword3*2+nword4*4 =4
### タイプ5 =(nword1=1,nword3=0,nword4=1) nword1+nword3*2+nword4*4 =5
### タイプ6 =(nword1=0,nword3=1,nword4=1) nword1+nword3*2+nword4*4 =6
### タイプ7 =(nword1=1,nword3=1,nword4=1) nword1+nword3*2+nword4*4 =7
# コアIPC毎に分離
bcode = ''
n0 = len(fi_list1)
bfi_list1 = []
bfi_list2 = []
for n1, str1 in enumerate(fi_list1):
if n1 == 0: bcode = str1
if str1 == bcode:
str1 = fi_list1[n1]
if n1+1< n0:
str11 = fi_list1[n1+1]
str2 = fi_list2[n1]
str3 = fi_list3[n1]
str4 = fi_list4[n1]
bfi_str = str(str1) + ';' + str(str2) + ';' + str(str3) + ';' + str(str4)
bfi_list2.append(bfi_str)
if str11 != bcode: # メインコード毎に分離してリスト化
if n1+1< n0:
bcode = fi_list1[n1+1]
bfi_list1.append(bfi_list2)
bfi_list2 = []
bfi_list1.append(bfi_list2)
print('FIデータ数=',len(bfi_list1),'件')
# 階層パターンを調べ、ドットタイプのコードを付与
nword1 = 0
nword3 = 0
nword4 = 0
main1_list = []
type_list = []
dot_list = []
bstr2 = ''
for n0, str1 in enumerate(bfi_list1):
for n1, str2 in enumerate(str1):
split_str2 = str2.split(';')
str21 = split_str2[1]
bdot = split_str2[2]
dot_list.append(bdot)
if n0 == 0:
if n1 == 0:
bstr2 = split_str2[0]
bficode = split_str2[1]
if str2.find(',') > 0: # ','が含まれていれば
split_str21 = str21.split(',')
str22 = split_str21[1] # [,]以下を抽出゜
bcd = str22
if nword1 == 0:
if len(bcd) == 1: nword1 = 1
if nword3 == 0:
if len(bcd) == 3: nword3 = 1
if nword4 == 0:
if len(bcd) == 4: nword4 = 1
# タイプを判別
if split_str2[0] != bstr2:
if nword1+nword3*2+nword4*4 == 0: dottype = 0
if nword1+nword3*2+nword4*4 == 1: dottype = 1
if nword1+nword3*2+nword4*4 == 2: dottype = 2
if nword1+nword3*2+nword4*4 == 3: dottype = 3
if nword1+nword3*2+nword4*4 == 4: dottype = 4
if nword1+nword3*2+nword4*4 == 5: dottype = 5
if nword1+nword3*2+nword4*4 == 6: dottype = 6
if nword1+nword3*2+nword4*4 == 7: dottype = 7
# リストに追加
main1_list.append(bstr2)
type_list.append(dottype)
# 次のstr2処理のために初期化
bstr2 = split_str2[0] # 次str2(メインコード)を比較用に保存
bficode = split_str2[1] # 表示用に保存
# ワード数カウンタを初期化
nword1 = 0
nword3 = 0
nword4 = 0
# 最後のstr2の結果を追加
if nword1+nword3*2+nword4*4 == 1: dottype = 1
if nword1+nword3*2+nword4*4 == 2: dottype = 2
if nword1+nword3*2+nword4*4 == 3: dottype = 3
if nword1+nword3*2+nword4*4 == 4: dottype = 4
if nword1+nword3*2+nword4*4 == 5: dottype = 5
if nword1+nword3*2+nword4*4 == 6: dottype = 6
if nword1+nword3*2+nword4*4 == 7: dottype = 7
main1_list.append(bstr2)
type_list.append(dottype)
print('コアIPCt[0:5]=',main1_list[0:5])
print('type_listt[0:5]=',type_list[0:5])
print('ドット項目数=',len(dot_list))
print('現ドットリストt[0:5]=',dot_list[0:5])
# FIデータリストにドットタイプを追加
type_list01 = []
for n1, str1 in enumerate(fi_list1): # コアIPC
for n2, str2 in enumerate(main1_list):
if str1 == str2:
type_list01.append(type_list[n2])
# DataFrame化
df1 = pd.DataFrame(data=fi_list1,columns=['コアIPC'])
df2 = pd.DataFrame(data=fi_list2,columns=['特許分類'])
df3 = pd.DataFrame(data=fi_list3,columns=['FIドット'])
df4 = pd.DataFrame(data=fi_list4,columns=['コード内容'])
df5 = pd.DataFrame(data=type_list01,columns=['ドットタイプ'])
# 集計表にまとめる
df20=pd.concat([df1, df2, df3,df4,df5], axis=1)
# CSVとして書き出し
df20.to_csv('./中間data/FIデータリスト2.csv',encoding='utf-8', index=False)
print('FIデータリスト2.csvを書き出しました')
# スクリブト11 FIグループのタイプに応じてグループ毎のFIドット数を修正
import re
# csvデータ読み込み
fi_code01 = pd.read_csv('./中間data/FIデータリスト2.csv', encoding='utf-8')
print('FI=',len(fi_code01),'件')
# コアIPC読み込み
coreipc_data = fi_code01.iloc[:,0]
# リストに変更
coreipc01 = coreipc_data.values
print('coreipc01t[0:5]=',coreipc01[0:5])
# FI読み込み
fi_data = fi_code01.iloc[:,1]
# リストに変更
fi_list01 = fi_data.values
print('fi_list01t[0:4]=',fi_list01[0:4])
# ドット読み込み
dot_data = fi_code01.iloc[:,2]
# リストに変更
dot_list01 = dot_data.values
print('dot_list01t[0:10]=',dot_list01[0:10])
# コード内容読み込み
code_data = fi_code01.iloc[:,3]
# リストに変更
fitxt_list01 = code_data.values
print('fitxt_list01t[0:3]=',fitxt_list01[0:3])
# ドットタイプ読み込み
dottype_data = fi_code01.iloc[:,4]
# リストに変更
type_list01 = dottype_data.values
print('type_list01t[0:10]=',type_list01[0:10])
# FIドット数を修正
new_dot = ''
coreipc_list = []
ficode_list = []
fidot_list = []
fistr_list = []
nall = 0
bipc = ''
ndot01 = 0
for n1,str1 in enumerate(dot_list01):
coreipc = coreipc01[n1]
n_type = type_list01[n1]
if coreipc != bipc: # コアIPCが変われば、修正後ドット数ndot=0とする
ndot = 0 # 修正後トット数を初期化
fidot_list.append(ndot)
coreipc_list.append(coreipc01[n1] )
ficode_list.append(fi_list01[n1] )
fistr_list.append(fitxt_list01[n1])
if str(str1) != '空白':
basedot = len(str1)
else:
basedot = 0
plusdot = 0 # 加算ドット数を初期化
nbaselen = len(fi_list01[n1]) # 基本桁数
else: # コアIPCが同じならば、
if str(str1) != '空白':
ndot01 = len(str1)
else:
ndot01 = 0
# ドットタイプにより加算ドット数(plusdot)を変更
if n_type == 1:
if str(str1) == '空白': plusdot = 0 # 途中で空白になれば初期化
if n_type == 3:
if str(str1) == '空白':
plusdot = 0 # 途中で空白になれば初期化
if n_type == 6:
if str(str1) == '空白':
if len(fi_list01[n1]) > len(fi_list01[n1-1]):
plusdot = bndot + 1 # 空白でかつ桁数が増加すれば下位とみなす
if len(fi_list01[n1]) == nbaselen: # 基本桁数に戻ればplusdot=0とする
plusdot = 0
if n_type == 7:
if str(str1) == '空白':
if len(fi_list01[n1]) > len(fi_list01[n1-1]):
plusdot = bndot + 1 # 空白でかつ桁数が増加すれば下位とみなす
if len(fi_list01[n1]) < len(fi_list01[n1-1]): # 桁数が減少すればplusdot=0とする
plusdot = 0
# 修正後ドット数を計算
ndot = ndot01 - basedot + plusdot # 最初のドット数を差し引き、plusdotを加算
# 書き出しデータを追加
fidot_list.append(ndot) # 修正後ドット数
coreipc_list.append(coreipc01[n1] )
ficode_list.append(fi_list01[n1] )
fistr_list.append(fitxt_list01[n1])
# プログラム制御用の前データを更新
bipc = coreipc # 前行のコアIPC
bndot = ndot01 # 前行のドット数
# DataFrame化
df1 = pd.DataFrame(data=coreipc_list,columns=['コアIPC'])
df2 = pd.DataFrame(data=ficode_list,columns=['特許分類'])
df3 = pd.DataFrame(data=fidot_list,columns=['FIドット'])
df4 = pd.DataFrame(data=fistr_list,columns=['コード内容'])
# FIデータリストを作成
df20=pd.concat([df1, df2,df3,df4], axis=1)
# CSVとして書き出し
df20.to_csv('./中間data/FIデータリスト3.csv',encoding='utf-8', index=False)
print('FIデータリスト3.csvを書き出しました')
# スクリブト12 FI別出現頻度を集計
# 公報csv読み込み
pat_data = pd.read_csv('./中間data/new_patlist.csv', encoding='utf-8')
# FI欄読み込み
fi_data = pat_data.iloc[:,7]
# 分割してリスト化
fi_list01 = []
for str1 in ipc_data:
list1_split = str1.split(';') # 「;」で分割
fi_list01.append(list1_split)
print('FI_list01[0]=',fi_list01[0]) # FICリスト
# 公報データをFI別に分割
fi_list = []
for str1 in fi_data:
fi_split = str1.split(';') # 分割
list1 = []
for str2 in fi_split: # 展開
list1.append(str2)
fi_list.append(list1)
print('FI_list[0:1]=',fi_list[0:1])
# [[]]を[]に変換
list2 = []
for str1 in fi_list:
list2=list2 + str1
# FI別に集計
ct_fi = collections.Counter(list2)
fi_n = list(ct_fi.items()) # keyとvalueをリストに格納
fi_n_list = []
fi_list = []
for str1 in fi_n:
str2 = list(str1)
fi_n_list.append(str2)
# 出現頻度の高い順にソート
fi_n_list = sorted(fi_n_list, key=lambda x:x[1], reverse=True)
# FI全桁別の集計表(FI全桁集計表)を作成
fi_list4 = []
hindo_list4 = []
for n,str1 in enumerate(fi_n_list):
fi_list4.append(str1[0])
hindo_list4.append(str1[1])
print('頻度集計FI数=',len(fi_list4))
# DataFrame化
df1 = pd.DataFrame(data=fi_list4,columns=['FI'])
df2 = pd.DataFrame(data=hindo_list4,columns=['出現頻度'])
# 集計表にまとめる
df20=pd.concat([df1, df2], axis=1)
# CSVとして書き出し
df20.to_csv('./中間data/FI_hindo表.csv',encoding='utf-8', index=False)
print('FI_hindo表.csvを書き出しました')
# スクリブト13 公報データで少数のFIを削除
# 公報csv読み込み
pat_data = pd.read_csv('./中間data/new_patlist.csv', encoding='utf-8')
# FI01読み込み
fi_data01 = pat_data.iloc[:,7]
fi_list01 =[]
for str1 in fi_data01:
fi_list01.append(str1)
# FIcsv読み込み
fi_data = pd.read_csv('./中間data/FIデータリスト3.csv', encoding='utf-8')
# coreIPC読み込み
ipc_data02 = fi_data.iloc[:,0]
coreipc_list02 =[]
for str1 in ipc_data02:
coreipc_list02.append(str1)
print('coreipc[0:5]=',coreipc_list02[0:5])
# FI02読み込み
fi_data02 = fi_data.iloc[:,1]
fi_list02 =[]
for str1 in fi_data02:
fi_list02.append(str1)
print('FI[0:4]=',fi_list02[0:4])
# FIドット読み込み
fi_data02 = fi_data.iloc[:,2]
fidot_list02 =[]
for str1 in fi_data02:
fidot_list02.append(str1)
# FI内容読み込み
fi_data02 = fi_data.iloc[:,3]
fitxt_list02 =[]
for str1 in fi_data02:
fitxt_list02.append(str1)
# FI出現頻度読み込み
fi_data = pd.read_csv('./中間data/FI_hindo表.csv', encoding='utf-8')
# FI読み込み
fi_data03 = fi_data.iloc[:,0]
fi_list03 =[]
for str1 in fi_data03:
fi_list03.append(str1)
# FI数読み込み
nfi_data03 = fi_data.iloc[:,1]
nfi_list03 =[]
for str1 in nfi_data03:
nfi_list03.append(str1)
# 少数のFIを削除(min_clst/10)/ただしドット数が0は残す
coreipc_list04 = []
fi_list04 = []
fidot_list04 = []
fitxt_list04 = []
for n1,str1 in enumerate(fi_list02): # FIデータリスト2
flg = 0
for str2 in fi_list01: # new_patlist
if str1 in str2:
for n3,str3 in enumerate(fi_list03): # FI_hindo表
if str1 == str3:
if fidot_list02[n1] == 0:
coreipc_list04.append(coreipc_list02[n1])
fi_list04.append(str1)
fidot_list04.append(fidot_list02[n1])
fitxt_list04.append(fitxt_list02[n1])
flg = 1
else:
if nfi_list03[n3] > min_clst/10:
coreipc_list04.append(coreipc_list02[n1])
fi_list04.append(str1)
fidot_list04.append(fidot_list02[n1])
fitxt_list04.append(fitxt_list02[n1])
flg = 1
break
if flg == 1: break
# DataFrame化
df1 = pd.DataFrame(data=coreipc_list04,columns=['コアIPC'])
df2 = pd.DataFrame(data=fi_list04,columns=['特許分類'])
df3 = pd.DataFrame(data=fidot_list04,columns=['FIドット数'])
df4 = pd.DataFrame(data=fitxt_list04,columns=['コード内容'])
# FIデータリストを作成
df20=pd.concat([df1, df2,df3,df4], axis=1)
print('FIデータ数=',len(df20))
# CSVとして書き出し
df20.to_csv('./中間data/FIデータリスト4.csv',encoding='utf-8', index=False)
print('FIデータリスト4.csvを書き出しました')
# スクリブト14 FIデータリスト4のドット数を修正
## FIを削除後のドット数の増減が連続するように修正する。
# csvデータ読み込み
fi_code01 = pd.read_csv('./中間data/FIデータリスト4.csv', encoding='utf-8')
# コアIPC読み込み
coreipc_data = fi_code01.iloc[:,0]
# リストに変更
coreipc_list01 = coreipc_data.values
print('コアIPC[0:5]=',coreipc_list01[0:5])
# FI読み込み
fi_data = fi_code01.iloc[:,1]
# リストに変更
fi_list01 = fi_data.values
print('FI[0:4]=',fi_list01[0:4])
# FIドット数読み込み
fidot_data = fi_code01.iloc[:,2]
# リストに変更
fidot_list01 = fidot_data.values
print('FIドット数[0:5]=',fidot_list01[0:5])
nbasedot = 0
bipc = ''
bfi = ''
bndot = 0
nplus = 0
fidot_list04 =[]
for n1, str1 in enumerate(fi_list01):
str2 = coreipc_list01[n1]
if str2 != bipc:
nbasedot = fidot_list01 [n1]
nplus = 0
fidot_list01 [n1] = 0
fidot_list04.append(fidot_list01 [n1])
else:
if len(str1) > len(bfi):
nbasedot = fidot_list01[n1]
fidot_list01 [n1] = fidot_list01[n1] - nbasedot
fidot_list04.append(fidot_list01 [n1])
else:
if fidot_list01[n1] > nbasedot:
fidot_list01 [n1] = fidot_list01[n1] - nbasedot
else:
fidot_list01 [n1] = 0
fidot_list04.append(fidot_list01 [n1])
bipc = coreipc_list01[n1]
bfi = str1
bndot = fidot_list01[n1]
# DataFrame化
df1 = pd.DataFrame(data=coreipc_list04,columns=['コアIPC'])
df2 = pd.DataFrame(data=fi_list04,columns=['特許分類'])
df3 = pd.DataFrame(data=fidot_list04,columns=['FIドット数'])
df4 = pd.DataFrame(data=fitxt_list04,columns=['コード内容'])
# FIデータリストを作成
df20=pd.concat([df1, df2,df3,df4], axis=1)
# CSVとして書き出し
df20.to_csv('./中間data/FIデータリスト4_2.csv',encoding='utf-8', index=False)
print('FIデータリスト4_2.csvを書き出しました')
# スクリブト15 コアIPCの下位にFIをコード化して追加
## IPC_code表とFIデータリストを結合し、newIPC_code表を作成する。
# csvデータ読み込み
ipc_code01 = pd.read_csv('./中間data/IPC_code表.csv', encoding='utf-8')
print('コアIPC=',len(ipc_code01),'件')
# csvデータ読み込み
fi_code01 = pd.read_csv('./中間data/FIデータリスト4_2.csv', encoding='utf-8')
print('FIデータ=',len(fi_code01),'件')
# FI読み込み
coreipc_data = fi_code01.iloc[:,0]
# リストに変更
coreipc_list01 = coreipc_data.values
print('コアIPC[0:5]=',coreipc_list01[0:5])
# FI読み込み
fi_data = fi_code01.iloc[:,1]
# リストに変更
fi_list01 = fi_data.values
print('FI[0:4]=',fi_list01[0:4])
# FIドット数読み込み
fidot_data = fi_code01.iloc[:,2]
# リストに変更
fidot_list01 = fidot_data.values
print('FIドット数[0:5]=',fidot_list01[0:5])
# FI分類を階層コード化
bipc = ''
ndot = 0
bndot = 0
ct01 = 0 # 5-6桁(00-99)
ct02 = 64 # 7桁(A-Z) chr(65)='A'
ct03 = 0 # 8-9桁(00-99)
# n_chr = 64
coreipc_list = []
ficode_list = []
bad_list = []
for n1, str1 in enumerate(fi_list01):
ndot = fidot_list01[n1]
str2 = coreipc_list01[n1]
if str2 != bipc:
ct01 = 0 # 5-6桁(00-99)
ct02 = 64 # 7桁(A-Z) chr(65)='A'
ct03 = 0 # 8-9桁(00-99)
# ndot=0ならばct01(00-99)でコード化
if ndot == 0:
if ct01 == 0:
nstr = '01'
ficode_list.append(nstr)
coreipc_list.append(str1)
ct01 = ct01 + 1
else:
# ndot=0ならばct01(00-99)でコード化
if ndot== 0:
if bndot > ndot:
ct02 = 64
ct03 = 0
ct01 = ct01 + 1
if ct01 <= 9:
nstr = '0' + str(ct01)
else:
nstr = str(ct01)
ficode_list.append(nstr)
coreipc_list.append(str1)
# ndot=1になればct02(A-Z)でコード化
if ndot== 1:
if bndot > ndot:
ct03 = 0
ct02 = ct02 + 1
if chr(ct02)== 'P':
bad_list.append(str1[0]) # 'P'になればstr1[0]を追加
bcode = chr(ct02)
ficode_list.append(nstr + bcode)
coreipc_list.append(str1)
# ndot>=2ならばct03(00-99)でコード化
if ndot>= 2:
ct03 = ct03 + 1
if ct03 <= 9:
nstr2 = '0' + str(ct03)
else:
nstr2 = str(ct03)
ficode_list.append(nstr + bcode + nstr2)
coreipc_list.append(str1)
# bipc、bndotを更新
bipc = coreipc_list01[n1]
bndot = ndot
print('新coreipc_list[0:3]=',coreipc_list[0:3]) # FIを追加
print('ficode_list[0:5]=',ficode_list[0:5])
print('bad_list[0:5]=',bad_list[0:5])
# ct02(A-Z)が'O'を超えている場合は修正
## 最初のコードは'??A'とし、
## ドットが1以上は??A+00-99に修正
bcode = ''
for str1 in bad_list:
ct03 = 0
for n1, str2 in enumerate(coreipc_list):
if str1 == str2:
ct03 = ct03 + 1
if ct03 <= 9:
nstr2 = '0' + str(ct03)
else:
nstr2 = str(ct03)
## 最初のコードならば'??A'
if str1 != bcode:
ficode = ficode_list[n1][0:2] + 'A'
ct03 = 0
# bcodeを更新
bcode = str1
else:
ficode = ficode_list[n1][0:2] + 'A' + nstr2
ficode_list[n1] = ficode
print(ficode_list[0:5])
# 書き出すと数値に戻るので先頭に'X'を追加
ficode_list2 = []
for str1 in ficode_list:
str2 = 'X' + str1
ficode_list2.append(str2)
# DataFrame化
# df1 = pd.DataFrame(data=maincode_list,columns=['コアIPC'])
# df2 = pd.DataFrame(data=ficode_list,columns=['特許分類'])
df3 = pd.DataFrame(data=ficode_list2,columns=['コード'])
# df4 = pd.DataFrame(data=fistr_list,columns=['コード内容'])
# FIデータリストを作成
df20=pd.concat([df1, df2,df3,df4], axis=1)
# CSVとして書き出し
df20.to_csv('./中間data/FIデータリスト5.csv',encoding='utf-8', index=False)
print('FIデータリスト5.csvを書き出しました')
# スクリブト16 FIデータリストの完全コードに修正
## FIデータリスト3のコードにIPC_コード表の4桁コードを付加する。
# csvデータ読み込み
ipc_code01 = pd.read_csv('./中間data/IPC_code表.csv', encoding='utf-8')
print('IPC_code表=',len(ipc_code01),'件')
# コアIPC読み込み
ipc_data = ipc_code01.iloc[:,0]
# リストに変更
ipc_list01 = ipc_data.values
print('コアIPC[0:5]=',ipc_list01[0:5]) # コアIPC
# コアIPCのコード読み込み
ipccode_data = ipc_code01.iloc[:,1]
# リストに変更
ipccode_list01 = ipccode_data.values
print('コアIPCのコード[0:5]=',ipccode_list01[0:5]) # コアIPCのコード
# csvデータ読み込み
fi_code01 = pd.read_csv('./中間data/FIデータリスト5.csv', encoding='utf-8')
print('FIデータ数=',len(fi_code01),'件')
fi_data01 = fi_code01.iloc[:,0] # コアIPC
fi_data02 = fi_code01.iloc[:,1] # FI
fi_data03 = fi_code01.iloc[:,2] # コード
fi_data04 = fi_code01.iloc[:,3] # コード内容
# FIデータリスト3のコアIPCをリスト化
fi_list01 = fi_data01.values # FIデータリスト3のコアIPCのリスト化
print('FI[0:5]=',fi_list01[0:5])
# FIデータリスト3のコアIPCをリスト化
fi_code01 = fi_data03.values # FIデータリスト3のコードのリスト化
print('FI_code[0:5]=',fi_code01[0:5])
# FIデータリスト3のコアIPC = IPC_code表のコアIPCならば
## FIデータリスト3のコードにIPC_コード表のコードを付加
ficode_list = []
for n1, str1 in enumerate(fi_list01): # FIデータリスト3のコアIPC読み込み
for n2, str2 in enumerate(ipc_list01): # IPC_code表のコアIPC読み込み
if str1== str2:
str3 = fi_code01[n1][1:] # FIデータリスト3のコードを2桁目から読み込み
str4 = ipccode_list01[n2] + str3
ficode_list.append(str4)
break
print('ficode_list[0:5]=',ficode_list[0:5])
# DataFrame化
df1 = pd.DataFrame(data=fi_data01,columns=['コアIPC'])
df2 = pd.DataFrame(data=fi_data02,columns=['特許分類'])
df3 = pd.DataFrame(data=ficode_list,columns=['コード'])
df4 = pd.DataFrame(data=fi_data04,columns=['コード内容'])
# FIデータリストを作成
df20=pd.concat([df1, df2,df3,df4], axis=1)
# CSVとして書き出し
df20.to_csv('./中間data/全FIデータリスト.csv',encoding='utf-8', index=False)
print('全FIデータリスト.csvを書き出しました')
# FIデータリストを作成
df21=pd.concat([df2,df3,df4], axis=1)
# 逆順にソート
df21=df21.sort_values('コード',ascending=False)
# CSVとして書き出し
df21.to_csv('./中間data/FI_code表.csv',encoding='utf-8', index=False)
print('FI_code表.csvを書き出しました')
# スクリブト17 公報データにコードを付与
## IPC_code、FI_code、nofiIPC_codeによりコード化する。
## 付与されたコードが無ければsubclass_codeによりコード化する。
## 付与されたコードが無ければclass_codeによりコード化する。
# csv読み込み
pat_data = pd.read_csv('./中間data/new_patlist.csv', encoding='utf-8')
# IPC01読み込み
ipc_data01 = pat_data.iloc[:,6]
ipc_list01 =[]
for str1 in ipc_data01:
ipc_list01.append(str1)
# FI01読み込み
fi_data01 = pat_data.iloc[:,7]
fi_list01 =[]
for str1 in fi_data01:
fi_list01.append(str1)
# コード初期化
code_list01 =[]
for str1 in ipc_list01:
str1 = ''
code_list01.append(str1)
# csv読み込み
ficode_data01 = pd.read_csv('./中間data/FI_code表.csv', encoding='utf-8')
# FI03読み込み
fi_data03 = ficode_data01.iloc[:,0]
fi_list03 =[]
for str1 in fi_data03:
fi_list03.append(str1)
# code03読み込み
ficode_data03 = ficode_data01.iloc[:,1]
code_list03 =[]
for str1 in ficode_data03:
code_list03.append(str1)
# csv読み込み
ipccode_data01 = pd.read_csv('./中間data/IPC_code表.csv', encoding='utf-8')
# IPC02読み込み
ipc_data02 = ipccode_data01.iloc[:,0]
ipc_list02 =[]
for str1 in ipc_data02:
ipc_list02.append(str1)
# code02読み込み
code_data02 = ipccode_data01.iloc[:,1]
code_list02 =[]
for str1 in code_data02:
code_list02.append(str1)
# csv読み込み
subclass_data01 = pd.read_csv('./中間data/subclass_code表.csv', encoding='utf-8')
# subclass_code読み込み
subclass_data05 = subclass_data01.iloc[:,0]
subclass_list05 =[]
for str1 in subclass_data05:
subclass_list05.append(str1)
# code05読み込み
subclass_data05 = subclass_data01.iloc[:,1]
code_list05 =[]
for str1 in subclass_data05:
code_list05.append(str1)
# csv読み込み
class_data01 = pd.read_csv('./中間data/class_code表.csv', encoding='utf-8')
# class_code読み込み
class_data06 = class_data01.iloc[:,0]
class_list06 =[]
for str1 in class_data06:
class_list06.append(str1)
# code06読み込み
class_data06 = class_data01.iloc[:,1]
code_list06 =[]
for str1 in class_data06:
code_list06.append(str1)
# FI_code表により追記
for n1, str1 in enumerate(fi_list01):
for n2, str2 in enumerate(fi_list03):
if str2 in str1:
str3 = code_list03[n2]
if code_list01[n1] == '':
code_list01[n1] = str3
else:
code_list01[n1] =code_list01[n1] + ';' + str3
# IPC追記
for n1, str1 in enumerate(ipc_list01):
for n2, str2 in enumerate(ipc_list02):
if str2 in str1:
str3 = code_list02[n2]
if code_list01[n1] == '':
code_list01[n1] = str3
else:
if str3 not in code_list01[n1]:
code_list01[n1] = code_list01[n1] + ';' + str3
# subclass_code表により追記
for n1, str1 in enumerate(ipc_list01):
for n2, str2 in enumerate(subclass_list05):
str1 = ';' + str1
str2 = ';' + str2
if str2 in str1:
str3 = code_list05[n2]
if code_list01[n1] == '':
code_list01[n1] = str3
else:
if str3 not in code_list01[n1]:
code_list01[n1] =code_list01[n1] + ';' + str3
# class_code表により追記
for n1, str1 in enumerate(ipc_list01):
for n2, str2 in enumerate(class_list06):
str1 = ';' + str1
str2 = ';' + str2
if str2 in str1:
str3 = code_list06[n2]
if code_list01[n1] == '':
code_list01[n1] = str3
else:
if str3 not in code_list01[n1]:
code_list01[n1] = code_list01[n1] + ';' + str3
print('公報付与コード[0:5]=',code_list01[0:5])
# DataFrame化
# df01 = pd.DataFrame(data=pn_list, columns=['公報番号'])
# df02 = pd.DataFrame(data=an_list, columns=['出願番号'])
# df03 = pd.DataFrame(data=pd_list, columns=['発行日'])
# df04 = pd.DataFrame(data=ti_list, columns=['発明の名称'])
# df05 = pd.DataFrame(data=ap_list, columns=['出願人'])
# df06 = pd.DataFrame(data=name_list, columns=['発明者'])
# df07 = pd.DataFrame(data=ipc_list02, columns=['IPC'])
# df08 = pd.DataFrame(data=fi_list02, columns=['FI'])
# df09 = pd.DataFrame(data=ft_list, columns=['Fターム'])
# df10 = pd.DataFrame(data=abst_list, columns=['要約'])
df11 = pd.DataFrame(data=code_list01, columns=['コード'])
# 結合
df20=pd.concat([df01, df02, df03, df04, df05, df06, df07, df08, df09, df11,df10], axis=1)
# CSVとして書き出し
df20.to_csv('./中間data/new_patlist2.csv',encoding='utf-8', index=False)
print('new_patlist2.csvを書き出しました')
# スクリブト18 コードが無かった公報のIPCの出現頻度を集計
# csvデータ読み込み
pat_data = pd.read_csv('./中間data/new_patlist2.csv', encoding='utf-8')
# IPC読み込み
ipc_data01 = pat_data.iloc[:,6] # IPC
ipc_list01 = []
for str1 in ipc_data01:
ipc_list01.append(str1)
# コード化されなかった公報の公報IPCを読み込み
code_data01 = pat_data.iloc[:,9] # コードリスト
nocode_list = [] # コード無しIPC
for n1, str2 in enumerate(code_data01):
if str(str2) == 'nan':
str3 = ipc_list01[n1]
split_str3 = str3.split(';')
for str4 in split_str3:
nocode_list.append(str4)
# IPC別に集計
ct_ipc = collections.Counter(nocode_list)
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_n_list = sorted(ipc_n_list, key=lambda x:x[1], reverse=True)
# コード無しIPCの集計表作成
nocode_list = []
n_list = []
for n,str1 in enumerate(ipc_n_list):
nocode_list.append(str1[0])
n_list.append(str1[1])
print('コード無しIPC[0:5]=',nocode_list[0:5])
print('出現頻度[0:5]=',n_list[0:5])
# スクリブト19 コードZを追記
# csvデータ読み込み
pat_data = pd.read_csv('./中間data/new_patlist2.csv', encoding='utf-8')
# IPC読み込み
ipc_data01 = pat_data.iloc[:,6] # IPC
ipc_list01 = []
for str1 in ipc_data01:
ipc_list01.append(str1)
print('公報IPC[0:1]=',ipc_list01[0:1])
# コード読み込み
code_data01 = pat_data.iloc[:,9] # コード
code_list01 = []
for str1 in code_data01:
code_list01.append(str1)
print('コード[0:3]=',code_list01[0:3])
sonota_ipc = []
sonota_code = []
for n1, str1 in enumerate(nocode_list):
if n1 <= 4:
sonota_ipc.append(str1)
str2 = 'Z' + '0' + str(n1+1)
sonota_code.append(str2)
if n1 > 4:
sonota_ipc.append('その他')
str3 = 'Z99'
sonota_code.append(str3)
break
print('その他のコード=',sonota_code)
print('その他のIPC=',sonota_ipc)
# コードZ(その他)を追記
for n1, str2 in enumerate(code_list01):
if str(str2) == 'nan':
for n2, str3 in enumerate(sonota_ipc):
if str3 in ipc_list01[n1]:
code_list01[n1] = sonota_code[n2]
if str3 == 'その他':
if str(code_list01[n1]) == 'nan':
code_list01[n1] = sonota_code[n2]
# DataFrame化
# df01 = pd.DataFrame(data=pn_list, columns=['公報番号'])
# df02 = pd.DataFrame(data=an_list, columns=['出願番号'])
# df03 = pd.DataFrame(data=pd_list, columns=['発行日'])
# df04 = pd.DataFrame(data=ti_list, columns=['発明の名称'])
# df05 = pd.DataFrame(data=ap_list, columns=['出願人'])
# df06 = pd.DataFrame(data=name_list, columns=['発明者'])
# df07 = pd.DataFrame(data=ipc_list02, columns=['IPC'])
# df08 = pd.DataFrame(data=fi_list02, columns=['FI'])
# df09 = pd.DataFrame(data=ft_list, columns=['Fターム'])
# df10 = pd.DataFrame(data=abst_list, columns=['要約'])
df11 = pd.DataFrame(data=code_list01, columns=['コード'])
# 結合
df20=pd.concat([df01, df02, df03, df04, df05, df06, df07, df08, df09, df11,df10], axis=1)
# CSVとして書き出し
df20.to_csv('./中間data/new_patlist3.csv',encoding='utf-8', index=False) # コード付き母集合
print('(コード付き母集合)new_patlist3.csvを書き出しました')
# スクリブト20 その他のコード(Z)のコード表を作成
sonota_ipc = []
sonota_code = []
for n1, str1 in enumerate(nocode_list):
if n1 <= 4:
sonota_ipc.append(str1)
str2 = 'Z' + '0' + str(n1+1)
sonota_code.append(str2)
if n1 > 4:
sonota_ipc.append('その他')
str3 = 'Z99'
sonota_code.append(str3)
break
print('その他のコード=',sonota_code)
print('その他のIPC=',sonota_ipc)
# IPC分類表.csv読み込み
pat_data05 = pd.read_csv('allIPC分類表.csv', encoding='utf-8')
# print('IPC数=',len(pat_data05))
# IPC読み込み
ipc_data01 = pat_data05.iloc[:,2]
ipc_list01 =[]
for str3 in ipc_data01:
ipc_list01.append(str(str3))
print('IPC[0:3]=',ipc_list01[0:3])
# 分類内容読み込み
ipc_data2 = pat_data05.iloc[:,4]
ipctxt_list =[]
for str3 in ipc_data2:
ipctxt_list.append(str(str3))
print('IPC内容[0:3]=',ipctxt_list[0:3])
# コード内容を追加
sonota_ipc_list02= []
sonota_code02 =[]
sonota_txt_list02= []
for n1, str1 in enumerate(sonota_ipc):
for n2, str2 in enumerate(ipc_list01):
if str1 == str2:
sonota_ipc_list02.append(str1)
sonota_code02.append(sonota_code[n1])
sonota_txt_list02.append(ipctxt_list[n2])
if str1 == 'その他':
sonota_ipc_list02.append(str1)
sonota_code02.append(sonota_code[n1])
sonota_txt_list02.append('その他')
break
# コードZのコード表作成
# DataFrame化
df1 = pd.DataFrame(data=sonota_ipc_list02,columns=['特許分類'])
df2 = pd.DataFrame(data=sonota_code02,columns=['コード'])
df3 = pd.DataFrame(data=sonota_txt_list02,columns=['コード内容'])
# 集計表にまとめる
df20=pd.concat([df1, df2, df3], axis=1)
# 書き出し
df20.to_csv('./中間data/Z_code表.csv',encoding='utf-8', index=False)
print('Z_code表.csvを書き出しました')
# スクリブト21 全てのコード表を結合
## クラスからIPC全桁までのコード表を結合する。
# csvデータ読み込み
ipc_code01 = pd.read_csv('./中間data/class_code表.csv', encoding='utf-8')
df1 = pd.DataFrame(data=ipc_code01)
ipc_code02 = pd.read_csv('./中間data/subclass_code表.csv', encoding='utf-8')
df2 = pd.DataFrame(data=ipc_code02)
ipc_code03 = pd.read_csv('./中間data/IPC_code表.csv', encoding='utf-8')
df3 = pd.DataFrame(data=ipc_code03)
ipc_code04 = pd.read_csv('./中間data/FI_code表.csv', encoding='utf-8')
df4 = pd.DataFrame(data=ipc_code04)
ipc_code05 = pd.read_csv('./中間data/Z_code表.csv', encoding='utf-8')
df5 = pd.DataFrame(data=ipc_code05)
# データリストを作成
df20=pd.concat([df1,df2,df3,df4,df5], axis=0)
# ソート
df20 = df20.sort_values('コード', ascending=True) # 昇順
# DataFrame化
ipc_data = df20.iloc[:,0]
df1 = pd.DataFrame(data=ipc_data, columns=['特許分類'])
code_data = df20.iloc[:,1]
df2 = pd.DataFrame(data=code_data, columns=['コード'])
txt_data = df20.iloc[:,2]
df3 = pd.DataFrame(data=txt_data, columns=['コード内容'])
# データリストを作成
df20=pd.concat([df1,df2,df3], axis=1)
df20 = df20.dropna(axis=0)
print('IPC_code対照表のコード数=',len(df20))
# CSVとして書き出し
df20.to_csv('./中間data/IPC_code対照表.csv',encoding='utf-8', index=False)
print('IPC_code対照表.csvを書き出しました')
# スクリブト22 トピック分析するコードを抽出
## ここでは、その他とZコードを抽出し、トピック分析している。
# IPC_code対照表.csvデータ読み込み
ipc_code_data = pd.read_csv('./中間data/IPC_code対照表.csv', encoding='utf-8')
print('コード件数=',len(ipc_code_data))
code01_data = ipc_code_data.iloc[:,0] # コード化IPC(G05B13/02・・・)
ipc_list01 =[]
for str1 in code01_data:
ipc_list01.append(str1)
print('コード化IPC[0:1]=',ipc_list01[0:1])
code02_data = ipc_code_data.iloc[:,1] # 階層化コード(A,A01・・・)
code_list01 =[]
for str1 in code02_data:
code_list01.append(str1)
print('階層化コード[0:5]=',code_list01[0:5])
code03_data = ipc_code_data.iloc[:,2] # コード内容(電気式・・・)
txt_list01 =[]
for str1 in code03_data:
txt_list01.append(str1)
print('コード内容[0:1]=',txt_list01[0:1])
# 4桁コードとZコードを抽出
ipc_list02 = []
code_list02 = []
txt_list02 = []
for n1, str1 in enumerate(code_list01):
flg = 0
if len(str1) <= 6:
str2 = txt_list01[n1]
if str2[0:3] == 'その他':
ipc_list02.append(ipc_list01[n1])
code_list02.append(str1)
txt_list02.append(txt_list01[n1])
flg = 1
if flg == 0:
if str1[0:1] == 'Z':
ipc_list02.append(ipc_list01[n1])
code_list02.append(str1)
txt_list02.append(txt_list01[n1])
# DataFrame化
df1 = pd.DataFrame(data=ipc_list02, columns=['特許分類'])
df2 = pd.DataFrame(data=code_list02, columns=['コード'])
df3 = pd.DataFrame(data=txt_list02, columns=['コード内容'])
# 結合
df20=pd.concat([df1,df2,df3], axis=1)
print('データ件数=',len(df20))
# コード表書き出し
df20.to_csv('./中間data/Z他_code表.csv',encoding='utf-8', index=False)
print('Z他_code表.csvを書き出しました')
# スクリブト23 コード別に読み込みトピックKWリストを追加
### 読み込むコードはIPC_code表(その他とZコード)
import MeCab
# m = MeCab.Tagger ("-Ochasen")
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation
from matplotlib import pyplot as plt
from wordcloud import WordCloud
# MeCabの準備
tagger = MeCab.Tagger()
# 書き出すワード数を設定
n_top_words = 20
# 出現頻度が1%以下は低すぎるとして対象外とした(min_df=.001)
min_hindo = 0.01
# 出現頻度が50%以上は高すぎる(特徴の無い語句)として対象外とした(max_df=0.5)
max_hindo = 0.5
# 公報データ読み込み
pat_data = pd.read_csv('./中間data/new_patlist3.csv', encoding='utf-8')
print('公報件数=',len(pat_data))
# 公報番号欄読み込み
patno_data = pat_data.iloc[:,0]
pn_list =[]
for str1 in patno_data:
str0 = str1
pn_list.append(str(str0))
# 発明の名称欄読み込み
title_data = pat_data.iloc[:,3]
ti_list = []
for str1 in title_data:
str1 = str(str1)
ti_list.append(str1)
# コード欄読み込み
code_data = pat_data.iloc[:,9]
code_list = []
for str1 in code_data:
str1 = str(str1)
code_list.append(str1)
# 要約欄読み込み
abst_data = pat_data.iloc[:,10] # 分類コード有りの場合
abst_list = []
for str1 in abst_data:
str1 = str(str1)
if len(str1) > 3:
#データ中の空白を削除
str1 = (str1.replace(" ", "")) # 半角空白を削除
str1 = (str1.replace(" ", "")) # 全角空白を削除
str1 = (str1.replace(",", "")) # 「,」を「、」に置換
abst_list.append(str1)
else:
abst_list.append('要約無し')
# 発明の名称と要約を結合
tiab_list = []
for n, str1 in enumerate(ti_list):
str2 = str1 + ' ' + abst_list[n]
tiab_list.append(str2)
# 分析対象データ読み込み
code_data01 = pd.read_csv('./中間data/Z他_code表.csv', encoding='utf-8')
ipc_data = code_data01.iloc[:,0] # IPC
df1 = pd.DataFrame(ipc_data)
kcode_data = code_data01.iloc[:,1] # コード
df2 = pd.DataFrame(kcode_data)
txt_data = code_data01.iloc[:,2] # コード内容
df3 = pd.DataFrame(txt_data)
# コード化IPC欄読み込み
ipc_list1 = []
for str1 in ipc_data:
str1 = str(str1)
ipc_list1.append(str1)
# コード欄読み込み
kcode_list1 = []
for str1 in kcode_data:
str1 = str(str1)
kcode_list1.append(str1)
alltopic_list = []
# コード別に読み込みトピックKWリストを書き出し
for n1, str1 in enumerate(kcode_list1):
print('コード=',str1)
# 指定コードに対するtiabデータを読み込み
code_tiab_list = []
code_pn_list = []
for n2, str2 in enumerate(code_list):
if str1 in str2: # 公報データのコード中に階層化コードが含まれていれば
code_pn_list.append(pn_list[n2])
code_tiab_list.append(tiab_list[n2])
if len(code_tiab_list) == 0:
print('このコードの対象公報は有りません')
print(' ')
# topic_listをリスト化
topic_list = [' ']
alltopic_list.append(topic_list)
else:
# テキスト読み込み
source_text = str(code_tiab_list)
# 英数字、記号を除去
source_text = re.sub(r"[a-z]", "", source_text) #半角小文字
source_text = re.sub(r"[a-z]", "", source_text) #全角小文字
source_text = re.sub(r"[A-Z]", "", source_text) #半角大文字
source_text = re.sub(r"[A-Z]", "", source_text) #全角大文字
source_text = re.sub(r"[0-9]", "", source_text) # 半角数字
source_text = re.sub(r"[0-9]", "", source_text) # 全角数字
source_text = re.sub(r'[:;/+\.「」]', '', source_text) # 記号
source_text =source_text[:-2] # 右端の削除
# 基礎的除去語句を設定
stop_words0 = ['(57)','【要約】','(修正有)','【課題】','【選択図】','本発明','本願','前記','上記',
'場合','当該','発明','もの','こと','及び', 'および', '用いる', 'なる', 'する', 'れる','られる',
'全て','ため','有する', 'その', 'この', '有す', 'それら', 'ある', 'いる', 'もつ', 'うち', 'できる',
'せる', 'より', '/', '備える', '備えた','()', 'ここ', 'よう', 'なる','含む','手段']
n0 = (len(stop_words0),'件')
# テーマ毎の除去語句を設定
stop_words1 = ['方法','装置','システム','データ','処理']
n1 = (len(stop_words1),'件')
# 設定した不要語句を除去
for str1 in stop_words0:
source_text = (source_text.replace(str1, ''))
for str1 in stop_words1:
source_text = (source_text.replace(str1, ''))
# MeCab.Taggerによりnode化(形態素に分割)
node = tagger.parseToNode(source_text)
# 名詞、形容詞だけを取り出す
word_list = []
while node:
word_type = node.feature.split(',')[0]
if word_type == '名詞': word_list.append(node.surface)
if word_type == '形容詞': word_list.append(node.surface)
# if word_type == '動詞': word_list.append(node.surface)
node = node.next
# リストを文字列に変換
word_chain = ' '.join(word_list)
if len(word_list) > 1:
count = CountVectorizer(min_df=min_hindo, max_df=max_hindo,max_features=5000)
if len(word_list) == 1:
count = CountVectorizer(min_df=0, max_df=1,max_features=5000)
erflg = 0
try:
X = count.fit_transform(word_list)
except ValueError as e:
print(e)
erflg = 1
n_out = 1 # トピック数を指定
# トピック抽出
lda = LatentDirichletAllocation(n_components=n_out,
random_state=100,
learning_method='batch')
X_topics = lda.fit_transform(X)
lda.components_.shape
# 出現した単語を取得
feature_names = count.get_feature_names()
# トピックリスト作成
topic_list = []
for topic_idx, topic in enumerate(lda.components_):
# print("Topic %d:" % (topic_idx + 1))
print(" ".join([feature_names[i]
for i in topic.argsort()\
[:-n_top_words - 1:-1]]))
str1 = "Topic %d," % (topic_idx + 1)
str2 = ",".join([feature_names[i]
for i in topic.argsort()\
[:-n_top_words - 1:-1]])
topic_list.append(str2)
print('トピックKW=',topic_list)
# topic_listをリスト化
alltopic_list.append(topic_list)
# ワードクラウド作成
if erflg == 0:
W = WordCloud(width=500, height=400, background_color='black', colormap='Paired_r',
collocations = False, # 複合語のオプションをオフ
font_path='/System/Library/Fonts/ヒラギノ角ゴシック W4.ttc').generate(word_chain)
# プロット
plt.imshow(W)
plt.axis('off')
plt.show()
# DataFrame化
# df1 = pd.DataFrame(data=ipc_data, columns=['コード化IPC'])
# df2 = pd.DataFrame(data=kcode_data, columns=['階層化コード'])
# df3 = pd.DataFrame(data=txt_data, columns=['コード内容'])
df4 = pd.DataFrame(data=alltopic_list,columns=['トピックKW'])
df20=pd.concat([df1,df2,df3,df4], axis=1)
# CSVとして書き出し
df20.to_csv('./中間data/IPC_code表2.csv',encoding='utf-8', index=False)
print('IPC_code表2.csvを書き出しました')
# スクリブト24 IPC_コード対照表にトピックKWの上位10を追加
# IPC_code対照表.csvデータ読み込み
ipc_code_data = pd.read_csv('./中間data/IPC_code対照表.csv', encoding='utf-8')
print('コード件数=',len(ipc_code_data))
ipc_data01 = ipc_code_data.iloc[:,0] # コード化IPC(ex:G05B13/02・・・)
ipc_list01 =[]
for str1 in ipc_data01:
ipc_list01.append(str1)
print('コード化IPC[0:1]=',ipc_list01[0:1])
code_data01 = ipc_code_data.iloc[:,1] # 階層化コード(ex:A,A01・・・)
code_list01 =[]
for str1 in code_data01:
code_list01.append(str1)
print('コード[0:5]=',code_list01[0:5])
txt_data01 = ipc_code_data.iloc[:,2] # コード内容(ex:電気式・・・)
txt_list01 =[]
for str1 in txt_data01:
txt_list01.append(str1)
print('コード内容[0:1]=',txt_list01[0:1])
# IPC_code対照表.csvデータ読み込み
ipc_code_data = pd.read_csv('./中間data/IPC_code表2.csv', encoding='utf-8')
print('コード件数=',len(ipc_code_data))
ipc_data02 = ipc_code_data.iloc[:,0] # コード化IPC(ex:G05B13/02・・・)
ipc_list02 =[]
for str1 in ipc_data02:
ipc_list02.append(str1)
code_data02 = ipc_code_data.iloc[:,1] # コード(A,A01・・・)
code_list02 =[]
for str1 in code_data02:
code_list02.append(str1)
txt_data02 = ipc_code_data.iloc[:,3] # トピックKW
txt_list02 =[]
for str1 in txt_data02:
txt_list02.append(str1)
print('トピックKW[0:1]=',txt_list02[0:1])
# トピックKWを追加
for n1, str1 in enumerate(code_list01):
flg = 0
for n2, str2 in enumerate(code_list02):
if str1 == str2:
str3 = txt_list02[n2]
str3 = str3.split(',')
str4 = ''
for str5 in str3[0:10]:
if str4 == '':
str4 = str5
else:
str4 = str4 + '+' + str5
txt_list01[n1] = txt_list01[n1] + '+KW=' + str4
# コードZを追加
ipc_list01.append('その他')
code_list01.append('Z')
txt_list01.append('その他')
# DataFrame化
df1 = pd.DataFrame(data=ipc_list01, columns=['特許分類'])
df2 = pd.DataFrame(data=code_list01, columns=['コード'])
df3 = pd.DataFrame(data=txt_list01, columns=['コード内容'])
# 結合
df20=pd.concat([df1,df2,df3], axis=1)
print('データ件数=',len(df20))
# ソート
df20=df20.sort_values('コード')
# コード表書き出し
df20.to_csv('./中間data/コード_コード内容対照表.csv',encoding='utf-8', index=False)
print('コード_コード内容対照表.csvを書き出しました')