Ollama×VLモデルでニュース本文をOCR抽出する方法

前回はOllamaのVL対応モデルで画像解析を試しました。

今回は一歩進めて、スクリーンショットから日本語OCRを行い、ニュース記事の本文抽出まで自動化します。

パレイドOpenCV × Ollama(VL)でカメラ画像を定点観測するPython実装例前回は、OllamaでVL(Vision Language)に対応したモデルを導入し、UIから画像を解析する例を紹介しました。チャット画面を通じて画像を渡し、そ…

ニュース記事の本文抽出は、HTML構造の違いや動的要素のせいで意外と壊れやすい問題があります。

そこで今回は、ページをスクリーンショット化し、OllamaのVL対応モデルに日本語OCRとして“そのまま読ませる”方法を試します。

日本語に対応したLLMを選ぶ

画像をVL対応のLLMで処理する場合は、英語等で言語化した後に日本語に翻訳する手法もありますが、OCRでは日本語を直接読み取れることが前提になります。

Llava や Llama3.1 / 3.2などが有名ですが、Gemma3 / qwen2.5 / qwen3 なども日本語OCRにも実用レベルで対応しています。縦書きへの対応が難しいと言われていますが、今回はWebサイトのニュース記事が対象のため問題はありません。

なお、純粋なOCRだけであれば、macOSの標準機能も十分に高性能です。

パレイドmacOSのOCR機能とは?ショートカットアプリの自動化に組むこむ方法少し前までは特別な操作が必要でしたが、今では画像からテキストをコピーできるのが当たり前になりました。 例えば macOS では Vision フレームワー…

VLでニュースサイトの本文抽出を自動化

ニュース記事の本文抽出は、自動化しようとすると意外に難しい問題です。サイトごとにHTML構造が異なり、動的生成される要素も多いため、DOMやCSSセレクタによる抽出が安定しないためです。

特定サイトに限定すれば個別対応も可能ですが、キュレーション・アグリゲーション系のサイトで複数のメディアを横断する用途では現実的ではありません。そこで本記事では、ページをスクリーンショット化し、VLモデルに直接本文を抽出させるアプローチを実装します。

コード例

ChatGPTに「ニュースサイトのスクリーンショットを取得し、OllamaのVL対応モデルでOCRを行って本文を抽出するコードを生成して」と指示しました。

生成されたコードでは、記事ページの取得にPlaywrightを使用しています。やや本格的な構成ですが、Web操作の自動化では定番のツールなので、この機会に導入しておくのもよいでしょう。

まずは必要なパッケージをインストールします。

pip install ollama playwright

Playwrightを初めて使用する場合は、ブラウザ本体のインストールも必要です。

playwright install chromium

以下では、qwen3-vlを導入済みのOllamaがローカルで起動していることを前提とします。

import base64
from playwright.sync_api import sync_playwright
import ollama

# 記事URL(このURLはダミー)
URL = "https://newsite/20251230.html"

# スクリーンショット取得
with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page(viewport={"width": 1280, "height": 900})
    page.goto(URL, wait_until="networkidle")
    screenshot = page.screenshot(full_page=True)
    browser.close()

# VLモデルでOCR
image_b64 = base64.b64encode(screenshot).decode()
client = ollama.Client(host="http://127.0.0.1:11434")
response = client.chat(
    model="qwen3-vl:8b",
    messages=[
        {
            "role": "user",
            "content": "この画像に写っているニュース記事の本文をそのまま抽出してテキストで出力してください。",
            "images": [image_b64],
        }
    ],
)
print(response["message"]["content"])

OCRはノイズが多かったり、多少の文字化けがあっても、LLMに修正してもらうことも可能です。また多様なフォントにも対応できたり、補足情報を補ってくれるなど、純粋なOCRよりもこのあたりは柔軟な設計ができるのが強みです。

ただLLMに補足をさせるとハルシネーションが起きる可能性もあり、最終的なチェックは必要です。

利用時の注意

Ollama の公式ページでは、各モデルの対応している言語などは説明がありますが、画像の最大ピクセル数は明記されていません。

ollama.comVision models · OllamaVision models on Ollama.ollama.com

例えば今回利用した Qwen3-VL のアーキテクチャを考えると、コンテキストウィンドウ: 256K トークンで、画像はタイル分割してトークン化されるため、実質的な上限は「トークン数に収まるかどうか」と考えられます。

Qwen3-VL の画像トークン化は最大 1280×28×28、Ollama 経由では内部でリサイズ・トークン数制限がかかるようです。今回の例のように1280×900 程度なら問題ありません。本文が長いと縦長になりすぎる場合があり、その場合は複数の画像に分割して処理するなど対応が必要です。

まとめ

OllamaとVL対応のLLMモデルを使えば、ニュースサイトのスクリーンショットから本文を直接抽出できます。HTML構造に依存しないため、複数サイト横断でも実装はシンプルです。

一方で、画像トークン数の制限やハルシネーションには注意が必要です。長文は分割処理を前提にし、最終確認を行う運用が現実的です。

パレイドLLMでニュース本文の最適CSSセレクタ自動発見を試す【DOM解析×Ollama】前回の記事では、VLモデルを用いたOCRによる本文抽出を試しました。 簡易的な用途であれば十分に機能しますが、精度や処理速度には限界があります。 … パレイドOllamaでローカルVLを試す|無料LLMで画像認識とAPI自動化の可能性前回試したOCR機能ではテキストの抽出は可能ですが、画像そのものを理解することはできません。 ChatGPTのようなクラウド型AIに画像を見せれば認識し… パレイドローカルLLMにWeb検索を足す|Ollama×SearXNGで完全ローカルな最新情報参照こんにちは、パレイド技術部の夏目です。ローカルLLMの一番の弱点は 知識カットオフ(学習した時点より新しい情報を知らないこと)です。手元で動く…
▶ 関連動画 · YOUTUBE
━━ 観るのを再開 ━━
前の記事を読む
同部門 · OpenCV × Ollama(VL)でカメラ画像を定点観測するPython実装例
動画を観る
YouTube
次の記事を読む
同部門 · LLMでニュース本文の最適CSSセレクタ自動発見を試す【DOM解析×Ollama】
━━ 他の観測領域 ━━
TECH · 技術部
ファミリーベーシック 機械語対応(1)|なぜ機械語か
PHIL · 思想部
技術部 試験放送 総括 ── 3つの BGM 生成エンジンを実配信で比べて。速さの SA3、バランスの Turbo、音質の XL
FRONT · 辺境部
【スーパーマリオ256W】世界11を歩く — ファミコンのバグ面 11-1〜11-4