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.
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
with/Pattern-Matchingwith/<-withundcaseif/cond/case/unlesswild gemischtUmsetzung
lib/codeqa/metrics/file/function_word_profile.ex,@behaviour CodeQA.Metrics.File.FileMetric.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).lib/codeqa/engine/analyzer.ex.Test
test/codeqa/metrics/file/function_word_profile_test.exs, Muster wiebrevity_test.exs.with-Code →dominant_keyword == "with", niedrigekeyword_entropy; gemischterif/case/cond-Code → hohekeyword_entropy.Hinweis
Verwandt mit #42 (Conditional Entropy) — beide arbeiten auf
ctx.tokens. Sauber als getrennte Metrik halten, kein Shared State.