Was & Warum
Misst, welche Token-Paare überzufällig zusammen auftreten (Kollokationen). Hohe Mutual Information = feste Idiome/Boilerplate (defmodule+do, use+GenServer), niedrige = freie Kombination (arithmetische Operanden). Idiom-/Boilerplate-Erkennung über Assoziation statt reiner Häufigkeit.
Skala
Verhalten
Beispiel
erwartete MI
hoch (festes Idiom)
defmodule X do / use GenServer
hohe MI für das Paar
mittel
Enum.map + Funktion
mittlere MI
niedrig (frei)
a + b; c * d; e - f
MI ≈ 0
Umsetzung
Neues Modul lib/codeqa/metrics/file/collocations.ex, @behaviour CodeQA.Metrics.File.FileMetric.
Input: Bigram-Counts über ctx.tokens (gleiche Basis wie feat(metrics): Conditional Entropy & Markov-Perplexity (Token-Sequenz-Vorhersagbarkeit) #42 ). Pointwise MI: PMI(a,b) = log( P(a,b) / (P(a)·P(b)) ). Aggregieren zu mittlerer/maximaler PMI + Top-Kollokationen.
keys: ["mean_pmi", "max_pmi", "top_collocations"].
Registrieren in lib/codeqa/engine/analyzer.ex.
Edge-Cases: < 2 Tokens → Nullwerte.
Test
test/codeqa/metrics/file/collocations_test.exs, Muster wie brevity_test.exs.
Assertion: defmodule X do ... end wiederholt → defmodule→X→do als Top-Kollokation; rein variierende Arithmetik → niedrige mean_pmi.
Hinweis
Teilt sich die Bigram-Basis mit #42 (Conditional Entropy) und #45 . Getrennte Module, kein Shared State.
Was & Warum
Misst, welche Token-Paare überzufällig zusammen auftreten (Kollokationen). Hohe Mutual Information = feste Idiome/Boilerplate (
defmodule+do,use+GenServer), niedrige = freie Kombination (arithmetische Operanden). Idiom-/Boilerplate-Erkennung über Assoziation statt reiner Häufigkeit.Skala
defmodule X do/use GenServerEnum.map+ Funktiona + b; c * d; e - fUmsetzung
lib/codeqa/metrics/file/collocations.ex,@behaviour CodeQA.Metrics.File.FileMetric.ctx.tokens(gleiche Basis wie feat(metrics): Conditional Entropy & Markov-Perplexity (Token-Sequenz-Vorhersagbarkeit) #42). Pointwise MI:PMI(a,b) = log( P(a,b) / (P(a)·P(b)) ). Aggregieren zu mittlerer/maximaler PMI + Top-Kollokationen.keys:["mean_pmi", "max_pmi", "top_collocations"].lib/codeqa/engine/analyzer.ex.< 2Tokens → Nullwerte.Test
test/codeqa/metrics/file/collocations_test.exs, Muster wiebrevity_test.exs.defmodule X do ... endwiederholt →defmodule→X→doals Top-Kollokation; rein variierende Arithmetik → niedrigemean_pmi.Hinweis
Teilt sich die Bigram-Basis mit #42 (Conditional Entropy) und #45. Getrennte Module, kein Shared State.