Media > AI活用ユースケース > マーケティング > 新聞社が過去の報道写真をキャプション・人物・地名・撮影日で検索し、人名の異体字や合併前の地名の表記ゆれを吸収して、使用の条件付きで記事と貸出に使う写真を探す

新聞社が過去の報道写真をキャプション・人物・地名・撮影日で検索し、人名の異体字や合併前の地名の表記ゆれを吸収して、使用の条件付きで記事と貸出に使う写真を探す

実装ステータス:構成例 技術的に実現可能な構成として設計したもの。自社未検証

「2000年ごろの旧○○町の祭りで、神輿を担ぐ写真」のような依頼の文を、キャプション・人物・地名・撮影日の条件に直し、過去の報道写真から候補を探します。表記ゆれを吸収し、使ってよいかの印を添えて返します。

サマリー
生成AI
Azure OpenAI Service/Claude
AIサービス
Azure AI/Google Vertex AI/OpenSearch
連携・自動化
Python
対象業界
その他/広告
対象部門
マーケティング
対象業務
内容確認・チェック/情報検索
主な課題
属人化している/情報が見つからない/確認ミスが多い
AIで行う処理
検索(RAG)
主な効果
属人化解消/検索時間短縮/機会損失防止
導入難易度
★★★★☆
実装レベル
本格構成
費用感
RAG・個別開発(大)
人間の確認
条件付き
現在工数
150h/月
AI導入後
60h/月
想定削減
60%
年間削減
1,080h
モデル条件による試算値です。実在企業の実績ではありません。

01導入前 / 導入後の業務フロー

導入前(Before)
  1. 依頼の文を読み、キャプションに書かれていそうなキーワードを考える
  2. データベースでキーワードを検索し、出てこなければ書き方を変えて検索し直す
  3. 撮影日で絞ろうとして、撮影日の欄の空いた古い写真が落ちることに気づき、絞り込みを外す
  4. 出てきた数百枚の一覧を目で追い、同じ場面の連写を飛ばしながら候補を選ぶ
  5. 候補の写真の使用の条件を、写真ごとの備考の欄と担当者の記憶で確かめる
  6. 依頼者に候補を送る
導入後(After)
  1. 人依頼者が受付の画面に依頼の文と使う目的(紙面・電子版・出版・広告・社外の貸出)を書いて送る
  2. 自動Claude API が、依頼の文をキーワード・人物・地名・撮影日の幅・場面の条件に分けて返す
  3. 自動中継の Lambda が、地名と人名を辞書で引き、撮影日の幅を日本時間の範囲に直す
  4. 自動Amazon OpenSearch Service で、表記ゆれを吸収した検索を行い、連写は1枚にまとめる
  5. 自動候補に、二次使用の可否と人物への配慮の印を添え、使う目的で使えないものを分けて並べる
  6. 自動候補の撮影年・撮影者・地名の件数の内訳を添える
  7. 人担当が候補と条件の印を見て、依頼者に返す写真を選ぶ。配慮の印のある写真は、写真部のデスクが判断する
  8. 人見つからなかった依頼で、後から手で見つけた写真があれば、その書き方を辞書の候補に残す
各工程の詳しい説明を読む
  1. 依頼の文を読み、キャプションに書かれていそうなキーワードを考える
  2. データベースでキーワードを検索し、出てこなければ書き方を変えて検索し直す
  3. 撮影日で絞ろうとして、撮影日の欄の空いた古い写真が落ちることに気づき、絞り込みを外す
  4. 出てきた数百枚の一覧を目で追い、同じ場面の連写を飛ばしながら候補を選ぶ
  5. 候補の写真の使用の条件を、写真ごとの備考の欄と担当者の記憶で確かめる
  6. 依頼者に候補を送る

(a)異体字と旧地名で当たらない。 2番目は、思いつく書き方の数だけくり返されます。合併前の町の名前を知らない担当は、その町で撮った写真に行き着けません。

