消費税本の蔵書データベースを棚卸し、重複削除とOCR未収録2冊の取り込みを進めた
消費税本は何冊あるか、数える前に重複が見つかった
蔵書データベースに消費税関連の本がどれくらい入っているか、ふと気になって調べさせた。 検索結果は12冊。 ただし内訳を見る前に、妙な引っかかりが出た。 本文190チャンクが完全一致する組がある。 重複登録だ。
12冊のうち実質11冊、重複1組とメタデータ不一致1件という報告を受けて、まず片づけることにした。 間違っている方を消してほしいと頼み、ついでにまだPDFのまま取り込んでいない消費税本がどれだけ残っているかも聞いた。
別ファイルだと思っていたら同じPDFだった
削除対象の裏取りから始めさせた。 重複していた2冊は最初、別のPDFに見えた。 ファイル名が違う。 ところが冒頭のOCRテキストを突き合わせると一致し、著者もページ数(208ページ)も同じだった。 ファイル名だけが違う同一PDFだと確定し、片方を削除した。 384冊まで減った。
未取り込みPDFは23件見つかったが、ここでも引っかかりが出た。 管理番号が2件、別の本と重複している。 番号がユニークでないのは把握済みだから気にしなくていいという返事をもらい、深追いはしなかった。 タイトルで照合すればそれで済む話だった。
未取り込みの2冊を読み解く
未取り込みリストの中に、簿記系資格の知識に消費税の取引区分の考え方をプラスした教材が2冊あった。 259ページ版と237ページ版。 読み解いてほしいという依頼を受けて、まず本当に未取り込みかを裏取りしてから着手した。
表紙と奥付を画像で確認すると、2冊は著者も出版元も同じだった。 奥付が白紙で出版年が読み取れなかったので、amazon_metadataを見に行くと「3訂版・2024/7/22・インボイス対応」と記録されている。
ここで最初のズレに気づいた。 237ページ版の全文、15万字を「適格」「区分記載」で検索すると、どちらも0件。 インボイス制度が始まる前の版の特徴だ。 メタデータは最新版だと言っているのに、本文はそう読めない。 取り込みは進めつつ、書誌は実物に合わせて直す方針にした。
OCR中にバックアップスクリプトが壊れた
259ページ版のOCRをバックグラウンドで走らせた。 GPUを専有するので2冊は直列で進めた。 1ページ2秒ペース、259ページなら9分の見込みだった。
その間にバックアップスクリプトがエラーを吐いた。
原因を追わせると、chunksテーブルが49,173件まで増え、1クエリでの全件取得が上限を超えていた。
OFFSETでページングしていた旧方式は、取得中に行が増減すると重複や欠落が起きる作りだったので、WHERE id > ? でidをカーソルにしたkeyset pagination(1,000行ずつ)に書き換えさせた。
columnsの先頭がidでなければValueErrorで止まる安全弁も入れて、バックアップは復旧した。
259ページ版、実は最新版だった
再構造化のためにチャンク構造を見ていたら、p149-150に「適格請求書発行事業者」という記述が出てきた。 全文検索にかけると「適格請求書」が23回ヒットした。
「手元のPDFは最新版ではない」という先ほどの判断は、259ページ版については誤りだったと分かった。 237ページ版は0回のままだったので、旧版だという判定は変わらなかった。 同じシリーズの2冊でも片方だけインボイス対応、片方だけ非対応という食い違いに気づき、descriptionを実物に合わせて修正した。
見出し照合、89項目中24しか合わなかった
目次の組み立ても2冊で難易度が違った。 259ページ版は印刷ページとDBページのオフセットが+16で一定だったので、全20章がそのまま一致した。
237ページ版はオフセットが一定でない。 見出し照合の方式に切り替えたが、最初の抽出範囲では89項目中24項目しかマッチしなかった。 見出しの抽出対象を本文全体に広げて作り直すと、89項目すべてがマッチし、全16章が正しく並んだ。 259ページ版は238チャンクを110セクションに統合し、237ページ版は210チャンクを76セクションに統合した。
新着PDFは、結局同じ旧版の撮り直しだった
作業の途中で、保存先フォルダに新しいPDFが届いた。 最新版らしい237ページ版をリネームして読み解いてほしいという指示だった。 空き番号を割り当ててリネームし、Dropboxへコピー(63.3MB)してから、旧版との異同を確かめた。
正規化後の文字数は136,038字と135,818字、類似度(quick_ratio)は0.983。 差はOCR誤差の範囲に収まっていた。 「適格」「インボイス」は新スキャンでも0件のまま。 インボイス対応の3訂版ではなく、同じ旧版を撮り直しただけだと分かった。 指示どおり新しいスキャンの方を採用して取り込んだ。
クリーンアップから表示確認まで
2冊分のクリーンアップ(見出しの連番除去、空行の圧縮)はまとめて実行し、FTSのリビルドは最後に1回だけ回した。 237ページ版は新しい連番で登録されていたため、amazon_metadataの紐付けも元の番号に付け直した。 検索テストはすべて成功し、devサーバーで実際の表示も確かめた。 図、目次、章構成はいずれも正しく表示され、コンソールエラーもなかった。
コミット前にもう一度、インボイス対応を確かめた
コミットとプッシュを頼んだ直後、「237ページ版、本当にインボイス対応版じゃないんだっけ」ともう一度確かめた。 作業の途中で259ページ版の判定をひっくり返した経緯があったので、無理もない疑問だった。 根拠を3つ挙げて説明してもらうと、237ページ版はやはり古い版のままだった。
book-knowledge-baseとturso-replicasの両方をプッシュさせた。 turso-replicas側の1件は本来学習ゲートの対象だが、「book-knowledge-baseの作業では学習ゲートは常にスキップでいい」と伝え、今回も3件ともスキップで通させた。 方針はCLAUDE.mdに記録させた。
学び
- メタデータの「インボイス対応」は鵜呑みにできない。全文検索で「適格」「区分記載」の出現回数を数えるほうが確実だった
- 同じシリーズの2冊でも、版の新旧は別々に判定する必要がある。片方が正しくても、もう片方が同じとは限らない
- OFFSETページングは行数が伸びると壊れる。idをカーソルにしたkeyset paginationに変えて事故を防いだ
- 見出し照合は抽出範囲を広げるだけでマッチ率が24/89から89/89まで上がった。狭い範囲でうまくいかないときは、まず対象を広げてみる価値がある