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

AIテキスト

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

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

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

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

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

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

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

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

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

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

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

まとめ

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

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

タイトルとURLをコピーしました