特許情報取得APIで取得した拒絶理由通知書の内容をDeepL APIで外国語に翻訳する例(easy_patents 応用例3)

# 概要
　特許情報取得APIで取得した拒絶理由通知書をDeepL APIで外国語に翻訳する例として、最新の拒絶理由通知書（特許）の「理由」が記載されている部分を抽出して、英語に翻訳するサンプルコードを紹介する。
　外内案件（外国のクライアントが日本で出願している場合）において、国内代理人は外国のクライアントから拒絶理由通知書の機械翻訳（英語や中国語など）を求められるようなことが多いと思うが、今回のサンプルコードを応用することで、機械翻訳を提供する際の作業の手間を若干減らすことが期待できる。

# サンプルコードの前提
 easy_patentsをインストールしていること
 特許情報取得APIの利用者登録をしていること
 DeepLのAPIの利用登録をし、アクセスキーを取得していること

# サンプルコードの解説
## 特許情報の取得
特許情報の取得はeasy_patentsで行う。今回は、経過情報と拒絶理由通知書のファイルを取得するため、app_progressとapp_doc_cont_refusal_reason_decisionを使用する。
```py
from easy_patents.get_info import app_progress
from easy_patents.get_info import app_doc_cont_refusal_reason_decision

# 特許庁APIを通じて、経過情報と拒絶理由通知書ファイルをダウンロード
progress_info = app_progress(app_number)
target_dir_path = app_doc_cont_refusal_reason_decision(app_number)
```

## 経過情報からの最新の拒絶理由通知書の情報の抽出
app_progressで取得したprogress_infoから、最新の拒絶理由にかかるdocumentNumberを取得する。
```py
# 経過情報から、拒絶理由通知書にかかる情報を抽出
biblio_info = progress_info['result']['data']['bibliographyInformation']
doc_info_list = [doc_info for biblio in biblio_info for doc_info in biblio["documentList"]]
kyozetsu_doc_info_list = [doc_info for doc_info in doc_info_list if doc_info['documentDescription'] == "拒絶理由通知書"]

# legalDateでソートして、最新の拒絶理由通知書のdocumentNumberを取得
kyozetsu_doc_info_list.sort(key=lambda x:x['legalDate'])
latest_kyozetsu = kyozetsu_doc_info_list[-1]
latest_kyozetsu_docnumber = latest_kyozetsu["documentNumber"]
```

## 最新の拒絶理由通知書の読み込み
取得したdocumentNumberをもとに、app_doc_cont_refusal_reason_decisionで取得したデータのうち、処理対象の拒絶理由通知書のXMLデータを読み込む。
```py
import os

# documentNumberをもとに、対象の拒絶理由通知書のxmlデータを読み込む。
target_file_name = "%s-jpntce.xml" % latest_kyozetsu_docnumber
target_file_path = os.path.join(target_dir_path, target_file_name)
with open(target_file_path, "r", encoding="shift_jis") as f:
    target_xml_data = f.read()
```

## XMLツリーからの「理由」部分の抽出
'jp:notice-of-rejection-a131'タグの中に含まれる'jp:drafting-body'タグの部分を抽出する。
なお、拒絶理由通知書は文章の途中など謎なところで改行が入るが、そのまま翻訳すると意味が異なってしまうおそれがあるので、できる限りで整形をしている。
なお、この整形はひとまず対象の案件で動作を確認した程度であり、一般的に利用できるかは確認していないが、変換後の用語（半角スペースではなく特定の記号にするなど）を工夫することでおそらく一般的に利用できると思われる。
また、'jp:notice-of-rejection-a131'などのタグが一般的なタグなのかも確認していない。

```py
import xml.etree.ElementTree as ET

# 読み込んだ拒絶理由通知書のデータから理由が書かれている部分を抽出
root = ET.fromstring(target_xml_data)
ns = {'jp': 'http://www.jpo.go.jp'}
sub1 = root.find('jp:notice-of-rejection-a131', ns)
reason_part = sub1.find('jp:drafting-body', ns)
reason_text = ''.join([text for part in reason_part for text in part.itertext()])
reason_text = reason_text.replace("\n\n", " ")
reason_text = reason_text.replace("\n", "")
reason_text = reason_text.replace("　　", "\n")
reason_text = reason_text.replace(" ", "\n")
while "\n\n" in reason_text:
    reason_text = reason_text.replace("\n\n", "\n")
```

