Python | レベル別練習問題:コメント

Python
スポンサーリンク

では、先ほどの「コメント練習 50問」版に、
AIがコメント内容を自然文解析して自動評価する拡張版(ChatGPTローカル動作対応)を組み込みます。


コンセプト

  • コメントの**質(意味・目的・理由の適切さ)**を、簡易AIスコアで評価
  • 実際に ChatGPT API に接続しなくても、自然言語ルールベースで自己採点できます(模擬AIスコア)
  • コード構文解析+コメント抽出+内容判定(キーワード・文構造)
  • 採点結果は「点数+講評」として出力

ファイル名例

comment_ai_check.py


"""
コメント練習 AI採点版(自然文分析)

このスクリプトは、ソース内コメントを自動的に読み取り、
AI風スコア(自然文評価)をつけます。

目的:コメントの「良さ(説明の的確さ・意図の明確さ)」を数値化。
"""

import ast
import re
import textwrap

# ============================================
# 分析ロジック
# ============================================

def extract_comments(source: str):
    """Pythonソースコードからコメント(#...)を抽出"""
    lines = source.splitlines()
    comments = []
    for i, line in enumerate(lines):
        if "#" in line:
            stripped = line.strip()
            if stripped.startswith("#"):
                comments.append((i + 1, stripped))
            elif " #" in line:
                parts = line.split(" #", 1)
                comments.append((i + 1, "#" + parts[1]))
    return comments


def score_comment(comment: str) -> tuple[int, str]:
    """
    コメント内容を自然文分析してスコア化(擬似AIロジック)
    100点満点で採点+講評を返す
    """
    text = comment.lower()

    # スコア初期値
    score = 50
    remarks = []

    # ---- 内容の方向性 ----
    if any(w in text for w in ["なぜ", "理由", "目的", "意図", "because"]):
        score += 20
        remarks.append("✅ 理由や意図を説明していて良いです。")
    elif any(w in text for w in ["する", "です", "します"]):
        score += 5
        remarks.append("🙂 説明調で良いですが、もう少し『なぜ』を書くとより良いです。")
    elif any(w in text for w in ["テスト", "確認", "仮"]):
        score += 10
        remarks.append("🔍 状況を明示していて良いです。")

    # ---- 内容の充実度 ----
    if len(text) > 30:
        score += 10
        remarks.append("🗒 内容が十分に書かれています。")
    elif len(text) < 5:
        score -= 20
        remarks.append("⚠️ コメントが短すぎます。もう少し具体的に書きましょう。")

    # ---- よくあるNGパターン ----
    if any(w in text for w in ["足している", "print", "計算", "出力"]):
        score -= 10
        remarks.append("💤 コードの動作説明だけになっています。意図を書きましょう。")
    if "todo" in text:
        remarks.append("📝 TODO コメントです。後で対応予定を具体的に。")

    # ---- 最終調整 ----
    score = max(0, min(100, score))
    summary = " ".join(remarks) or "(内容が短いため評価が難しいです)"
    return score, summary


def evaluate_source(source: str):
    """全コメントを抽出してスコアリング"""
    comments = extract_comments(source)
    total_score = 0
    results = []
    for line_num, comment in comments:
        score, summary = score_comment(comment)
        total_score += score
        results.append((line_num, comment, score, summary))

    avg = total_score / len(comments) if comments else 0
    return avg, results


# ============================================
# 実行部
# ============================================

def main():
    print("🧠 Python コメントAI採点システム")
    print("===================================")

    # 自分自身を読み込む(=同じファイルのコメントを評価)
    with open(__file__, "r", encoding="utf-8") as f:
        source = f.read()

    avg, results = evaluate_source(source)

    print(f"\n💯 平均スコア: {avg:.1f} 点")
    print("-----------------------------------")

    # 上位/下位のコメントを表示
    for line, comment, score, summary in sorted(results, key=lambda x: -x[2])[:5]:
        print(f"✅ 良いコメント (行{line}): {comment} -> {score}\n  {summary}")
    print("...")
    for line, comment, score, summary in sorted(results, key=lambda x: x[2])[:3]:
        print(f"⚠️ 改善が必要 (行{line}): {comment} -> {score}\n  {summary}")

    print("\n👋 評価完了。コメントを改善し、再実行してスコアアップを狙いましょう!")


if __name__ == "__main__":
    main()
Python

特徴まとめ

機能内容
🔍 コメント抽出コード内の # コメントを全行から抽出
🧠 自然文分析「目的」「理由」「TODO」「冗長さ」「短さ」を評価
🧾 スコア出力各コメントごとに点数+講評表示
📊 総合評価平均スコアを100点満点で算出
🪄 学習法自分のコメントを見直し → 改善 → 再実行で上達!

使い方

  1. このファイルを保存(例:comment_ai_check.py
  2. ファイル中のコメント(# ...)を書き換える
  3. 実行すると、コメントごとのスコアと講評が表示されます
python comment_ai_check.py
Python
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました