Skip to content

feat(metrics): Conditional Entropy & Markov-Perplexity (Token-Sequenz-Vorhersagbarkeit) #42

Description

@aspala

Was & Warum

Die vorhandene Metrics.File.Entropy misst Shannon-Entropy Ordnung 0 — nur Token-Häufigkeit, nicht die Sequenz. Metrics.File.Ngram zählt Bigramme, modelliert aber keine Übergangs-Wahrscheinlichkeiten.

Diese Metrik schließt die Lücke: H(tₙ | tₙ₋₁) misst, wie vorhersagbar das nächste Token aus dem vorherigen ist. Niedrige conditional entropy = formelhafte Token-Folgen (with {:ok, _} <- … Ketten), hohe = unvorhersehbare, dichte Einzeiler. Perplexity PP = 2^H macht das als linearen Faktor lesbar.

Skala

Verhalten Beispiel erwarteter Wert
niedrig (formelhaft) with {:ok,a}<-f(1), {:ok,b}<-f(2) do H ≈ 0.3 bit, PP ≈ 2
mittel data |> parse() |> validate() |> persist() H ≈ 2.1 bit, PP ≈ 12
hoch (unvorhersehbar) foo.(bar[:baz]) <> Enum.at(q, rem(n,7)) H ≈ 4.8 bit, PP ≈ 60

Umsetzung

  • Neues Modul lib/codeqa/metrics/file/conditional_entropy.ex, @behaviour CodeQA.Metrics.File.FileMetric, Muster wie Metrics.File.Zipf/Ngram.
  • Input: ctx.tokens (Token-Stream). Bigram-Übergänge zählen → bedingte Verteilung P(tₙ | tₙ₋₁) → H = Σ P(prev) · H(next | prev).
  • keys: ["conditional_entropy", "perplexity", "normalized_conditional_entropy"].
  • Registrieren in lib/codeqa/engine/analyzer.ex (Registry.register_file_metric/2).
  • Edge-Cases: leerer Stream und < 2 Tokens → Nullwerte (siehe Ngram.ngram_stats/2).

Test

  • test/codeqa/metrics/file/conditional_entropy_test.exs, Muster wie brevity_test.exs: Pipeline.build_file_context/1analyze/1, Edge-Cases zuerst.
  • Assertion: monoton fallende Sequenz (a a a a) → H ≈ 0; alternierend einzigartig → hohe H.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions