複合テーマの分析

 複数のサブテーマの公報データを結合してテーマ全体の公報データを作成し、このテーマ全体の公報データに対して以下の処理を行い、特許出願動向調査のレポートを作成する。

コード化(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


その他は、単一テーマのコード化と大差ないので省略する。