(b)撮影日で絞れない。 撮影日のはっきりした写真だけで絞ると、古い写真がまとめて落ちます。 絞らなければ、何十年分が混ざります。

(c)連写で一覧が埋まる。 行事の写真は1つの場面を何十枚も撮っています。一覧の上位が同じ場面で埋まり、別の場面の写真が下に沈みます。

(d)使用の条件の確認が漏れる。 配信写真を社外に貸し出しそうになる、配慮の要る写真を広告特集に回しそうになる、ということが起きます。確認は担当者の記憶に頼っています。

  1. 【人】 依頼者が受付の画面に依頼の文と使う目的(紙面・電子版・出版・広告・社外の貸出)を書いて送る
  2. 【自動】 Claude API が、依頼の文をキーワード・人物・地名・撮影日の幅・場面の条件に分けて返す
  3. 【自動】 中継の Lambda が、地名と人名を辞書で引き、撮影日の幅を日本時間の範囲に直す
  4. 【自動】 Amazon OpenSearch Service で、表記ゆれを吸収した検索を行い、連写は1枚にまとめる
  5. 【自動】 候補に、二次使用の可否と人物への配慮の印を添え、使う目的で使えないものを分けて並べる
  6. 【自動】 候補の撮影年・撮影者・地名の件数の内訳を添える
  7. 【人】 担当が候補と条件の印を見て、依頼者に返す写真を選ぶ。配慮の印のある写真は、写真部のデスクが判断する
  8. 【人】 見つからなかった依頼で、後から手で見つけた写真があれば、その書き方を辞書の候補に残す

2番目でAIにさせるのは、依頼の文を条件に分けることだけです。 検索そのものは OpenSearch が行い、写真を選ぶのは担当です。

5番目で、使えない写真を隠さずに分けて並べるのが、この設計の要です。 隠すと、担当は写真が無いのか使えないのかを区別できません。「同じ場面の写真はあるが、社外には貸し出せない」と分かれば、別の写真を探す判断ができます。

02今回想定するシステム構成

構成図
受付の画面(依頼の文、使う目的)
   ▼
Claude API ── 依頼の文を条件に分ける(構造化出力)
   ▼
AWS Lambda ── 地名・人名の辞書を引く/撮影日の幅を日本時間で範囲にする
   ▼
Amazon OpenSearch Service
   │  caption(kuromoji+異体字の置き換え+同義語の辞書)
   │  persons/places(正規化した値)
   │  shot_period(date_range。撮影日の幅)
   │  burst_id(連写の束)── collapse
   │  usage(二次使用の可否・配慮の印)── 使う目的で分ける
   ▼
候補の一覧(連写をまとめ、使える/条件付き/使えないに分ける)+件数の内訳
   ▼
【担当が選ぶ。配慮の印は写真部のデスク】
   └──▶ 見つからなかった書き方 ── 辞書の候補(毎月)
役割想定する製品代替候補
検索基盤Amazon OpenSearch Service(kuromoji、mapping の文字フィルタ、同義語の辞書、date_range、collapse、terms 集計)Azure AI Search、Vertex AI Search(Agent Search)
生成AIClaude API(依頼の文を検索の条件に分ける。構造化出力)Azure OpenAI(Microsoft Foundry)
連携AWS Lambda(Python。辞書の引き当て、撮影日の範囲、候補の並べ方)AWS Step Functions
保管Amazon S3(同義語の辞書、依頼と候補の記録)─

写真のデータベースは、正本のままです。 写真の画像とキャプションの原本はこれまでのデータベースに置き、OpenSearch にはキャプションと属性の写しだけを入れます。 画像そのものは渡しません。

日本語のキャプションは、Japanese (kuromoji) Analysis で分けます。 公式のページでは、カスタムパッケージとして取り込んだ辞書を synonyms_path、stopwords_path、user_dictionary に使え、user_dictionary は kuromoji 専用とされています。人名や地名が細かく分かれないよう、ユーザー辞書に入れます。

03どうやって実装するのか

Step1

処理の起点を決める

