Downloads · 30 days
15
11% of all-time downloads
pegesund/norwegian-ai-detector
norwegian-ai-detector is a text classification model from pegesund. Use it when you need a label for a piece of text. The card lists the license as cc-by-sa-4.0.
Klassifikator som skiller menneskeskrevet og AI-generert norsk tekst (bokmål + nynorsk). Fine-tunet fra ltg/norbert4-small (50M parametere).
Downloads · 30 days
15
11% of all-time downloads
All-time downloads
132
Public
Parameters
40.7M
487 MB on disk
Likes
0
Public
Click a slice to open those files.
.onnx151 MB · 64%
From the Hugging Face model README
Klassifikator som skiller menneskeskrevet og AI-generert norsk tekst (bokmål + nynorsk). Fine-tunet fra ltg/norbert4-small (50M parametere).
from transformers import AutoModelForSequenceClassification, AutoTokenizer
import torch
import torch.nn.functional as F
MODEL = "pegesund/norwegian-ai-detector"
tokenizer = AutoTokenizer.from_pretrained(MODEL, trust_remote_code=True)
model = AutoModelForSequenceClassification.from_pretrained(MODEL, trust_remote_code=True)
model.eval()
text = """Hippodrom (gresk: ἱππόδρομος, hippodromos, av hippos, «hest», og dromos, «løp»)
er en bane til hesteveddeløp. Også i dag betyr ordet hesteløpsbane i flere moderne språk,
eksempelvis i moderne fransk. Av den grunn er det hesteløpsbaner som har ordet hippodrom
som en del av navnet, blant annet Hippodrome de Vincennes i Paris og Hippodromen i Moskva."""
inputs = tokenizer(text, return_tensors="pt", truncation=True, max_length=1024)
with torch.no_grad():
logits = model(**inputs).logits
probs = F.softmax(logits, dim=-1)[0]
print(f"P(menneske) = {probs[0].item():.4f}")
print(f"P(AI) = {probs[1].item():.4f}")
import onnxruntime as ort
import numpy as np
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("pegesund/norwegian-ai-detector", trust_remote_code=True)
sess = ort.InferenceSession("detector_fp16.onnx")
text = "Hippodrom (gresk: ἱππόδρομος, hippodromos, ...) er en bane til hesteveddeløp..."
enc = tokenizer(text, return_tensors="np", truncation=True, max_length=1024)
logits = sess.run(["logits"], {
"input_ids": enc["input_ids"],
"attention_mask": enc["attention_mask"],
})[0]
# Softmax
exp = np.exp(logits - logits.max(axis=-1, keepdims=True))
probs = exp / exp.sum(axis=-1, keepdims=True)
print(f"P(menneske) = {probs[0, 0]:.4f}")
print(f"P(AI) = {probs[0, 1]:.4f}")
ONNX-filer i onnx/-mappen:
detector_fp16.onnx (87 MB) — anbefalt for browser-deploy via onnxruntime-webdetector_int8.onnx (57 MB) — kompakt, ~1-2% lavere presisjonInputtekstene bør forhåndsrenses med samme normalisering som under trening.
Se clean_text.py i dette repoet for konkret implementasjon. Hovedoperasjoner:
{{...}}, [[...]], <...>, **, ==)[ref], krøllparenteser {...}&, )«»""'' → strippet)—– → -)from clean_text import clean
cleaned = clean(your_text)
På in-distribution test-sett (6 062 holdt unna trening):
| Metrikk | Verdi |
|---|---|
| Accuracy | 0.999 |
| F1 | 0.998 |
| Precision | 0.998 |
| Recall | 0.999 |
Per språk (bokmål + nynorsk): F1 ≥ 0.999 i begge.
Per tekst-lengde:
| Lengde (ord) | n | F1 |
|---|---|---|
| 50–300 | 1 425 | 0.9913 |
| 300–800 | 2 873 | 0.9991 |
| 800–2 000 | 1 360 | 0.9988 |
| 2 000+ | 404 | 0.9920 |
Modellen er svakest på korte tekster (under ~300 ord) der det er minst kontekst å gå på.
⚠️ Disse tallene gjelder for in-distribution testing. Modellen er trent på en spesifikk samling AI-generatorer (se listen over). Reell ytelse på:
Hvis du bruker denne modellen i forskning eller publikasjon, vennligst krediter:
CC-BY-SA-4.0, samme som NorBERT-4. Modellen kan brukes fritt; deriverte verk må deles under samme lisens.