Skip to content

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

@aspala

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
    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