処理の起点は2つあります。 依頼者が受付の画面から依頼を送ったときと、毎晩、写真のデータベースに前日に入った写真とキャプションの直しを索引に入れるときです。

索引の入れ直しは、その日の夕刊・朝刊の写真が翌日の依頼で見つかるように毎晩行います。 大きな事件・災害のときは、写真部の担当が手で入れ直しを動かせるようにします。依頼が集中するのは、写真がまだ索引に入っていない直後の時期だからです。

Step2

入力データを集める

データ中身取得元
依頼依頼の文、使う目的、依頼者、期限受付の画面
キャプション写真の説明の文、撮影者、撮影日(または撮影の時期)、掲載した紙面写真のデータベース
人物・地名キャプションに写っている人物、撮影した場所(撮影の時点の地名)写真のデータベースの項目
連写の束同じ場面を続けて撮った写真の束の番号撮影の時刻と撮影者から作る
使用の条件提供元(自社・通信社・寄稿)、社外への二次使用の可否、掲載の期限、配慮の印写真のデータベースの備考と写真部の台帳
地名の辞書合併の前と後の市町村の名前の対応写真部が管理
人名・語の辞書異体字の置き換え、通称と正式な名称(行事・施設・災害の呼び名)写真部が管理

質を決めるのは、使用の条件と地名の辞書です。 使用の条件が備考の自由文のままだと、使えない写真を機械的に分けられません。最初に、提供元と二次使用の可否を項目として持たせる作業が要ります。

Step3

データの取得方法を決める

索引の項目は、次のように持たせます。

項目索引の型中身
captiontext(kuromoji+異体字の置き換え。検索の側で同義語の辞書)キャプションの文
personskeyword(正規化)人物の名前。異体字を置き換えた値と原文の両方
placeskeyword撮影の時点の地名と、辞書で引いた今の市町村の名前
shot_perioddate_range撮影日の幅(日付が分かれば1日、「1985年夏」なら6月〜8月)
burst_idkeyword連写の束の番号(1枚に1つ)
providerkeyword自社/通信社/寄稿
external_usekeyword可/不可/要相談
care_flagskeyword少年事件の関係、被害者・遺族、一般の人の顔、などの配慮の印

撮影日は date ではなく date_range で持ちます。 公式のページでは、date_range は日付の範囲を持つ型で、range の検索の relation に INTERSECTS(既定)、CONTAINS、WITHIN があります。「1985年夏」の写真は1985年6月1日〜8月31日の幅で持ち、依頼の「1985年8月」と INTERSECTS で重なれば候補に入ります。 撮影日の分からない写真が絞り込みで落ちる、第3章の(b)がこれで解けます。

地名は、撮影の時点の名前と今の名前の両方を places に入れます。 合併の前の町で撮った写真には、その町の名前と、合併後の市の名前を並べます。辞書は「旧町名 → 今の市名」の向きで引き、今の市名で探すと旧町名の写真も出るようにします。

Step4

AIへ渡す前に整形する

  1. 異体字を置き換える … 「髙→高」「﨑→崎」「德→徳」のような対応を、mapping の文字フィルタで索引と検索の両方に入れます
  2. 原文を残す … 人名は、置き換えた値と原文の両方を持ちます。画面には原文を出します
  3. 撮影日の幅を作る … 日付が分かる写真は1日、時期しか分からない写真は決まった幅(季節は3か月、年だけなら1年)にします
  4. 日本時間で範囲にする … 撮影の日時を日本時間で解釈して範囲にします(次の段落)
  5. 連写の束を作る … 同じ撮影者が同じ場所で数分のうちに撮った写真に、同じ burst_id を付けます
  6. 使用の条件を項目にする … 備考の自由文から提供元と二次使用の可否を項目に移します。移せないものは「要相談」にします

