掲示板<38>2026/3/8
from=TOZ

Pythonを利用⑭「ollama_math_latex_fixer_v3.py」

私のホームページの最初の頃は、高等数学の窓(高校数学の窓)の運営が中心でした。 28年間のうちに、いろいろなものに興味が移り、最終的に膨大なホームページで ある「tozsun.com」が出来上がりました。 最近のスマホ閲覧に対処すべく、Geminiに相談しながら修正してきました。いろ いろな場所のスマホ化に成功しましたが、残るは約3900個の質問のある「高等数学 の窓」になります。数式のため、いろいろ工夫してきたことが仇になり、見やすい ものに直すことができないでいたのです。量も膨大であることも関係しています。 Copilot-PC(Snapdragon X Elite)を使って、処理してもらうことも考えたの ですが、ARMパソコンのため、数式が得意なollama(AI)のインストールを拒否 されています。しばらく後には可能となると思いますが、今はまだ早すぎるようです。 いつも利用しているLMDE7(リナックスミントOS)がpythonを動かすのに便利な ので、Geminiに聞いたところ、LMDE7が入っているパソコンはMinisForumのHX90 なので、メモリを現在の16GBから64GBにすれば可能であることがわかりました。 しかし、現在メモリは高騰しており、64GBで約9万円です。半分の32GBならば、 3万5千円ぐらいなので、元のメモリ8GB+購入メモリ32GB=40GBで可能で あることが分かりました。そこで、急遽購入しました。(将来、もう32GB購入す れば、合計64GBにすることも可能です。) Geminiに相談しながら、ollamaで動くAIソフト(無料)を3つほど入れて確かめ ました。 (1)deepseek-r1:14b (2)deepseek-r1:7b (3)qwen2.5:latest 最終的に(3)のqwen2.5で行くのが負担が少なく可能であることが分かりました。 LMDE7(メモリ40GB)にollamaとqwen2.5をインストールして、Geminiに 下記のpythonプログラムを作ってもらいました。試行錯誤をすること1日、完成し 1日300個ですが、着実にhtmlを読み取って、LaTeXに書き直してくれることが できました。確認すると、95%くらいの確率で修理できています。 10日間かけて3000個の書き換えをしてくれたら、その後、ホームページにアップ してスマホでも見やすいものにする予定です。 作業中の様子をお見せします。 ホームページのタグの関係で、プログラム中の「<」「>」は全角表示しています。
import os
import glob
import requests
import json
import re
import time

# --- 1. 設定 (Qwen2.5を使用) ---
OLLAMA_URL = "http://localhost:11434/api/generate"
MODEL_NAME = "qwen2.5:latest"  # すでにリストにあるモデルを使用
INPUT_DIR = '.'
OUTPUT_DIR = '../modern_math'
TARGET_PATTERN = 'sec*.html'

def ask_local_ai_to_fix(html_text):
    prompt = (
        r"あなたは数学専門のWeb編集者です。HTML内の数学表現(fontタグ、iタグ等)をLaTeX形式 \( ... \) に修正してください。"
        "\n【厳守】日本語文章とHTML構造は一切変えず、修正後のHTMLコードのみを返してください。"
    )
    
    payload = {
        "model": MODEL_NAME,
        "prompt": f"{prompt}\n\n{html_text}",
        "stream": False,
        "options": {
            "temperature": 0,    # 正確性を最大化
            "num_ctx": 16384     # 大きなファイル対策
        }
    }

    try:
        response = requests.post(OLLAMA_URL, json=payload, timeout=None)
        if response.status_code == 200:
            result = response.json()['response']
            # 余計な装飾の除去
            clean_html = result.replace('```html', '').replace('```', '').strip()
            return clean_html
        return f"ERROR: HTTP {response.status_code}"
    except Exception as e:
        return f"ERROR: {str(e)}"

def main():
    if not os.path.exists(OUTPUT_DIR): os.makedirs(OUTPUT_DIR)
    
    processed_files = set(os.listdir(OUTPUT_DIR))
    all_files = sorted(glob.glob(os.path.join(INPUT_DIR, TARGET_PATTERN)))
    files_to_process = [f for f in all_files if os.path.basename(f) not in processed_files]
    
    print(f"--- 修正開始 (残り {len(files_to_process)} 個) ---")

    for i, fpath in enumerate(files_to_process):
        fname = os.path.basename(fpath)
        print(f"[{i+1}/{len(files_to_process)}] 処理中: {fname}...", end="", flush=True)
        
        # 読み込み
        with open(fpath, 'r', encoding='utf-8', errors='replace') as f:
            file_content = f.read()  # ここで内容を定義

        # AIに渡す (変数名を file_content に統一)
        result = ask_local_ai_to_fix(file_content)
        
        if result.startswith("ERROR"):
            print(" 失敗")
        else:
            with open(os.path.join(OUTPUT_DIR, fname), 'w', encoding='utf-8') as f:
                f.write(result)
            print(" 成功")
            
        # --- CPU冷却のための休憩 (3秒) ---
        # 68°Cまで上がった温度を逃がすためのインターバルです
        time.sleep(3)

if __name__ == "__main__":
    main()



← 一覧へ戻る