マルチマルチクレームを何とかする
今回はマルチマルチクレームをチェックするプログラムを作ってみました。
#part1 請求項と従属先のセットを作成
import re
import unicodedata
import copy
meisai = []
ms_base = []
f = open('meisai.txt', 'r')#ANSIで保存すること
ms_base = f.read()
f.close()
ms_base=unicodedata.normalize("NFKC", ms_base)#請求項数の数値を半角にする
meisai = re.split("【",ms_base)#請求項ごとに分割する
meisai.pop(0)
clm_gr_base=[]
clm_item=[]
for ms_part in meisai:
clm_item.append(re.findall(r'請求項(\d+)', ms_part))
clm_gr_base = [[int(x) for x in sublist] for sublist in clm_item]
result_list=[]
for elm in clm_gr_base:
if len(elm)==1:#末尾に0をたす
elm.append(0)
result_list.append(elm)
elif len(elm)==2:
result_list.append(elm)
elif len(elm)>2:#最初の要素と2番目以降の要素がセットになったリストに変換する
first_element = elm[0]
result_list.extend([[first_element, x] for x in elm[1:]])
clm_gr = sorted(result_list)
#part2 マルチクレーム判定
from itertools import groupby
#clm_grの[]を、先頭の要素でグループ化する
clm_gr.sort(key=lambda x: x[0])
grouped_clm_gr = [list(group) for key, group in groupby(clm_gr, key=lambda x: x[0])]
print("grouped_clm_gr",grouped_clm_gr)
# grouped_clm_grの[]を先頭の要素でカウントする
counted_data = [[sublist[0][0], len(sublist)] for sublist in grouped_clm_gr]
print("counted_data",counted_data)
#part3 マルチマルチ判定
with open('multi_multi.txt', 'w') as f:#ツリーの書込み先ファイルをクリアする
print("", file=f)
flag=0
mu_mu=[]
for elm in counted_data:
if elm[1]>1:
for clm in clm_gr:
if clm[0]==elm[0]:
for elm2 in counted_data:
if elm2[0]==clm[1] and elm2[1]>1:
mu_mu.append(elm2[0])
if len(mu_mu)>0:
flag=1
with open('multi_multi.txt', 'a') as f:
print("請求項",elm[0],"は、マルチクレーム",mu_mu,"に従属するマルチマルチクレームです!", file=f)
mu_mu=[]
if flag==0:
with open('multi_multi.txt', 'w') as f:
print("マルチマルチクレームはありませんでした。", file=f)
以下のサンプルをファイル名「meisai.txt」としてANSI形式で保存します。
サンプルデータ
【請求項1】
○○手段を有する情報処理装置。
【請求項2】
前記情報処理装置であって××手段を有する請求項1記載の情報処理装置。
【請求項3】
前記情報処理装置であって△△手段を有する請求項2記載の情報処理装置。
【請求項4】
前記情報処理装置であって◇◇手段を有する請求項2および請求項3記載の情報処理装置。
【請求項5】
前記情報処理装置であって□□手段を有する請求項2および請求項3および請求項4記載の情報処理装置。
請求項 5 は、マルチクレーム [4] に従属するマルチマルチクレームです!
プログラムのポイント
-
(part1)
ここでのポイントは「【請求項4】・・有する請求項2および請求項3・・」となっているのを取り込んで[4, 2, 3]としてリスト化したものを[4, 2], [4, 3]に変換する部分です。以前投稿したプログラム(クレームツリーを何とかする(その1))と同じプログラムを流用しています。 -
(part2)
請求項ごとに従属先をカウントしてリストにします。
#clm_grの[]を、先頭の要素でグループ化する
clm_gr.sort(key=lambda x: x[0])
grouped_clm_gr = [list(group) for key, group in groupby(clm_gr, key=lambda x: x[0])]
print("grouped_clm_gr",grouped_clm_gr)
上記処理によりgrouped_clm_grが以下のように作成されます。請求項1だけに従属する請求項2だと[[2, 1]]、請求項2と請求項3に従属する請求項4だと [[4, 2], [4, 3]]として1つ深い階層にグループ化されます。
[[[1, 0]], [[2, 1]], [[3, 2]], [[4, 2], [4, 3]], [[5, 2], [5, 3], [5, 4]]]
# grouped_clm_grの[]を先頭の要素でカウントする
counted_data = [[sublist[0][0], len(sublist)] for sublist in grouped_clm_gr]
print("counted_data",counted_data)
次に上記の処理によりcounted_dataが以下のように作成されます。請求項1だけに従属する請求項2だと従属先が1つなので[2, 1]、請求項2と3に従属する請求項4だと従属先が2つなので[4,2]請求項2と3と4に従属する請求項5だと従属先が3つなので[5,3] となります。
[[1, 1], [2, 1], [3, 1], [4, 2], [5, 3]]
- (part3)
マルチクレームの従属先がマルチクレームかどうかを判定し、マルチマルチクレームと判定したらmulti_multi.txtに追記します。
for elm in counted_data:
if elm[1]>1:
for clm in clm_gr:
if clm[0]==elm[0]:
for elm2 in counted_data:
if elm2[0]==clm[1] and elm2[1]>1:
mu_mu.append(elm2[0])
counted_dataでループ処理しelm[1](従属先の数)が1より大きい(マルチクレーム)で(if elm[1]>1:)、clm_grでループ処理してclm[0]がelm[0]であれば、再度counted_dataでループ処理しelm2[0]==clm[1] かつ elm2[1]>1であればリストmu_muにelm2[0]を追加します。
例えば請求項5だとelm[]は[5,3],elm[1]は3なのでelm[1]>1となりclm_grでループ処理してclm[0]=5、elm[0]=5の時に再度counted_dataでループ処理しelm2[]=[4,2]、clm[]=[5,4]の時elm2[0]=4、clm[1]=4となりelm2[0]==clm[1]となりかつelm2[1]が1より大きい(マルチクレーム)のためelm2[0]の値4をリストmu_muに追加します。
その後はmulti_multi.txtにelm[0]の値5(=マルチマルチクレーム)、mu_muの値4(=マルチクレーム)を書き込みます。
注意点1
請求項の記載が「請求項nまたはm」や「請求項nないしm」といった記載ではうまく動作しませんので、以前投稿したmeisai.txtを書き換えるプログラム(クレームツリーを何とかする(その2))を利用ください。
注意点2
以下の処理で【請求項】の「【」を手掛かりにリストの分割をしているので、想定しない場所に「【」が存在すると動作がおかしくなる可能性があります。
meisai = re.split("【",ms_base)#請求項ごとに分割する
【】は必ず【請求項】の書式として使用されるようお願いします。
最後に
少し前に日本の特許庁もマルチマルチクレームが禁止になりましたので、マルチマルチクレームで出願すると記載不備となります。目視でチェックするのは大変なので、自動化できれば効率化のメリットが大きいと思います。
今回の記事がお役に立てれば幸いです。