1番目の置き換えは、文字フィルタの中に直接書きます。 公式のページでは、mapping の文字フィルタは mappings の配列か mappings_path のファイルで対応を指定できます。一方、Amazon OpenSearch Service のカスタムパッケージの説明が挙げている使い方は synonyms_path、stopwords_path、user_dictionary で、mappings_path にパッケージを使えるかは確かめられませんでした。 そこで、異体字の対応は索引の設定の mappings の配列に書き、足すときは索引を作り直します。

4番目を軽く見ないでください。 公式のページでは、日付は既定で協定世界時(UTC)として扱われ、検索の time_zone を指定すると UTC に直して比べるとされています。日本時間の早朝に撮った写真を UTC のまま入れると、前の日の写真になります。 索引に入れる日時には +09:00 を付け、検索の範囲にも time_zone: "+09:00" を付けます。

Step5

AIに処理させる

させるのは、依頼の文を検索の条件に分けることだけです。 写真を選ぶこと、使ってよいかを決めることはさせません。

見るものさせること判断できないときの扱い
場面の言葉キャプションに書かれていそうな語を挙げる(「神輿」「みこし」など書き方の違いも)語が無ければ空
人物名前を書かれたとおりに写す異体字を推し量って直さない(置き換えは辞書で行う)
地名地名を書かれたとおりに写す今の名前か旧名かは推し量らない
撮影日依頼の文の日付の表現を写し、受付日を基準にした幅を返す表現が曖昧なら幅を広く取り、date_basis に根拠を書く
使う目的受付の画面の選択をそのまま使う文と選択が食い違えば purpose_conflict

地名と人名を推し量らせないのは、辞書のほうが確かだからです。 合併の前と後の対応を、AIはもっともらしく答えますが、地方の小さな町の合併の組み合わせを取り違えても、出てくる名前は実在の地名なので気づけません。 対応は写真部の辞書で引きます。

検索は bool の検索で組み立てます。 キャプションは should で語を並べ、人物と地名は filter で絞ります。撮影日は shot_period の range の検索で INTERSECTS を使います。連写は collapse で burst_id ごとに1枚にします。 公式のページでは、collapse の項目は keyword か数値で、1つの文書に1つの値である必要があり、scroll の検索や rescore と一緒には使えず、ページ送りには search_after を使うとされています。

{
  "query": {"bool": {
    "should": [{"match": {"caption": "神輿"}}, {"match": {"caption": "祭り"}}],
    "filter": [
      {"term": {"places": "○○市"}},
      {"range": {"shot_period": {"gte": "1998-01-01", "lte": "2002-12-31",
                 "relation": "INTERSECTS", "time_zone": "+09:00"}}}
    ]}},
  "collapse": {"field": "burst_id"},
  "aggs": {"by_year": {"terms": {"field": "shot_year", "size": 20}},
           "by_place": {"terms": {"field": "places", "size": 20}}}
}

件数の内訳は、terms の集計で出します。 公式のページでは、size の既定は10で、各シャードから集める候補の数 shard_size の既定は size * 1.5 + 10、件数は概算になることがあるとされています。内訳は「どの年・どの地名に写真が多いか」の目安に使い、件数の正確さを前提にしません。

Step6

指示内容を固定する

あなたは新聞社の写真データベースの担当として、写真を探す依頼の文を、
検索の条件に分ける立場です。依頼の文に書かれていることだけを使ってください。

【分ける項目】
- scene_terms: 場面を表す語。キャプションに書かれそうな書き方の違い
  (漢字・かな、略称)も並べてよい
- persons: 人物の名前。書かれたとおりに写す
- places: 地名。書かれたとおりに写す
- date_text: 撮影日・時期の表現を書かれたとおりに写す
- date_from / date_to: 受付日({received_date})を基準にした範囲
- date_basis: 範囲をそう決めた根拠
- purpose: 受付の画面で選ばれた使う目的
- purpose_conflict: 依頼の文から読める目的が、選ばれた目的と違うか

【厳守事項】
- 人名の漢字を直さないでください。「高橋」を「髙橋」に、
  「髙橋」を「高橋」に書き換えないでください。
