Skip to content

feat(metrics): Function-Word-Profil (struktureller Keyword-Stil) #45

@aspala

Description

@aspala

Was & Warum

Stilometrie-Signal: die Verteilung struktureller Keywords (do, end, with, case, cond, if, unless, fn, |>) charakterisiert die Handschrift eines Files — unabhängig vom Inhalt. In der Authorship-Attribution sind Funktionswörter das stärkste Autorensignal, weil sie unbewusst gesetzt werden.

Konsistentes Profil = ein Stil. Wildes Durcheinander = gemischte Handschrift / reingeklatschter Fremdcode.

Skala

Verhalten Beispiel erwartetes Profil
erwartet (konsistent) durchgehend with/Pattern-Matching dominiert von with/<-
mittel Mix aus with und case zweigipflig
unerwartet (gemischt) if/cond/case/unless wild gemischt flach, hohe Keyword-Entropy

Umsetzung

  • Neues Modul lib/codeqa/metrics/file/function_word_profile.ex, @behaviour CodeQA.Metrics.File.FileMetric.
  • Input: ctx.tokens, gefiltert auf eine feste Keyword-Liste (Elixir-Strukturkeywords + Operatoren). Relative Häufigkeiten + Entropy über das Profil.
  • keys: ["keyword_entropy", "dominant_keyword", "keyword_ratio"] (Anteil struktureller Keywords an allen Tokens).
  • Registrieren in lib/codeqa/engine/analyzer.ex.
  • Edge-Cases: keine Keywords → Nullwerte.

Test

  • test/codeqa/metrics/file/function_word_profile_test.exs, Muster wie brevity_test.exs.
  • Assertion: reiner with-Code → dominant_keyword == "with", niedrige keyword_entropy; gemischter if/case/cond-Code → hohe keyword_entropy.

Hinweis

Verwandt mit #42 (Conditional Entropy) — beide arbeiten auf ctx.tokens. Sauber als getrennte Metrik halten, kein Shared State.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions