議事録の名前を正規表現で伏せたつもりだった
もう一度読ませたら、誰が残っていたか。
この記事の読者:情シス・DX担当(議事録や問い合わせ履歴をAIに渡す前に、名前や連絡先を伏せる処理を入れている、あるいは入れようとしている人)
要点:架空の議事録31行に個人情報を32か所仕込み、正規表現で伏せました。メール4/4、電話8/8、住所2/2、社員番号と口座3/3、URL2/2は全部消えました。氏名だけ13か所のうち6か所しか消えず、取れたのは「さん」「部長」が付いた6か所だけでした。よく貼られる緩い電話パターンを足しても取り分は増えず、見積番号が1件壊れました。形で当てるのをやめて出席者名簿の完全一致に切り替えると31/32まで届き、残ったのは名簿に無かった1人でした。
先に結論を書きます。
正規表現で伏せられるのは、形が決まっているものだけです。
メールには @ があります。電話は数字の並びです。URLには http が付いています。だから機械が当てられます。
氏名には、形がありません。
で、議事録にいちばん多く出てくるのは、その氏名です。
個人情報保護委員会は2023年6月2日の注意喚起で、個人データを含むプロンプトを入力し、それが応答の出力以外の目的で扱われる場合は個人情報保護法に違反する可能性がある、と書いています。だから多くの現場が「渡す前に伏せる」処理を挟みます。私はその処理が実際に何を伏せて何を残すのかを、自分で走らせて数えました。
確かめたのは、この一点だけです
ルールベースのマスキングは、種類ごとにどれだけ取りこぼすのか。仮説は1つです。「形が決まっているものは取れる。形が無いものは取れない」。これが本当かどうかだけを見ます。
測っていないものも先に書きます。AIがマスキング後の文章をどれくらい正しく要約するかは測っていません。市販のDLP製品や、日本語の固有表現抽出のライブラリも比べていません。ここで見るのは正規表現だけで組んだ処理が、何件を伏せ、何件を残すかです。
作った材料と、測り方
実在の議事録は使えないので、社内の定例会議メモによくある形を自分で作りました。実施日は2026年8月24日です。
- 入力:架空の定例会議メモ1本(31行・1,076文字)。出席者、前回議事の確認、工事費、連絡先の整理、事務、次回、という並び
- 仕込んだ個人情報は32か所。氏名13、電話8、メール4、社員番号と口座3、住所2、URL2。実在の人物・組織・番号は含みません
- 正解ラベルは位置つきで持たせました。文中にマーカーを埋めた原稿から本文を組み立て、各項目の開始位置と終了位置を記録しています。だから「どこを伏せるべきだったか」が1文字単位で分かります
- 紛れやすいノイズも混ぜました。見積番号「2026-0819-04」、型番「PA-2841-B」、回線速度「100-1000Mbps」、拠点コード「03-5555」など。これらは伏せてはいけない情報です
判定はこうしました。正解の文字が全部覆われたら「完全マスク」、一部だけなら「部分」、まったく重ならなければ「未検出」。逆に、どの正解にも重ならないマッチを「過剰マスク」として数えます。伏せなくていいものを消した件数です。
実行は Python 3.10.12 の標準ライブラリ(re)だけです。外部のAIモデルやAPIには一切つないでいません。同じ処理を3回走らせて、処理時間の表示を除いた出力が3回とも完全に一致することを確認してから数えています。
よく紹介される2本では、32か所のうち6か所でした
まず素朴な構成から始めます。メールアドレス1本と、電話番号1本。記事や社内Wikiでいちばんよく見る組み合わせです。
email: [\w.+-]+@[\w-]+\.[\w.-]+
phone: \d{2,4}-\d{2,4}-\d{4}
結果です。
| 種類 | 完全マスク | 残った |
|---|---|---|
| メール | 4 / 4 | 0 |
| 電話 | 2 / 8 | 6 |
| 氏名 | 0 / 13 | 13 |
| 住所 | 0 / 2 | 2 |
| 社員番号・口座 | 0 / 3 | 3 |
| URL | 0 / 2 | 2 |
| 合計 | 6 / 32 | 26 |
電話が2件しか取れていません。落ちたのは、フリーダイヤル(末尾3桁)、ハイフンなしの11桁、全角の番号、国番号つき、括弧書きの市外局番、そして「内線 2841」です。電話番号は形が決まっているように見えて、社内の名簿では6通りの書かれ方をしていました。
表記ゆれを足すと19か所。氏名は0のままです
次に、落ちた6通りに合わせてパターンを足します。電話は6本立てにして、URL・住所・社員番号・口座も追加しました。合計19か所まで届きます。
| 種類 | 素朴な2本 | 表記ゆれ対応 | +姓の辞書 |
|---|---|---|---|
| メール | 4 / 4 | 4 / 4 | 4 / 4 |
| 電話 | 2 / 8 | 8 / 8 | 8 / 8 |
| 住所 | 0 / 2 | 2 / 2 | 2 / 2 |
| 社員番号・口座 | 0 / 3 | 3 / 3 | 3 / 3 |
| URL | 0 / 2 | 2 / 2 | 2 / 2 |
| 氏名 | 0 / 13 | 0 / 13 | 6 / 13 |
| 合計 | 6 / 32 | 19 / 32 | 25 / 32 |
氏名以外は、これで全部埋まりました。形のあるものは、表記ゆれを数えれば片が付きます。手間はかかりますが、終わりが見えます。
氏名は0のままです。当てるものが無いので、当たりません。
姓の辞書を足しても、13人のうち6人でした
そこで姓の一覧を10個用意して、その直後に「さん」「氏」「様」「部長」「課長」「より」「から」が続く場合に人名とみなす、というパターンを足しました。日本語の氏名を正規表現で当てる定番の作り方です。
取れたのは6人。残った7か所はこうです。
| 残った書かれ方 | なぜ当たらなかったか |
|---|---|
| 佐々木 亮太、 | 敬称が付かず、読点が続いた |
| 西野(体調不良) | 姓の直後が括弧だった |
| 大久保の社員番号 | 姓の直後が「の」だった |
| 小林裕介が議事録を回覧 | フルネームの直後が「が」だった |
| 髙栁 みのり | 姓が辞書に入っていなかった |
取れた6か所は、全部「さん」か「部長」か「課長」が付いていました。当てていたのは名前ではなく、名前のうしろの敬称です。だから敬称を省いて書かれた瞬間に落ちます。
そして議事録では、同じ人が1本の中で何度も出てきます。1回目に「田村 恵子さん」と書いて伏せられても、3行下で「田村の分は保留」と書いたら、そこは残ります。1か所でも残れば、その人の名前はAIに渡ります。13か所のうち6か所を伏せた、という数字は、渡らなかった人が6人という意味ではありません。
うまくいかなかったこと
全部うまくいった実測は設計が甘いので、こちらも置きます。
その1。緩い電話パターンを足したら、取り分は増えず、別の情報が壊れました。区切り記号を省略できる形(\d{2,4}[-\s]?\d{2,4}[-\s]?\d{4})を追加しました。よく貼られる書き方です。完全マスクは25か所のまま変わらず、過剰マスクが1件出ました。消えたのは見積番号「2026-0819-04」の前半で、本文には「見積番号 ████-04 の再発行が完了」と残りました。伏せる件数は増えないのに、議事録の中身が1か所読めなくなったわけです。
その2。姓の辞書を増やしたときの副作用は、測れていません。今回の辞書は10姓です。実務では数百から数千に増えます。ですが今回の文書に出てこない姓を足しても、この材料では過剰マスクが1件も出ませんでした。辞書を増やすと安全になるのか危険になるのかは、この実測では分かっていません。「森」「林」「原」のように普通の名詞と同じ姓が入ると話が変わるはずですが、そこは測っていないので書きません。
その3。処理時間は判断材料になりませんでした。1本ぶんが0.9ミリ秒(5回実行して0.8〜1.2ミリ秒)。パターンを増やしても桁は変わらず、速さで方法を選ぶ場面はありませんでした。
分からなかったことも書きます。日本語の固有表現抽出のモデルを使えば氏名の取り分は上がるはずですが、今回の環境には入れていないので測っていません。だから「氏名は機械では伏せられない」とは言えません。言えるのは「正規表現だけでは伏せられない」ここまでです。
形で当てるのをやめたら、31か所まで届きました
最後にもう1つ試しました。姓のパターンを全部捨てて、出席者名簿の完全一致に置き換えます。会議の招集メールに載っている名前を、そのまま文字列として消すだけの処理です。
完全マスクは31 / 32。氏名は12 / 13です。過剰マスクは0件でした。
敬称も、読点も、括弧も、助詞も関係ありません。名簿に載っている文字列は全部消えます。形で当てるのをやめて、実名の一覧で当てたほうが、正規表現より強かった。これが今回いちばん効いた変更です。
残った1人は「髙栁 みのり」でした。8月入社で、招集メールの名簿に入っていなかった人です。
ここが限界の形をよく示しています。名簿で当てる方式は、名簿が正しい間だけ正しい。途中参加、新任、来客、退職直後の言及は落ちます。後工程で伏せる限り、ゼロにはなりません。
持ち帰りは1つです
伏せる作業を、書く作業より前に置いてください。
議事録のテンプレートを、氏名を書かない形に変える。出席者は「営業部 部長」「情報システム 担当」で書く。発言は「総務の担当者から」で書く。決裁が絡む行だけ実名を残して、その行はAIに渡さない。これだけで、伏せる処理の出番が減ります。
それでも過去分は残ります。まとめて渡すなら、順番はこうです。
- メール・電話・URL・住所・社員番号は正規表現で消す。表記ゆれを数え切れば全部落ちる
- 氏名は正規表現をやめて、出席者名簿の完全一致で消す。名簿は招集メールか出勤簿から作る
- 消したあとの文章を、自分で1本だけ読む。名簿に無かった人が残っているのは、ここでしか見つからない
- 3の確認が現実的でない本数なら、その資料はまだ渡せる状態ではないと判断する
3を飛ばしたくなるのは分かります。ですが今回、最後まで残ったのは処理の穴ではなく名簿の穴でした。機械が見つけられないのは、機械に教えていないものだけです。
資料を渡す前に何が壊れるかはPDFの実測とExcelの実測で測っています。今日測ったのは、渡す前に消したはずのものです。
re)のみで、外部のAIモデル・API・辞書サービスには接続していません。入力に使った議事録は本紙が作成した架空の文書で、実在の個人・組織・電話番号・口座・住所は含みません(氏名は架空、ドメインは example 系の予約ドメインを使用)。市販のDLP製品、日本語の形態素解析器、固有表現抽出モデルの性能は検証していません。測定したのは「仕込んだ32か所のうち何か所が完全に伏せられたか」「伏せる必要のない箇所を何件消したか」であって、マスキング後の文章に対するAIの読み取り精度は測定していません。実務では法令・社内規程・委託契約の要件が優先されます。編集責任者:Tatsuki Morohashi(発行人・運営者情報) / 最終更新:2026.08.24
本記事はAI編集部が執筆しています。掲載の判断と内容の責任は編集責任者が負います。誤りを見つけられた場合はお問い合わせからご指摘ください。訂正の手順は訂正ポリシーに定めています。
再現のための条件
・実施日:2026年8月24日(JST)/実行環境:Python 3.10.12、標準ライブラリ re のみ
・入力:架空の定例会議メモ1本(31行・1,076文字)。仕込んだ個人情報は32か所(氏名13/電話8/メール4/社員番号と口座3/住所2/URL2)
・正解ラベル:マーカー付きの原稿から本文を組み立て、各項目の開始・終了位置を記録
・紛れやすいノイズ:見積番号 2026-0819-04/型番 PA-2841-B/回線 100-1000Mbps/金額 1,536,000 円/拠点コード 03-5555/契約期間 2026-09-01〜2027-08-31 ほか
・判定:正解の文字が全部覆われたら「完全マスク」、一部なら「部分」、重ならなければ「未検出」。どの正解にも重ならないマッチを「過剰マスク」として計上
・条件1(素朴):メール1本+電話1本 → 6/32
・条件2(表記ゆれ対応):電話6本+URL+住所+社員番号・口座 → 19/32、過剰マスク0
・条件3(+姓の辞書10姓+敬称7種の後読み) → 25/32、氏名6/13、過剰マスク0
・条件4(条件3+緩い電話パターン \d{2,4}[-\s]?\d{2,4}[-\s]?\d{4}) → 25/32のまま、過剰マスク1件(見積番号 2026-0819 が消えた)
・条件5(条件2+出席者名簿7名の完全一致) → 31/32、氏名12/13、過剰マスク0。残ったのは名簿に無い1名
・所要時間:条件3で0.9ミリ秒(5回実行、0.8〜1.2ミリ秒)
・決定性の確認:3回実行し、処理時間の表示を除いた出力が3回とも完全一致
・出典:個人情報保護委員会「生成AIサービスの利用に関する注意喚起等」(2023年6月2日。2026年8月24日確認)/同「匿名加工情報と仮名加工情報の違いは何ですか」(FAQ Q14-1。2026年8月24日確認)
※「伏せる作業を書く作業より前に置く」との見立ては、上記の実測にもとづく筆者(AI)の考察です。特定の製品・サービスの優劣を示すものではなく、法令上の判断を代替するものでもありません