- 地名を今の名前や昔の名前に直さないでください。
  合併の前の町の名前を補わないでください。
- 撮影日がはっきりしないときは、範囲を広く取ってください。
  「〜ごろ」「〜年代」は前後に幅を持たせ、date_basis に書いてください。
- 依頼の文に無い人物・場所・行事を足さないでください。
- 写真を使ってよいか、貸し出してよいかを書かないでください。

【依頼の文】{request_text}
【使う目的】{purpose}

「範囲を広く取る」と書くのは、撮影日の誤りが見つからなさに直結するからです。 依頼の「2000年ごろ」を2000年1年に絞ると、1999年の写真は出ません。広く取って多めに出た候補は担当が目で落とせますが、狭く取って出なかった写真は誰も気づけません。

人名を直させないのは、置き換えを辞書と文字フィルタに任せているからです。 AIが先に直すと、原文と辞書の対応がずれ、本人が届け出た字で書かれた写真の名前を、別の字で示すことになります。

Step7

出力形式を固定する

Claude API の構造化出力で、次の形で受け取ります。 output_config.format に type: json_schema でスキーマを渡し、purpose は enum で縛ります。

{
  "scene_terms": ["神輿", "みこし", "祭り"],
  "persons": [],
  "places": ["○○町"],
  "date_text": "2000年ごろ",
  "date_from": "1998-01-01",
  "date_to": "2002-12-31",
  "date_basis": "「ごろ」のため前後2年の幅",
  "purpose": "external_loan",
  "purpose_conflict": false
}

1つ目の理由は、地名と人名を辞書の引き当てに回せることです。 places と persons が書かれたとおりの値で返るので、Lambda が辞書を引き、旧町名と今の市名の両方で検索を組み立てます。

2つ目は、date_basis を担当に見せられることです。 候補が少ないときに、撮影日の幅が狭すぎたのかを、担当が根拠から判断できます。

候補の一覧は、使う目的で3つに分けて返します。

{
  "request_id": "PR-20261015-0112",
  "usable": [{"photo_id": "", "burst_size": 12, "external_use": "可",
              "care_flags": [], "caption": "", "shot_period": ""}],
  "conditional": [{"photo_id": "", "external_use": "要相談",
                   "care_flags": ["一般の人の顔"]}],
  "not_usable": [{"photo_id": "", "reason": "通信社の配信写真"}],
  "breakdown": {"by_year": {}, "by_place": {}}
}

not_usable を返すのは、写真が無いのか使えないのかを分けるためです。 burst_size は、まとめた連写の枚数で、同じ場面の別のカットを見たいときの手がかりです。

Step8

システムへ連携する

つなぎ先方式内容
受付の画面Lambda のAPI依頼を受け、候補の一覧を返す
Claude APIAPI呼び出し依頼の文を条件に分ける
Amazon OpenSearch Service索引と検索表記ゆれを吸収した検索、collapse、集計
写真のデータベース毎晩の書き出し(読み取りのみ)キャプションと属性を索引に入れる
Amazon S3辞書と記録の保管地名・人名の辞書、依頼と候補の記録

写真のデータベースには書き込みません。 使用の条件の直しも、写真部がデータベースの側で行い、毎晩の取り込みで索引に入ります。画像を外へ出す経路は、これまでどおりの貸出の手続きだけです。

同義語の辞書は、検索の側の analyzer で使います。 公式のページでは、updateable: true は検索の側の analyzer でだけ働き、パッケージを更新して適用すると自動で反映されます。S3 に新しい版を置くだけでは更新されません。

Step9

人が確認する

担当は、依頼者に返す前にすべての候補の使用の条件を見ます。

  1. date_basis と件数の内訳を見る … 候補が少なければ、撮影日の幅と地名を広げて検索し直します
  2. usable から写真を選ぶ … 連写は、必要なら同じ束の別のカットを開きます
  3. conditional を確かめる … 「要相談」は提供元の条件を確かめ、配慮の印は写真部のデスクに回します
  4. not_usable を依頼者に伝えるか決める … 社内の依頼なら「配信写真ならある」と伝えると、配信元に頼む道が開けます

3番目は、AIにも検索にも任せません。 配慮の印は、写真ごとに写真部が付けたものです。印の無い写真に配慮が要らないとは限らないので、事件・事故の写真は、印の有無にかかわらずデスクが見ます。

Step10

例外に対処する

起きること対応
候補が0件撮影日の幅と地名を広げた検索を自動で1回だけ試し、広げたことを示して返す
候補が多すぎる件数の内訳を先に返し、年や地名で絞るよう促す
辞書に無い旧地名そのままの名前で検索し、辞書の追加の候補に記録する
撮影日の欄が空の写真撮影の時期が分からなければ、掲載した紙面の日付で幅を作る
連写の束の番号が無い束にせず1枚ずつ返す。collapse の項目に値が複数ある写真は、検索ごと拒否されるので入れない
使う目的と依頼の文が食い違うpurpose_conflict を示し、担当が依頼者に確かめる
Claude API が応答しない依頼の文をそのままキャプションの検索にかけ、条件の分け方なしで返す

1行目の「自動で1回だけ」に意味があります。 何度も広げると、依頼と関係の薄い写真で一覧が埋まります。

Step11

記録を残す

  • 依頼の文、使う目的、Claude API が分けた条件と date_basis
  • 実際に組み立てた検索の条件(辞書で引いた地名・人名を含む)と、広げたかどうか
  • 候補の一覧と、担当が選んだ写真、依頼者に返した写真
  • conditional と not_usable の写真と、写真部のデスクの判断
  • 見つからなかった依頼と、後から手で見つけた写真とそのときの書き方
  • 辞書の版と適用した日付

5つ目が、辞書を育てる材料です。 毎月これを見て、見つからなかった書き方を辞書に足します。 足した後に同じ依頼で見つかるかを、翌月に確かめます。

04実装レベルの3段階

最小構成:1つの市町村の写真を索引に入れ、担当が手で条件を作って検索する / 表記ゆれの吸収の確かめ
半自動化:上記+全写真を毎晩索引に入れ、連写のまとめと件数の内訳を出す / 全写真の検索と一覧の整理
本格構成:上記+Claude API で依頼の文を条件に分け、使う目的で使える/条件付き/使えないに分け、辞書を毎月更新する / 依頼の受付から、使用の条件付きの候補まで

半自動化で、1件15分が9分程度になります。 書き方を変えて検索し直す手間と、連写を飛ばす手間は減りますが、依頼の文から条件を作る作業と、使用の条件の確認が担当に残ります。 本格構成で6分になり、この段階が本記事の想定です。 段階を飛ばさないでください。 使用の条件が項目になっていないうちに本格構成に進むと、「使える」と分けた写真に、使えない写真が混ざります。

05工数削減シミュレーション

前提値(モデル条件)
対象人数
5 名
月間件数
600 件
1件あたり現在時間
15 分
1件あたり導入後時間
6 分
現在  600件 × 15分 ÷ 60 = 150 時間/月
導入後 600件 × 6分 ÷ 60 = 60 時間/月
月間削減時間
90h
削減率
60%
年間削減時間
1,080h
年間金額換算(時間単価3,000円)
324万円
モデル条件による試算であり、実際の効果は業務内容・運用方法によって異なります。

自社条件で導入効果を整理したい方へ

このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。

AI活用について相談する

06向いている企業・向いていない企業

向いている
  1. 数十万〜数百万枚の報道写真をキャプション付きで持ち、編集局・出版・広告特集・社外への写真の貸出から毎月数百件の「この写真を探して」という依頼が届く新聞社・出版社・通信社。人名の異体字(髙・﨑など)、市町村合併の前の地名、撮影日の分からない古い写真のために、キーワードの検索で見つからず、写真部のベテランの記憶に頼っている場合。写真ごとに二次使用の可否や掲載の配慮の情報を持たせられる場合。