## 抽出された文章の英訳
DeepLの利用にあたり、sample_translate.pyとファイルに以下のような関数を用意した。
翻訳対象のtextと、アクセスキー(auth_key)と、翻訳先の言語を示す文字列(日本語ならJA, 英語ならENなど）を指定することで、翻訳後のテキストを返答する関数である。
```sample_translate.py
import requests


def get_translation(text, auth_key, target_lang="JA"):
    url = "https://api-free.deepl.com/v2/translate"
    header = {
        "Host": "api-free.deepl.com",
        "Content-Type": "application/x-www-form-urlencoded"
    }
    data = {
        "auth_key": auth_key,
        "text": text,
        "target_lang": target_lang,
    }
    response = requests.post(url=url, data=data, headers=header)
    json_data = response.json()
    return json_data["translations"][0]["text"]
```

上記関数を用いて、拒絶理由通知書から抽出した部分を翻訳する。
```py
# 抽出した部分をDeepLのAPIで翻訳した後のテキストを取得する。
translated_text = get_translation(reason_text, auth_key=deepl_auth_key, target_lang="En")
```

# サンプルコード全体像
上述した要素の一部並べ替えなどを行い、一部を関数化したものが次のコードである。
```py
import os
import xml.etree.ElementTree as ET
from sample_translate import get_translation
from easy_patents.get_info import app_doc_cont_refusal_reason_decision
from easy_patents.get_info import app_progress


def translate_latest_refusal_reason(app_number, deepl_auth_key, target_lang="En"):
    # 特許庁APIを通じて、経過情報と拒絶理由通知書ファイルをダウンロード
    progress_info = app_progress(app_number)
    target_dir_path = app_doc_cont_refusal_reason_decision(app_number)

    # 経過情報から、拒絶理由通知書にかかる情報を抽出
    biblio_info = progress_info['result']['data']['bibliographyInformation']
    doc_info_list = [doc_info for biblio in biblio_info for doc_info in biblio["documentList"]]
    kyozetsu_doc_info_list = [doc_info for doc_info in doc_info_list if doc_info['documentDescription'] == "拒絶理由通知書"]

    # legalDateでソートして、最新の拒絶理由通知書のdocumentNumberを取得
    kyozetsu_doc_info_list.sort(key=lambda x:x['legalDate'])
    latest_kyozetsu = kyozetsu_doc_info_list[-1]
    latest_kyozetsu_docnumber = latest_kyozetsu["documentNumber"]

    # documentNumberをもとに、対象の拒絶理由通知書のxmlデータを読み込む。
    target_file_name = "%s-jpntce.xml" % latest_kyozetsu_docnumber
    target_file_path = os.path.join(target_dir_path, target_file_name)
    with open(target_file_path, "r", encoding="shift_jis") as f:
        target_xml_data = f.read()
    
    # 読み込んだ拒絶理由通知書のデータから理由が書かれている部分を抽出
    root = ET.fromstring(target_xml_data)
　　ns = {'jp': 'http://www.jpo.go.jp'}
    sub1 = root.find('jp:notice-of-rejection-a131', ns)
    reason_part = sub1.find('jp:drafting-body', ns)
    reason_text = ''.join([text for part in reason_part for text in part.itertext()])
    reason_text = reason_text.replace("\n\n", " ")
    reason_text = reason_text.replace("\n", "")
    reason_text = reason_text.replace("　　", "\n")
    reason_text = reason_text.replace(" ", "\n")
    while "\n\n" in reason_text:
        reason_text = reason_text.replace("\n\n", "\n")

    # 抽出した部分をDeepLのAPIで翻訳し、翻訳前と翻訳後のテキストを返す
    translated_text = get_translation(reason_text, auth_key=deepl_auth_key, target_lang=target_lang)
    return reason_text, translated_text


if __name__ == "__main__":
    auth_key = "******" #DeepLで取得したアクセスキー
    texts = translate_latest_refusal_reason("2007035937", deepl_auth_key=auth_key, target_lang="En")
    # 翻訳前のテキスト
    print(texts[0])
    # 翻訳後のテキスト
    print(texts[1])
```

# 処理結果
特願2007-035937を対象として処理を行った。

## 拒絶理由通知書から抽出した和文
```
Ａ．この出願の下記の請求項に係る発明は、その出願前に日本国内又は外国において、頒布された下記の刊行物に記載された発明又は電気通信回線を通じて公衆に利用可能となった発明に基いて、その出願前に その発明の属する技術の分野における通常の知識を有する者が容易に発明をすることができたものであるから、特許法第２９条第２項の規定により特許を受けることができない。
　記
　（引用文献等については引用文献等一覧参照）［請求項１－１８について］　下記引用文献１によれば、名詞句を形成する複数の名詞に対して、連結表記テーブルに基づいて二つの名詞の間に「の」（本願発 明でいう「連結機能語」）を挿入するか否かを決定する構成が開示されている。　この開示における連結表記テーブルでは、漢語，カタカナ語，和語などの名詞の種類別に、「の」を挿入することの適否をテー ブル化しているが、漢語，カタカナ語，和語などは、それに属する単語を表すものであるから、該連結表記テーブルは、本願発明でいうところの「２単語の間に所定の連結機能語を挿入することの適否に関する 情報」を保持しているといえる。また、本願実施例にあるように、「野球」、「試合」などの具体的な単語単位に「２単語の間に所定の連結機能語を挿入することの適否に関する情報」を保持するものについて も、用例データベースに基づく翻訳が、下記引用文献２－４に見られるように本願出願前周知であることからみて、引用文献１の開示において、連結表記テーブルの代わりに用例データベースを用いて、具体的 な単語単位の用例情報を保持することにより、当業者が容易に想到しえたものと認められる。
　また、請求項５，８，１３，１８に関し、入力テキストから用例を抽出して自動登録することは、例えば下記引用文献２に開示されている。
　よって、各請求項に係る発明は、上記引用文献１および引用文献２－４に見られる周知技術に基づいて、当業者が容易に想到しえたものと認められる。
Ｂ．この出願は、特許請求の範囲の記載が下記の点で、特許法第３６条第６項第２号に規定する要件を満たしていない。
　記［請求項１，２，９，１０，１４，１５について］（１）請求項において、「前記２単語の間に所定の連結機能語を含む用例である正用例の情報に基づいて判定された、前記２単語の間に前記所定の連結機 能語を挿入することの適否に関する情報」との記載があるが、実際に用例データベースに格納される、本願【図５】に見られるような情報を見ても、それが。「２単語の間に所定の連結機能語を含む用例である 正用例の情報に基づいて判定された」ものであるのか否かがどのように識別できるのか不明である。したがって、「前記２単語の間に所定の連結機能語を含む用例である正用例の情報に基づいて判定された」と の限定にいかなる技術的意味があるのか不明である。
［請求項４，１２，１７について］（２）「前記所定の連結機能語を含まない用例である負用例の情報とに基づいて適否を判定した情報である」という限定についても、上記（１）と同様にいかなる技術的意味 があるのか不明である。
［請求項５，１３，１８について］（３）「入力された目的言語の文章データを基に、前記用例データベースに記録する用例データを自動的に編集し登録する」との記載は、機能的、あるいは概念的であり、そ のような機能を実現する具体的構成が明確でない。
［請求項８について］（４）「前記正用例抽出手段によって抽出された正用例の情報に基づいて判定された、前記２単語の間に所定の連結機能語を挿入することの適否に関する情報」との記載があるが、正用例 抽出手段によって抽出された正用例の情報に基づく判定を、いずれの構成が行うのか明確でない。
　よって、請求項１，２，４，５，９，１０，１２－１５，１７，１８（および、これらを引用する全ての請求項）に係る発明は明確でない。
　引　用　文　献　等　一　覧１.特開昭６２－２６７８７１号公報２.特開平０９－３３０３２０号公報３.特開平０３－２７６３６７号公報４.特開平０９－３０５６０９号公報－－－－－－－－－－－－－－ －－－－－－－－－－－－－－－－－－－－－－
　先行技術文献調査結果の記録
・調査した分野
Ｇ０６Ｆ１７／２７－１７／２８　
　この先行技術文献調査結果の記録は拒絶理由を構成するものではありません。
```

上記のDeepL翻訳後の英文
```
A. The invention claimed in the following claims of this application is based on an invention described in the following publications distributed in Japan or in a foreign country before the filing of the application or an invention made available to the public through telecommunication lines, and could have been easily invented by a person having ordinary knowledge in the art to which the invention pertains before the filing of the application. Therefore, the patent is not granted under Article 29(2) of the Patent Law.
　The patentee is not entitled to a patent under Article 29, Paragraph 2 of the Patent Law.
　（According to Reference 1 below, a configuration for determining whether or not to insert a "no" (a "linking function word" in the context of this invention) between two nouns based on a linking notation table is disclosed for a plurality of nouns that form a noun phrase. The disclosure includes a configuration for determining whether or not to insert a "no" (a "linking function word" in the present invention) between two nouns based on a linking table.　In this disclosure, the concatenation notation table shows the appropriateness of inserting "no" for each type of noun, such as Chinese, katakana, and Japanese words. Therefore, it can be said that the concatenation table holds "information on the appropriateness of inserting a given concatenated function word between two words" as referred to in the present application. As shown in the examples in this application, the table also holds "information on the appropriateness of inserting a given linking function word between two words" for each specific word such as "baseball" and "game," and it can be said that the translation based on the usage database is well known before the filing of this application as shown in the cited documents 2-4 below. In view of the fact that translation based on a usage database is well known before the filing of this application, as shown in the following cited documents 2-4, it is recognized that a person skilled in the art could have easily arrived at the idea by using a usage database instead of a concatenation notation table to maintain usage information for specific word units in the disclosure in the cited document 1.
　With regard to claims 5, 8, 13, and 18, extracting examples from input text and automatically registering them is disclosed, for example, in the following Cited Document 2.
　Therefore, it is admitted that the invention in each claim could have been easily conceived by a person skilled in the art based on the well-known technology found in the above cited reference 1 and the above cited references 2-4.
B. This application does not meet the requirements stipulated in Article 36, Paragraph 6, Item 2 of the Patent Law in that the claims are written in the following manner
　(1) In the claims, there is a statement "information regarding the suitability of inserting the prescribed linking function word between the two words as determined based on the information of the correct examples which are examples containing the prescribed linking function word between the two words," but the application does not provide information regarding the suitability of inserting the prescribed linking function word between the two words as actually stored in the usage example database. information as seen in this application [Figure 5], which is stored in the database, it is. However, it is unclear how it is possible to identify whether or not the information is "determined based on the information of a positive example, which is an example that includes a predetermined linking function word between two words". Therefore, it is unclear what the technical meaning of the limitation "determined based on information on a positive example, which is an example that includes a predetermined linking function word between the two words" is.
(2) Similarly to (1) above, it is unclear what the technical meaning is of the limitation that "the information is judged to be appropriate based on the information of negative examples, which are examples that do not include the predetermined linking function words.
(3) The description "automatically edits and registers the example data to be recorded in the example database based on the input text data of the target language" is functional or conceptual, and the specific configuration to realize such a function is not clear.
(4) The statement "information regarding the appropriateness of inserting a predetermined connecting function word between the two words as determined based on the information of the positive examples extracted by said positive example extracting means" is not clear as to which configuration performs the determination based on the information of the positive examples extracted by the positive example extracting means. However, it is not clear which configuration performs the judgment based on the information of positive examples extracted by the positive example extracting method.
　Therefore, the invention claimed in claims 1, 2, 4, 5, 9, 10, 12-15, 17, and 18 (and all the claims that cite them) is not clear.
　List of References 1. Patent Publication No. 62-267871 2. Patent Publication No. 09-330320 3. Patent Publication No. 03-276367 4. Patent Publication No. 09-305609 ---------- -- ------------------------
　Record of prior art literature survey results
Field of study
G06F17/27-17/28
　This record of the results of the prior art literature search does not constitute a reason for refusal.
```

# 応用についての示唆
　上記のサンプルコードで取得しているのは拒絶理由通知書のみであるが、補正却下の決定、拒絶査定、意見書、補正書もおそらく同様に処理できる。
　引用文献一覧などの特定の用語をキーに改行等で整形することで、より見やすくなると思われる。
　以前のeasy_patentsの応用例で紹介した、新規の拒絶理由かどうかの判断手法を使うことで、対象をより適切に抽出することができる。
　また、Wordを操作できるpython-docxを用いて上記和文と上記英文をWordに挿入して拒絶理由通知書の報告書を自動作成する機能や、作成したWordをメールやSlackなどで添付して外国クライアントに送る機能を実装することで、国内代理人側ではほとんど作業することなく拒絶理由通知の報告ができるようになる可能性もある。