[{"data":1,"prerenderedAt":345},["ShallowReactive",2],{"content-/notion-import-and-book-ocr-pipeline":3,"related-/notion-import-and-book-ocr-pipeline":297,"all-pages-for-dir":343,"og-image-/notion-import-and-book-ocr-pipeline":344},{"id":4,"title":5,"body":6,"category":278,"description":279,"extension":280,"meta":281,"navigation":282,"path":283,"project_name":284,"published":285,"publishedAt":286,"seo":287,"stem":288,"tags":289,"todo":295,"unpublished":285,"updatedAt":295,"__hash__":296},"pages/2026-06/2026-06-09/notion-import-and-book-ocr-pipeline.md","NotionエクスポートのTurso取り込みとyomitoku OCRパイプラインで専門書をDB化した日",{"type":7,"value":8,"toc":264},"minimark",[9,13,26,31,37,40,43,65,68,72,96,99,103,106,112,129,132,136,139,151,154,158,161,168,172,175,178,181,185,188,191,202,209,233,236,239,260],[10,11,5],"h1",{"id":12},"notionエクスポートのturso取り込みとyomitoku-ocrパイプラインで専門書をdb化した日",[14,15,16,17,21,22,25],"p",{},"書籍ナレッジベース（book-knowledge-base）の充填を1日かけて回した。午前はNotionのExport機能で出した税務実務書のデータを ",[18,19,20],"code",{},"/notion-import"," でTurso DBに取り込み、その後はyomitoku（日本語特化AI OCR）→ ",[18,23,24],{},"/restructure-book"," のパイプラインで財務デューデリジェンス系の専門書をDB化。夕方には、ずっと気になっていたTurso Embedded Replicaのsync詰まりをClaude Codeに調査させて根治までいった。",[27,28,30],"h2",{"id":29},"notionエクスポートの取り込みnotion-import","Notionエクスポートの取り込み（/notion-import）",[14,32,33,34,36],{},"「Notionのデータを取り込む方法ってどうやるんでしたっけ」から始まった。手順は ",[18,35,20],{}," スラッシュコマンドに残してあった。エクスポート形式はPDFではなくHTML+画像+ルートCSV、「サブページのフォルダーを作成」をONにする設定で正解。この設定画面のスクリーンショットもコマンドのassetsに保存させて、次回迷わないようにした。",[14,38,39],{},"最初のZIP（76MB）を渡したら、Claude Codeが既存DBと突き合わせて「これは取り込み済みの所得税実務書と同じ書籍です」と返してきた。ルートHTMLのUUIDが一致していたのが根拠。二重取り込みを水際で止めた。",[14,41,42],{},"次の法人税実務書のZIPでは、エクスポート構造が想定と違った。「サブページのフォルダーを作成」ONだと各HTMLが独自フォルダを持ち、画像がその中に入る。既存の取り込みスクリプトは非再帰探索だったので拾えない。Claude Codeに3箇所改修させた。",[44,45,46,53,59],"ul",{},[47,48,49,52],"li",{},[18,50,51],{},"build_parsed_files"," を再帰探索化",[47,54,55,58],{},[18,56,57],{},"copy_images"," をディレクトリ構造保持に変更",[47,60,61,64],{},[18,62,63],{},"rewrite_images_in_soup"," にHTML相対ディレクトリ引数を追加",[14,66,67],{},"dry-runで42チャンクの認識と画像srcの書き換えをサンプル確認してから本実行。42チャンク・画像61枚が入った。",[69,70,71],"h3",{"id":71},"取り込み後に踏んだバグ2つ",[44,73,74,85],{},[47,75,76,77,80,81,84],{},"ファイル名に ",[18,78,79],{},"("," ",[18,82,83],{},")"," が含まれてMarkdownのリンク構文が壊れる → URLエンコードで回避",[47,86,87,88,91,92,95],{},"日本語を含む画像パスでAPIが404 → ",[18,89,90],{},"getRouterParam"," がエンコード済みのまま返していた。",[18,93,94],{},"decodeURIComponent"," を入れたら200に",[14,97,98],{},"最終的に内部画像61/61が200で配信されるところまで検証。ちなみにdev server確認のとき、Claude Codeがポート3000で起動しようとしたので「3000番台は使ってるんで別のやつにしてください」と止めて5050に変えさせた。",[27,100,102],{"id":101},"notionで挫折-pdfからyomitoku直行に切り替え","Notionで挫折 → PDFからyomitoku直行に切り替え",[14,104,105],{},"午前のもう1冊、コンサル系のドキュメント作成術の専門書はNotionエクスポートからの取り込みを試みたが、こちらはNotion DBではなく階層ページ+目次形式のエクスポートでルートCSVがない。標準フローに乗らないとClaude Codeが構造解析した時点で、「ごめん、これを取り込んで」と裁断スキャン済みのPDFを渡してOCRルートに切り替えた。",[14,107,108,111],{},[18,109,110],{},"/yomitoku"," フローはこう進む。",[113,114,115,118,121,124],"ol",{},[47,116,117],{},"PDF冒頭ページから書誌情報を読み取り（奥付で出版社・出版年も確認）",[47,119,120],{},"yomitokuをバックグラウンドで実行（222ページが約3分で完了した）",[47,122,123],{},"図表ファイルのリネーム → Turso DBにチャンク投入（203チャンク）",[47,125,126,128],{},[18,127,24],{}," で目次ベースのセクション単位に統合（203 → 35チャンク）",[14,130,131],{},"途中、DBに過去のNotion試行の残骸24件が残っていて、しかもタイトルが誤字っていたので削除してPDF版で上書きさせた。",[69,133,135],{"id":134},"ocrジャンクの除去は人間が見つけて依頼する","OCRジャンクの除去は人間が見つけて依頼する",[14,137,138],{},"restructure後のページをブラウザで眺めていたら、本文の中に文脈の通らない短い断片がぽつぽつ挟まっているのに気づいた。「こういう意味がないところを全ページ見て削除してほしい」と依頼。Claude Codeがパターンを特定した。",[44,140,141,148],{},[47,142,143,144,147],{},"図表のラベル断片: ",[18,145,146],{},"\u003Cimg>"," の直後に出る短い名詞断片の連続",[47,149,150],{},"ランニングヘッダー: 章名+節名のペアが本文中に紛れ込む",[14,152,153],{},"ただし消しすぎが怖い。図中ラベルと同じ単語が本文の説明にも出てくる箇所があったので、削除対象を検証させたら「本文中のinline説明は残し、図内のラベル断片だけ削除」になっていることを確認できた。28チャンクに適用して完了。",[27,155,157],{"id":156},"午後-財務デューデリジェンスの専門書を流し込む","午後: 財務デューデリジェンスの専門書を流し込む",[14,159,160],{},"「FDDとかビジネスDDの本って入ってましたっけ？」とDBに聞いたら、63冊の中に正面から扱った専門書はゼロ。手元のM&A関連の専門書3冊を取り込むことにした。",[14,162,163,164,167],{},"3冊計1,280ページの大物。yomitokuをバックグラウンド逐次実行で開始したが、途中で1冊を別セッションに切り出すことにして「入門書は別のセッションでやります」と指示。Claude Codeは処理を止め、すでに235ページまで出力済みだった分厚い実務書を ",[18,165,166],{},"--pages 234-677"," で途中から再開させた。最初からやり直しにならないのが効く。677ページ全体で約43分、582チャンクが入った。",[69,169,171],{"id":170},"_3部がないんですけど","「3部がないんですけど」",[14,173,174],{},"restructureで582チャンクを96セクションにマッピングした報告を見て、引っかかった。主要セクション例の一覧に第3部が見当たらない。「3部がないんですけど、なんでないんですか？本当にそれで合ってるんですか？」と突っ込んだ。",[14,176,177],{},"答えは、例示の表が第2部・第4部に偏っていただけで、第3部は28セクションぶんマッピング済みだった。全96セクションをチャンク数+PDFページ範囲付きで列挙させて、第3部がp376〜p490に並んでいるのを目で確認してから統合を承認した。報告のサマリーだけ見て進めると、こういう「見せ方の偏り」と「実際の欠落」を区別できない。疑ったら全件列挙させるのが正解だった。",[14,179,180],{},"夕方には入門書のほうも別セッションで取り込み（304ページ、約70分）、restructureで264 → 40チャンクに統合。目次相当ページがOCRで生成されていなかったため、Claude CodeがPDFの目次と突き合わせてセクション定義を自前で構築した。",[27,182,184],{"id":183},"tursoレプリカいつもsyncで詰まってる気がするを調査依頼","Tursoレプリカ「いつもsyncで詰まってる気がする」を調査依頼",[14,186,187],{},"restructureのたびに「Embedded Replicaのsyncがハング → killしてHTTP直接接続に切り替え」という同じ退避を見ていた。今日だけで2回。「レプリカはいつもシンクで詰まっている気がするので、問題として確認してくれませんか」と調査を依頼した。",[14,189,190],{},"結果、気のせいではなく構造的な問題だった。",[44,192,193,196,199],{},[47,194,195],{},"ローカルWALファイルが40MBまで膨張していた",[47,197,198],{},"過去に9回も壊れて退避された履歴があった",[47,200,201],{},"大量UPDATE（restructureの一括更新）をEmbedded Replica経由で書くと、syncがWALを送り切れずハングする",[14,203,204,205,208],{},"修正方針は読み書き分離。",[18,206,207],{},"db.py"," の全writeメソッド（update/delete系）をHTTP直接接続に切り替え、Embedded Replicaは読み取り専用にした。",[210,211,216],"pre",{"className":212,"code":213,"language":214,"meta":215,"style":215},"language-python shiki shiki-themes vitesse-light vitesse-light","# write系は HTTP 直接接続（libsql の remote URL）に切り替え\n# read系のみ Embedded Replica（_get_conn）を使う\n","python","",[18,217,218,227],{"__ignoreMap":215},[219,220,223],"span",{"class":221,"line":222},"line",1,[219,224,226],{"class":225},"sxvE3","# write系は HTTP 直接接続（libsql の remote URL）に切り替え\n",[219,228,230],{"class":221,"line":229},2,[219,231,232],{"class":225},"# read系のみ Embedded Replica（_get_conn）を使う\n",[14,234,235],{},"詰まったWALを退避してから動作確認。書き込みは0.19秒で即時完了、20回連続書き込み後もWALは0 bytesのまま。今までrestructureのたびに40MB溜めてハングしていたものが、まったく溜まらなくなった。Issueにも調査結果と解消を記録させた。",[27,237,238],{"id":238},"今日の学び",[44,240,241,244,247,254,257],{},[47,242,243],{},"Notionの「サブページのフォルダーを作成」ONエクスポートは画像が各ページのフォルダに散る。取り込みスクリプトは再帰探索が前提になる",[47,245,246],{},"Notionエクスポートが階層ページ形式（ルートCSVなし）の本は、Notion経由をあきらめてPDF → yomitokuに直行したほうが速い",[47,248,249,250,253],{},"yomitokuは途中停止しても ",[18,251,252],{},"--pages"," で再開できる。677ページの大物でも別セッション分割と組み合わせて回せる",[47,255,256],{},"AIの報告サマリーは例示が偏ることがある。「ない」と感じたら全件列挙させて自分の目で確認する",[47,258,259],{},"「いつも詰まってる気がする」レベルの違和感でも調査を依頼すると、WAL 40MB膨張のような構造問題が出てくる。退避を繰り返す前に一度止まって聞く",[261,262,263],"style",{},"html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":215,"searchDepth":229,"depth":229,"links":265},[266,270,273,276,277],{"id":29,"depth":229,"text":30,"children":267},[268],{"id":71,"depth":269,"text":71},3,{"id":101,"depth":229,"text":102,"children":271},[272],{"id":134,"depth":269,"text":135},{"id":156,"depth":229,"text":157,"children":274},[275],{"id":170,"depth":269,"text":171},{"id":183,"depth":229,"text":184},{"id":238,"depth":229,"text":238},"dev","NotionのHTMLエクスポートを/notion-importでTurso DBに取り込み、yomitoku OCRと/restructure-bookで専門書をセクション単位にDB化。Embedded Replicaのsync詰まりも根治した記録。","md",{},true,"/notion-import-and-book-ocr-pipeline","book-knowledge-base",false,"2026-06-09T00:00:00.000Z",{"title":5,"description":279},"2026-06/2026-06-09/notion-import-and-book-ocr-pipeline",[290,291,292,293,294],"Notion","yomitoku","OCR","Turso","書籍ナレッジベース",null,"CQTpOiZ7mV3hRpjO0Rj-Q09fZi_7TK19ponxqbkHQzI",[298,306,316,325,332],{"title":299,"description":300,"path":301,"tags":302,"publishedAt":305,"updatedAt":295},"自炊した4分冊の参考書をOCRして蔵書DBに取り込み、章・節単位に整理し直すまで","655ページある4分冊の参考書をyomitokuでOCRしてMarkdown化し、Turso蔵書DBに640チャンクで格納。さらにページ単位を目次に沿って章・節単位74チャンクへ再構造化した。Embedded Replicaがサブエージェント経由でハングする問題と、クラウドだけ更新してローカルレプリカが陳腐化・破損した一日の試行錯誤を記録する。","/textbook-ocr-to-knowledge-base",[291,292,293,303,304],"蔵書管理","全文検索","2026-05-27T00:00:00.000Z",{"title":307,"description":308,"path":309,"tags":310,"publishedAt":315,"updatedAt":295},"yomitoku 0.13.0 アップグレードと自炊書籍の OCR 取り込み","yomitoku を 0.13.0 にアップグレードしたら torch が CPU 版に置き換わって速度が落ちた話と、自炊した1冊を全文検索 DB に取り込むまでの試行錯誤。","/yomitoku-and-textbook-ocr",[291,311,312,284,313,314],"ocr","turso","pytorch","cuda","2026-05-15T00:00:00.000Z",{"title":317,"description":318,"path":319,"tags":320,"publishedAt":324,"updatedAt":295},"書籍OCRをTurso DBに流し込みつつ、裁断本のPDFをまとめてリネームした日","yomitokuで5冊分の書籍OCRをTurso DBに取り込み、並行して裁断スキャン本のPDFを並列リネームした作業ログ。WALロック衝突をHTTP直結に切り替えて回避し、サブエージェントの誤読は画像と奥付で人間が拾った。","/book-ocr-pipeline-and-pdf-rename",[291,312,311,321,322,323],"pdf-rename","agent-browser","claude-code","2026-05-13T00:00:00.000Z",{"title":326,"description":327,"path":328,"tags":329,"publishedAt":331,"updatedAt":295},"yomitokuで書籍PDFをMarkdown化してTurso DBに格納する：日本語特化AI OCRで蔵書を全文検索可能にする","199ページの実務書PDFを日本語特化AI OCRツール「yomitoku」でMarkdown化し、Turso DB（libSQL）に格納してAmazonメタデータと自動紐付けするまでの記録。/yomitokuスラッシュコマンド1本で完走。","/yomitoku-book-pdf-to-markdown-db",[291,292,293,303,330],"Claude Code","2026-05-10T00:00:00.000Z",{"title":333,"description":334,"path":335,"tags":336,"publishedAt":342,"updatedAt":295},"yomitoku で専門書5冊・1181ページを一気にOCRして Turso DB に1057チャンク登録した","別リポジトリ book-knowledge-base で、日本語特化AI OCRの yomitoku を使って手元の専門書5冊（連結会計の入門書、税効果会計の教科書、財務数値ケース集、連結精算表の入門書、不動産業の漫画）を一気にOCRした。合計1181ページを yomitoku に通し、Markdown と図を抽出して Turso DB に1057チャンクとして登録。GPU処理で1ページあたり約1.6秒、漫画PDFも10ページ16秒で完走した。途中で WAL ロックエラーや「100」が「1OO」（U+004F のO）に化けたファイル名問題にぶつかったが、--replace オプションと実ファイル名再確認で抜けた。漫画PDFの第1話冒頭8ページでは「物語の振り→問い→答え→オチ」の構造でストーリーを抽象化するサマリー雛形を試作し、本一冊全部をかけても同じ形式で使える構造に組み立てた。","/yomitoku-book-ocr-batch",[291,292,293,337,338,339,340,341],"libSQL","PDF","書籍","ナレッジベース","バッチ処理","2026-04-28T00:00:00.000Z",[],"https://log.eurekapu.com/og/blog/notion-import-and-book-ocr-pipeline.png?v=2026-06-09T00%3A00%3A00.000Z&title=Notion%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88%E3%81%AETurso%E5%8F%96%E3%82%8A%E8%BE%BC%E3%81%BF%E3%81%A8yomitoku%20OCR%E3%83%91%E3%82%A4%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%A7%E5%B0%82%E9%96%80%E6%9B%B8%E3%82%92DB%E5%8C%96%E3%81%97%E3%81%9F%E6%97%A5&author=Kei%20Komatsu&sig=f27aab67bd7fca30",1781076213718]