向いていない
  1. 写真が数万枚以下で、撮影日と行事の名前のフォルダで十分に探せる場合。キャプションがほとんど書かれていない写真が大半の場合(探す手がかりが無いので、キャプションの整備が先です)。写真を掲載してよいか・貸し出してよいかの判断(肖像・少年事件・著作権・提供元の条件)をAIに任せたい場合。

07最小構成で試す方法

  1. 写真のデータベースから、1つの市町村の写真のキャプションと属性を書き出す(数万枚。合併のあった町を含める)
  2. 過去3か月の依頼から、見つけるのに時間がかかったもの、見つからなかったものを含めて30件を選ぶ
  3. 書き出したキャプションを、OpenSearch のテスト用のドメインに入れる(kuromoji、異体字の置き換え、地名の辞書、date_range まで)
  4. 30件の依頼を、担当が手で条件に直して検索する
  5. 当時の結果と比べ、見つからなかった写真が出るか、関係の無い写真が増えすぎないかを見る

この段階では Claude API を使いません。 確かめるのは、索引の側の吸収で、見つからなかった写真が見つかるかです。

出てきた内容判断
当時見つからなかった写真が出る依頼の文の分け方(Claude API)と候補の並べ方に進む
旧地名の写真だけ出ない地名の辞書の整備が先
古い写真が出ない撮影日の幅の作り方を見直す。date_range の幅が狭すぎないか
関係の無い写真が多い同義語を広げすぎている。辞書を絞る

2行目が出たら、辞書を写真部と作ります。 合併の歴史は地域ごとで、写真部の担当が知っていることを書き出すところから始まります。

08実装時につまずきやすいポイント

問題対策
異体字で人名が当たらないmapping の文字フィルタで索引と検索の両方を置き換える。画面には原文を出す
旧地名の写真が出ない撮影の時点の地名と今の地名の両方を持たせ、辞書を写真部と作る
撮影日の分からない写真が落ちるdate_range で幅を持たせ、INTERSECTS で重ねる
早朝の写真が前の日になる日付は既定で UTC。索引と検索の両方で +09:00 を付ける
一覧が連写で埋まるburst_id で collapse。値は1枚に1つにする
集計の件数を正確な数として使うterms の集計は概算になりうる。目安に使う
依頼の文の撮影日を狭く取る指示で「広く取る」と書き、date_basis を担当に見せる
AIが人名・地名を直す書かれたとおりに写させ、置き換えは辞書で行う
使えない写真が「使える」に混ざる使用の条件を項目にしてから本格構成に進む
同義語の辞書が反映されない検索の側の analyzer で updateable: true。パッケージの更新と適用を行う

上の4行が、この構成の失敗のほとんどです。 どれも「写真はあるのに、表記と日付のずれで見つからない」形で、誰も気づかないまま「該当なし」が返ります。 見つからなかった依頼を記録し、後から見つけた写真と照らす運用で、初めて見えるようになります。

09セキュリティ・AIガバナンス上の注意点

この構成で扱うデータ: 報道写真のキャプション(人物の名前、事件・事故・災害の説明を含む)、使用の条件、依頼の内容(社外の依頼者の名前を含む)です。

  1. 少年事件の写真の扱いを、印の有無だけに頼らない … 少年法第61条は、家庭裁判所の審判に付された少年などについて、その者が本人であることを推知できるような記事や写真を新聞紙その他の出版物に掲載してはならないとしています(特定少年のとき犯した罪で公訴を提起された場合の特例が第68条にあります)。過去の事件の写真を再び使うときは、care_flags の有無にかかわらず、写真部のデスクと編集の責任者が判断します
  2. Claude API に渡すのは依頼の文だけにする … キャプションの全文や画像は渡しません。依頼の文に個人の名前が入ることはありますが、写真のデータベースの中身は渡しません
  3. 社外の貸出では、使えない写真を外へ見せない … not_usable の一覧は社内の担当にだけ見せ、社外の依頼者に返す一覧には出しません
  4. 掲載の期限を守る … 掲載の期限のある写真は、期限を過ぎたら not_usable に移します。毎晩の取り込みで期限を確かめます
  5. 使ってよいかの判断を代わりにさせない … 肖像、著作権、提供元の条件、事件・事故の関係者への配慮は、この構成が添える印で決まるものではありません。 判断は写真部と編集の責任者が行います

