Pythonのpandasを使って国際特許分類(IPC)の活用方法を検討している。前回は、特許庁のwebサイトからダウンロードしたHセクションをExcelファイルを解析して、各行の階層の分類を行った。今回は、その分類を元に、IPCの記号を入れたら作成したDataFrameから対象のIPCを見つけて、それを戻り値として返す関数を作ってみることにする。
「記号」列の整形
「記号」行を確認すると、記号中のサブクラスとメイングループの間のスペースの数が2つだったり、3つだったり、一定になっていないことが分かった。検索する上では、スペースの数に影響されないようにした方が正しくマッチできる可能性があがる。そこで、「記号」列のスペースを一つだけに統一するように整形する。
df['記号']
0 H 1 H01 2 H01B 3 H01B 1/00 4 H01B 1/02 ... 10021 H05K 13/06 10022 H05K 13/08 10023 H99 10024 H99Z 10025 H99Z 99/00 Name: 記号, Length: 10026, dtype: object
整形では各行の記号列にlambdaで定義した関数をapplyさせて変換した。スペースをsplitコマンドで分割したのち、” “.joinで結合することにより、複数のスペースがある場合もスペース1つに変換できる。
df['記号'] = df['記号'].apply(lambda x : " ".join(x.split()))
df['記号']
0 H 1 H01 2 H01B 3 H01B 1/00 4 H01B 1/02 ... 10021 H05K 13/06 10022 H05K 13/08 10023 H99 10024 H99Z 10025 H99Z 99/00 Name: 記号, Length: 10026, dtype: object
上の二つのdf[‘記号’]の実行結果から、記号の中のスペースの数が変わっているのが分かります。
記号からIPCの分類を出力する関数
まず、入力された記号がIPCのルールに合致しているか確認する関数「check_IPC」を作ります。
IPCのルールから、先頭文字はセクションを表すA~Hの文字、2文字目と3文字目は数字、4文字目はA~Zの文字、次にスペースが1つ以上入って、数字が1つ以上入って、スラッシュの後に、また、数字が1つ以上入ります。戻り値は、上記の記号のルールに合致していたら、True、異なっていたら、Falseを返します。
下のコード[13]には、下にcheck_IPCの関数を使ったテストコードを実行しています。
import re
def check_IPC(IPC_code):
if re.match('[A-H][0-9][0-9][A-Z]\s+[0-9]+/[0-9]+',IPC_code):
return True
else:
return False
for IPC_code in ['B', '', '<注>','B12G 12/23', 'd12', 'H12G', 'E11A 10/00','E112A 10/00']:
print(check_IPC(IPC_code))
False False False True False False True False
IPCの記号のルールに合致しているのは4つ目の’B12G 12/23’と7つ目の’E11A 10/00’の二つで、それ以外はFalseを返します。
引き続いて、IPCの記号を入力すると、それに対応する説明をリストとして出力する関数IPC_showを定義します。その関数は以下のような設計です。
- check_IPCにより、記号がIPCのルールに沿っているかを確認し、もし、記載方法がルールと一致しない場合は、エラーメッセージを戻り値に返します。
- セクション、クラス、サブクラス、メイングループ、サブグループに相当する説明をDataFrameから取得し、リストに収納し、戻り値に返します。その際、一致する値がなかった階層のパラメータは、空白値を返します。
- セクション:1文字目を確認
- クラス:1文字目から3文字目を確認
- サブクラス:1文字目から4文字目を確認
- メイングループ:スラッシュの左側に”/00″をつけたものを確認
- サブグループ:記号すべてを確認
- 各階層の説明を1次元のリストとして取得するために、取得した結果の1つ目の説明をvalues[0]で文字列として取得し、リストに追加します。
def show_IPC(IPC_code):
if check_IPC(IPC_code) == False:
return ['IPCコードが間違っています']
IPC_code = " ".join(IPC_code.split())
IPC = []
result = []
# level = 1 : セクション(アルファベット1文字)
result.append(df[df['記号']==IPC_code[0:1]]['タイトル'])
# level = 2 : クラス(アルファベット1文字+数字2桁
result.append(df[df['記号']==IPC_code[0:3]]['タイトル'])
# level = 3 : サブクラス(アルファベット1文字+数字1~2桁+アルファベット1文字)
result.append(df[df['記号']==IPC_code[0:4]]['タイトル'])
# level = 4 : メイングループ(アルファベット1文字+数字2桁+アルファベット1文字+スペース+数字1~2桁+スラッシュ+00)
result.append(df[df['記号']==(IPC_code.split('/')[0]+'/00')]['タイトル'])
# level = 5 : サブグループ(アルファベット1文字+数字2桁+アルファベット1文字+スペース+数字1~2桁+スラッシュ+00以外の数字)
result.append(df[df['記号']==IPC_code]['タイトル'])
for i in range(0,5):
if len(result[i]):
IPC.append(result[i].values[0])
else:
IPC.append("")
return IPC
関数の確認
それでは、ちゃんと関数ができているか、確認してみます。
1番目の例では、マッチする階層までの説明を出力し、マッチしないH01Z以下の階層は””を出力します。
2番目の例では、正しいIPC記号を入れたので、セクションからサブグループまでの情報を出力します。
3番目の例では、IPCのルールに合っていない記号を入れたので、エラーを出力します。
# マッチしないIPC記号
IPC1 = show_IPC('H01Z 10/052')
print(IPC1)
# マッチするIPC記号
IPC2 = show_IPC('H01M 10/052')
print(IPC2)
# IPC記号のフォーマットに合わない記号
IPC3 = show_IPC('Z01M 10/052')
print(IPC3)
['電気', '基本的電気素子', '', '', ''] ['電気', '基本的電気素子', '化学的エネルギーを電気的エネルギーに直接変換するための方法または手段,例.電池[2]', '二次電池;その製造[2]', 'リチウム二次電池[2010.01]'] ['IPCコードが間違っています']
今回は、まだ、Hセクションだけのデータですが、入力されたIPC記号から、説明を返す関数ができました。次回は、Hセクション以外のIPCについても対応できるようにします。
コメント