今回の活用例では、「PDF Tool API」と「言語処理用の深層学習モデル」を組み合わせることで、AIがコンテキストを判断しながらPDFを自動処理する例をご紹介します。
具体的には、「PDF Tool APIで抽出した文字列から固有表現抽出モデルBERT(※1)を用いて個人名(名前)を判別し、PDFに含まれる名前を見つけ、墨消しする」処理を行います。
これにより、従来の文字列完全一致では難しかった、文脈に応じた柔軟な情報秘匿が可能になります。
また本ケースでは誤検出に備え、中間ファイルとしてjsonファイルを挟んでいます。jsonファイルを修正することで、誤検出した名前の手作業で修正も可能にしています。詳しくは後述の『処理の流れとシステム構成』をご参照ください。
本サンプルは、PDF Tool APIによる抽出・加工処理と深層学習モデルによる文字列解析を組み合わせて実行します。処理のステップと使用するモデル・ライブラリは以下のものです。
具体的には、以下のステップで処理します。
出力されるjsonファイルの例:
{
"names": [
{
"name": "山田太郎",
"page": 0,
"index": 1
},
{
"name": "田中花子",
"page": 1,
"index": 2
}
]
}
3. 『ステップ2』のjsonファイルをもとに、PDF Tool APIを使用して「人名」の文字列検索を行います。その後、ヒットした箇所に墨消し注釈を付けます。
〔使用インターフェース:Javaプログラム〕
pip install transformers[torch]
pip install -U langchain langchain-core langchain-community langchain-text-splitters
pip install fugashi
pip install unidic-lite
ライブラリを導入する際、導入先の環境を切り替える「仮想環境(※3)」を利用することもできる。
ライブラリの実装例:上記の実行にはCLASSPATHの設定が必要。
例えば以下の位置に[PDF Tool API V8.0]をデフォルトの設定でインストールし、Jacksonを「C:\lib\」以下のディレクトリに配置した場合は以下のような環境変数の設定が必要です。
CLASSPATH="C:\AHPDFToolLib_80\bin\PdfTkJava80.jar";"C:\lib\jackson-annotations-2.**.jar";"C:\lib\jackson-core-2.21.4.jar";"C:\lib\jackson-databind-2.22.0.jar"
サンプルプログラムは以下のzipファイルに同梱されています。
サンプルzip:[RedactNameWithBERTSample.zip]
サンプルプログラム及びサンプル実行用PDFを同梱したzipファイルである[RedactNameWithBERTSample.zip] は以下から取得できます。
サンプルzip:[RedactNameWithBERTSample.zip]
墨消しを入れたいPDFを用意する。
今回はzipファイルに付属の、1ページ目に「田中太郎」「山田花子」の記述がある[test.pdf]を例に説明する。
以下コマンドを実行する。
AHPDFToolCmd80.exe -extractText out.txt -d test.pdf
カレントディレクトリ内の[test.pdf]が読み込まれ、文字を抽出したテキストファイル[out.txt]が出力される。
本例の実行結果:
C:\RedactNameWithBERTSample>AHPDFToolCmd80.exe -extractText out.txt -d test.pdf
use time 0.046000s
[out.txt]の内容:
[page0]
令和7年度 寄附者一覧 アンテナ県ハウス市 広報 令和8年4月1日 令和7年度にハウス市に寄附をしていただいた方の一覧です。 氏名・寄附金額については、公表を承諾いただいた方のみ掲載しております。 氏名 (法人・団体名) 寄 附 金 額 山田 太郎様 20,000 田中 花子様 非公表 匿名希望者 様 55件 合計 57件 1,025,000円
以下のPythonプログラムを実行する。
python getNameWithPageAndIndex_bert_langchain.py
同じディレクトリにある[out.txt]を読み込み、
名前を抽出したjsonファイル[extracted_names_with_positions.json]が出力される。
実行前に必要ライブラリをPythonにインストールすること。
本例の実行結果:
C:\RedactNameWithBERTSample>py getNameWithPageAndIndex_bert_langchain.py
Loading weights: 100%|████████████████████████████████████████████████████████████| 199/199 [00:00<00:00, 45901.15it/s]
抽出された名前: [{'name': '山田太郎', 'page': 0, 'index': 1}, {'name': '田中花子', 'page': 0, 'index': 2}]
json output done.
本例で出力した[extracted_names_with_positions.json]の内容
{
"names": [
{
"name": "山田太郎",
"page": 0,
"index": 1
},
{
"name": "田中花子",
"page": 0,
"index": 2
}
]
}
以下コマンドでjavaファイルをコンパイルする。
javac pdfTkTest/SearchTextAndRedactFromJSON.java -encoding utf-8
コンパイルが完了したら、以下コマンドで実行する。
java pdfTkTest.SearchTextAndRedactFromJSON test.pdf output_redact.pdf 0
jsonファイルに記載された「名前」でPDF内を文字検索し、墨消し注釈を挿入したPDF[output_redact.pdf]が出力される。
本例の実行結果:
C:\RedactNameWithBERTSample>javac pdfTkTest/SearchTextAndRedactFromJSON.java -encoding utf-8
C:\RedactNameWithBERTSample>java pdfTkTest.SearchTextAndRedactFromJSON test.pdf output_redact.pdf 0
ドキュメント全体から検索します。
検索キーワードを追加:山田太郎
検索キーワードを追加:田中花子
2件のキーワードにRedact注釈を設定しました。
-- 完了 --
出力された[output_redact.pdf]:
赤色を黄色い枠で囲った矩形が挿入された墨消し注釈
Bidirectional Encoder Representations from Transformers の略。Googleが2018年に発表した自然言語処理モデルの形態。学習させたモデルを別の文章を解釈するためにも利用できることが特徴。
jurabi社が学習させた日本語用BERT(※1)モデル。東北大学乾研究室の日本語BERTモデルをファインチューニングして作られている。
仮想環境とは、導入ライブラリなどの環境を分離し、仮想化したもの。Pythonでは、仮想環境を用いることで用途に応じて専用の実行環境を作成し、切り替えて使用することができる。
例えば、以下のコマンドで直下ディレクトリに仮想環境[.venv]を作成できる。
python -m venv .venv
作成した仮想環境[.venv]に切り替える場合は、例えばWindowsコマンドラインの場合、以下のコマンドを実行する。
.venv\Scripts\activate.bat
Windows Powershellの場合など、それ以外の詳細は下記を参考にすること。
参考:仮想環境 [Python環境構築ガイド - Python.jp]
https://www.python.jp/install/windows/venv.html