知財のあれこれをPythonで何とかする

### 記載不備を何とかする
特許庁の審査官から明細書の記載不備で拒絶されることはよくあることですが、初出の用語に「前記」をつけるといった単純ミスでの拒絶は避けたいものです。今回はそのような前記に係る記述ミスを防止する為のチェックプログラムを紹介したいと思います。

``` program1.py
#part1 初期設定
import re
f = open('meisai.txt', 'r')
meisai = []
ms_base = []
m_text =[]
m_text = f.read()
ms_base = m_text
f.close()

ms_base=ms_base.replace("前記","th")#「前記」を「th」に置き換える
ms_base=ms_base.replace("該","th")
meisai = re.split('th',ms_base)#文章を「th」で分割する
del meisai[0]#最初の要素に前記はないので削除

#part2 文頭から助詞までの文字を切り出す
#文中の助詞を@に変換
joshi =["の","、","は","が","と","を","へ","に","で","や",
        "か","も","や","から","より","まで","との","および","または"]

wrd_gr=[]
for k,ms_part in enumerate(meisai):
    txt = ms_part
    for jowrd in joshi:
        txt=txt.replace(jowrd,"@")
    meisai[k]=txt

# @までの文字を注目語としてwrd_grに保存する
for ms_part in meisai:
    pos=ms_part.find("@")
    if pos>0:
        wrd_gr.append(ms_part[0:pos])
        
wrd_gr=set(wrd_gr)#重複する要素を削除する(set) 
print("注目語リスト：",wrd_gr)

#part3 初出注目語に「前記」があると警告してそれより前の文章を表示する
print("■■■調査結果■■■")
for wrd in wrd_gr:
    x=ms_base.find("th"+wrd)
    if wrd in ms_base[0:x]:
        print(wrd,"good")
    else:
        print(wrd,":::::::::bad")
        x=m_text[0:x+len(wrd)+2].find(wrd)
        print("明細書",m_text[0:x+len(wrd)],"::::::::::")
```



<details><summary>(サンプルデータ)</summary>【特許請求の範囲】
【請求項１】
助詞を規定する助詞規定工程と、
既出の用語を規定する前記既出語規定語を設定する既出語規定語設定工程と、
前記助詞規定工程で規定された該助詞と、前記既出語規定語設定工程で設定された該既出語規定語の間に挟まれた用語を注目語として抽出する抽出工程とを含む文章処理方法であって、
上記文章処理方法はさらに、前記抽出工程で抽出された前記注目語よりも前に位置する文章である特定文章の中に前記注目語が存在しないことを検知すると、警告を発する検知警告工程を有することを特徴とする文書処理方法。
【請求項２】
前記検知警告工程は、前記特定文章を表示する特定文章表示工程を含むことを特徴とする請求項１記載の文書処理方法。
【請求項３】
上記助詞規定工程は、ユーザ操作に基づきユーザの求める助詞を追加する助詞追加工程を含むことを特徴とする請求項１記載の文書処理方法。
</details>

サンプルデータ(program1の処理を請求項風に書いたものになります)をファイル名「meisai.txt」、エンコード「ANSI」で保存しプログラムprogram1を実行しますと、以下のような結果で表示されます。
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831931/a1be3040-8acc-7b27-90c2-61b03ac607d9.png)

「注目語リスト」には文書全体から「前記」「該」の付いた用語を取り出してきております。具体的には、「前記」と助詞（『の』『は』等）や句読点で挟まれた文字を切り取って登録したものです。
上の実行結果では、サンプルデータ中、初出の「既出語規定語」に誤って「前記」がついているので、「既出語規定語」はbadと表示されました。
badとされた用語については、それより前の文章が合わせて表示されます。

修正を行って再度program1を実行します。今度は全てgood表示となりbad表示の用語は無くなりました。
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831931/22347d44-76fd-b896-5a47-dacbda389395.png)

### プログラムのポイント
(part1)
「前記」がついた用語を抽出するためまず、「前記」の類語は一律「th」に置換してから、文章自体を前記がある位置で分割(split)し、リストmeisai[ ]に代入します。
``` 1.py
ms_base=ms_base.replace("前記","th")#「前記」を「th」に置き換える
ms_base=ms_base.replace("該","th")
meisai = re.split('th',ms_base)#文章を「th」で分割する
del meisai[0]#最初の要素に前記はないので削除
``` 
(part2)
「前記」がついた用語の末尾を判断するため助詞がついた部分を末尾として文字列を切り取ります。要はリストmeisai[ ]の中で「前記(th)」と助詞に挟まれた間の文字列を「注目語」として取り出しリストwrd_grに記録します。そのため助詞(リストjoshi）の文字列は一律@に置換（replace(jowrd,"@")の部分）して、「前記(th)」で分割した文章（ms_part）に対し先頭（「前記(th)」があった位置）から@の位置まで切り出して（ms_part[0:pos]）リストwrd_grに追加（append）します。
``` 2.py
#文中の助詞を@に変換
joshi =["の","、","は","が","と","を","へ","に","で","や",
        "か","も","や","から","より","まで","との","および","または"]

wrd_gr=[]
for k,ms_part in enumerate(meisai):
    txt = ms_part
    for jowrd in joshi:
        txt=txt.replace(jowrd,"@")
    meisai[k]=txt

# @までの文字を注目語としてwrd_grに保存する
for ms_part in meisai:
    pos=ms_part.find("@")
    if pos>0:
        wrd_gr.append(ms_part[0:pos])
        
wrd_gr=set(wrd_gr)#重複する要素を削除する(set) 
print("注目語リスト：",wrd_gr)
```
(part3)
切り出した注目語より前の文章に注目語が無ければ「前記がついているのに初出である」と判断して、注目語より前の文章（m_text[0:x+len(wrd)]）を表示しています。
``` 3.py
print("■■■調査結果■■■")
for wrd in wrd_gr:
    x=ms_base.find("th"+wrd)
    if wrd in ms_base[0:x]:
        print(wrd,"good")
    else:
        print(wrd,":::::::::bad")
        x=m_text[0:x+len(wrd)+2].find(wrd)
        print("明細書",m_text[0:x+len(wrd)],"::::::::::")
```
### 注意点１
「前記」からリストjoshi[ ]に含まれる助詞の間の文字列を切り出しているので、リストjoshi[ ]にない文字で切り出すことはできません。この場合、明細書に応じてjoshi[ ]に追加する必要があります。
また、例えば「前記第1『の』○○手段」といった注目語の間に助詞を含むような表現をしていると注目語として「第1」を切り出してしまいうまく動作しません。回避方法としては注目語の末尾を示す符号を手動で設定して(例えば「前記第1の○○手段」の末尾に■を手動で挿入して「前記第1の○○手段■」にする）プログラム中のjoshiの「の」の代わりに「■」を設定する等すれば可能です（手軽ではなくなりますが）。

### 注意点２
今回のプログラムは単純に注目後の前に「前記」がついていない文字列があることを判定しているだけで、クレームの従属関係を考慮していません。なので、例えば請求項1,2,3があって請求項3は請求項2だけに従属しているような場合でも、請求項1に注目語があればgood判定してしまいます。
回避方法としては従属先でない請求項は予めmeisai.txtからは除去しておけば可能です（これも手軽にとは言えなくなりますが）。

### 最後に
短いプログラムですが以上の点に注意していただければ便利に利用していただけるのではないかと考えております。今回の記事がお役に立てれば幸いです。