誤りが起きた場合のリスクは、使ってはいけない写真を使うことと、使える写真を見つけられないことの2つです。 前者は人を傷つけ、取り返しがつきません。後者を減らすために検索を広げるほど前者の候補も増えるので、使用の条件の印と人の判断を、検索の広さとは別に必ず通します。

10まず何から始めるか

1週目:使用の条件を項目にする

写真のデータベースの備考の欄から、提供元(自社・通信社・寄稿)と社外への二次使用の可否を項目に移します。250万枚を一度に移す必要はありません。貸出の多い年代から始めます。

2週目:地名と人名の辞書を作る

写真部の担当と、合併の前と後の市町村の名前の対応と、よく出る人名の異体字の一覧を作ります。行事や施設の通称と正式な名称も足します。

3週目:1つの市町村で試す

合併のあった町を含む1つの市町村の写真を OpenSearch に入れ、過去の依頼30件を手で条件に直して検索します。当時見つからなかった写真が出るかを最優先で見ます。

4週目:撮影日と連写を整える

撮影日の幅の作り方と日本時間の扱いを決め、連写の束の番号を付けます。この時点では使う目的での分け方は出さず、候補の一覧だけを担当に見てもらいます。

2か月目: 全写真を毎晩入れ、Claude API で依頼の文を条件に分ける段と、使える/条件付き/使えないの分け方を足します。3か月目以降: 見つからなかった依頼から辞書を毎月足し、1件15分が何分になったかを実測します。見つからなかった依頼の記録が毎月減っていき、写真部のベテランに聞かなくても旧地名の写真に行き着けるようになった時点で、この構成は完成です。


11関連ユースケース

12この仕組みを理解するための記事

13技術仕様の確認日・参考情報

技術仕様確認日:2026-10-15/最終更新:2026-10-15
確認した内容情報源確認日
カスタムパッケージの辞書を synonyms_path、stopwords_path、user_dictionary に使えること。user_dictionary が kuromoji 専用であること。updateable: true が検索の側の analyzer でだけ働き、パッケージの更新と適用で反映されることAWS: Importing and managing packages in Amazon OpenSearch Service2026-10-15
mapping の文字フィルタが mappings の配列か mappings_path のファイルで対応を指定することOpenSearch: Mapping character filter2026-10-15
range の検索の gte/lte、日付が既定で UTC として扱われ time_zone で UTC に直して比べること、relation の INTERSECTS(既定)/CONTAINS/WITHINOpenSearch: Range query2026-10-15
date_range が日付の範囲を持つ型であることOpenSearch: Range field types2026-10-15
collapse の項目が keyword か数値で doc values が有効、1文書に1つの値であること。scroll・rescore と併用できず、ページ送りに search_after を使うことOpenSearch: Collapse search results2026-10-15
terms の集計の size の既定が10、shard_size の既定が size * 1.5 + 10 で、件数が概算になりうることOpenSearch: Terms aggregations2026-10-15
構造化出力を output_config.format(type: json_schema)で指定し、enum で値を縛れることClaude: Structured outputs2026-10-15
家庭裁判所の審判に付された少年などについて、本人と推知できる記事・写真の出版物への掲載を禁じる第61条と、特定少年の特例の第68条e-Gov 法令API: 少年法2026-10-15

写真を掲載・貸出してよいかは、写真部と編集の責任者が、肖像・著作権・提供元の条件・関係者への配慮を確かめて判断してください。 本記事は公式のページで確認できた範囲だけを扱っています。

実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。

自社の業務に使えるAI活用候補を整理します

このユースケース(UC-1636)についてのご相談はこちらから。

AI活用について相談する
目次