"""Lager kommentarer.csv: 500 konstruerte svar fra en kundeundersøkelse. python lag_data.py Alt her er oppdiktet. Nettbutikken finnes ikke, kundene finnes ikke, og telefonnumrene er 000 00 000 med vilje. Fila er laget for å øve på fritekstanalyse uten å lime inn noe ekte. Hvorfor en generator og ikke bare en ferdig fil: da kan du se hvordan merkingen er laget, og at feilene i den er lagt inn med vilje. Kolonnen «kategori» later som den er AI-ens merking. Kolonnen «fasit» finnes bare fordi dataene er konstruerte. I en ekte undersøkelse er det du som er fasiten, og det er derfor stikkprøven trengs. Samme frø gir samme fil hver gang. """ import csv import random FRO = 2026 ANTALL = 500 # Hovedkategori, vekt, og setninger. Noen setninger handler om to ting. # De har en andre kategori, og det er der en merking oftest bommer. MALER = { "Levering": (30, [ ("Pakken kom fire dager etter lovet dato.", None), ("Leveringen tok altfor lang tid.", None), ("Fikk beskjed om levering på tirsdag, kom fredag.", None), ("Sporingen sto stille i en uke.", None), ("Pakken ble levert til feil hentested.", None), ("Rask levering, men esken var knust.", None), ("Måtte vente nesten to uker på en jakke.", None), ("Ingen beskjed da pakken var forsinket.", None), ("Billig, men pakken kom en uke for sent.", "Pris"), ("Nettsiden sa to dager, det tok sju.", "Nettsiden"), ]), "Pris": (18, [ ("For dyrt sammenlignet med andre butikker.", None), ("Frakten koster mer enn varen.", None), ("Prisene har gått opp siden i fjor.", None), ("Gode tilbud, men vanlig pris er høy.", None), ("Synes 89 kroner i frakt er mye.", None), ("Rabattkoden virket ikke i kassen.", "Nettsiden"), ("Dyrt å returnere, så jeg beholdt den.", "Retur"), ]), "Nettsiden": (16, [ ("Vanskelig å finne riktig størrelse på siden.", None), ("Appen logget meg ut hele tiden.", None), ("Søket finner ikke det jeg leter etter.", None), ("Kassen hang seg opp to ganger.", None), ("Bildene viser feil farge på varen.", None), ("Fint utvalg, men siden er treg.", "Ros"), ]), "Retur": (12, [ ("Returen tok tre uker før pengene kom.", None), ("Fant ikke returlappen i pakken.", None), ("Måtte betale for å returnere en feil vare.", None), ("Uklart hvordan man bytter størrelse.", None), ("Returen gikk greit, men tok lang tid.", "Ros"), ]), "Ros": (16, [ ("Alt gikk som det skulle, takk!", None), ("Veldig fornøyd, handler gjerne igjen.", None), ("God kvalitet på varene.", None), ("Kundeservice svarte raskt og hjelpsomt.", None), ("Enkelt og greit fra start til slutt.", None), ("Bra pris og rask levering.", "Levering"), ]), "Annet": (8, [ ("Savner flere varer i store størrelser.", None), ("Hvorfor sender dere så mye reklame på e-post?", None), ("Ønsker meg gavepapir som valg.", None), ("Vet ikke.", None), ("Ingen kommentar.", None), ]), } # Tillegg med personopplysninger. Telefon, e-post og ordrenummer kan et # skript finne. Fornavn kan det ikke, og det er poenget. TALL_OG_EPOST = [ " Ring meg på 000 00 000.", " Svar meg gjerne på kunde.test@example.com.", " Gjelder ordre 400123.", " Ordrenummer 400877, se på den.", ] FORNAVN = [ " Takk til Hanne på kundeservice.", " Sjåføren, Per, var veldig hyggelig.", " Snakket med Ali i telefonen, han løste det.", " Jonas i chatten ga meg feil svar.", ] def main(): r = random.Random(FRO) kategorier = list(MALER) vekter = [MALER[k][0] for k in kategorier] rader = [] for i in range(1, ANTALL + 1): fasit = r.choices(kategorier, vekter)[0] setning, andre = r.choice(MALER[fasit][1]) # Simulert AI-merking: blander sammen der setningen handler om to # ting, og bommer av og til uten god grunn. merket = fasit if andre and r.random() < 0.35: merket = andre elif r.random() < 0.05: merket = r.choice([k for k in kategorier if k != fasit]) rader.append([i, setning, merket, fasit]) # Personopplysninger i noen få rader, spredt utover fila plass = r.sample(range(ANTALL), len(TALL_OG_EPOST) + len(FORNAVN)) for n, tekst in zip(plass, TALL_OG_EPOST + FORNAVN): rader[n][1] += tekst # utf-8-sig og semikolon, så norsk Excel åpner den riktig med et dobbeltklikk with open("kommentarer.csv", "w", encoding="utf-8-sig", newline="") as f: w = csv.writer(f, delimiter=";") w.writerow(["id", "kommentar", "kategori", "fasit"]) w.writerows(rader) print(f"Skrev kommentarer.csv med {len(rader)} rader.") print(f"Rader med telefon, e-post eller ordrenummer: {len(TALL_OG_EPOST)}") print(f"Rader med fornavn: {len(FORNAVN)}") if __name__ == "__main__": main()