Skip to content

feat(metrics): Character-Ngram-Profil (CNG, Authorship-Signal) #53

Description

@aspala

Was & Warum

Char-3gram-Häufigkeiten sind das klassischste Authorship-Attribution-Signal — sie fangen Zeichenrhythmus (def, do\n, , %, Spacing) ein, der unbewusst gesetzt wird. Ähnliches CNG = ein Stil; abweichendes = Fremdkörper/anderer Autor.

Skala

Verhalten Beispiel erwartet
erwartet matcht das Char-3gram-Profil der Codebase hohe Profil-Ähnlichkeit
mittel mehr |> als üblich leichte Abweichung
unerwartet r=Enum.reduce(l,%{},fn{k,v},a->...end) (keine Spaces) starke Abweichung

Umsetzung

  • Neues Modul lib/codeqa/metrics/file/char_ngram_profile.ex, @behaviour CodeQA.Metrics.File.FileMetric.
  • Input: ctx.content. Char-Tri-/Tetragram-Häufigkeiten → normalisiertes Profil. Auf File-Ebene: Profil-Entropy + die dominanten n-Gramme als Signatur.
  • keys: ["cng_entropy", "top_char_ngrams", "ngram_size"].
  • Registrieren in lib/codeqa/engine/analyzer.ex.
  • Edge-Cases: leer / kürzer als n → Nullwerte.

Test

  • test/codeqa/metrics/file/char_ngram_profile_test.exs, Muster wie brevity_test.exs.
  • Assertion: gut formatierter Elixir-Code → do\n/, unter den Top-n-Grammen; minifizierter Code ohne Spaces → andere Top-n-Gramme, höhere cng_entropy.

Hinweis

Die kodebasenweite Stil-Abweichung (CNG eines Files vs. Korpus-CNG) gehört konzeptionell zu den Codebase-Metriken (#43/#50/#51) und kann später als Cross-File-Vergleich draufgesetzt werden. Dieses Issue deckt erstmal das File-Profil ab.

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