# IN1140 - gruppe 1 & 2 - annikaol # 3: Flertydigheter import nltk from nltk.corpus import brown from collections import defaultdict # 2: # Oppretter variabelen 'brown_news' som en liste av par(tupler: (ord, tagg)) fra nyhetsdelen i Brown-korpuset. brown_news = nltk.corpus.brown.tagged_words(categories="news") print(brown_news) print() # 3: # Oppretter ordboken "tags" som en defaultdict, slik at: # N?kkel: ordet fra paret i brown_news # Innholdsverdi: taggen til ordet tags = defaultdict(set) for w, t in brown_news: word = w.lower() tags[word].add(t) # Gj?r om alle innholdsverdiene til en liste istedenfor mengde. for w in tags: tags[w] = list(tags[w]) # Oppretter variabelen flertydige_ord, som skal telle antall ordklasser. Itererer # s? gjennom ordboken tags og ?ker "flertydige_ord" med 1, dersom ordet har mer enn # ¨Śn tag(siden det da vil v?re flertydig). flertydige_ord = 0 for word in tags: if len(tags[word]) > 1: flertydige_ord += 1 # Skriver ut resultatet print("Antall flertydige ord i nyhetsdelen i Brown-korpuset: %d" % flertydige_ord) print() # 4: # Ordbok som skal telle antall ordklasser. antall_ordklasser = {} # Legger til ord og antall ordklasser ved ? iterere gjennom 'tags' og legge til lengden av listen (innholdsverdien), # det vil si antall ordklasser, som innholdsverdi i den nye ordboken. for w in tags: antall_ordklasser[w] = len(tags[w]) # Bruker s? 'sorted' p? ordboken for ? sortere den etter antall ordklasser. # lambdafunksjon snur listen(fallende) sortert_flertydige_ord = sorted(antall_ordklasser.items(), key=lambda ordpar: ordpar[1], reverse = True) # (Kommentar om lambda over: en lambdafunksjon er en funksjon vi definerer # rett inn istedenfor ? skrive def()...). # Skriver ut resultatet(her er det to flertydige ord, s? begge skrives ut) print("Ordene med flest tagger er: '%s' med %d distinkte tagger, og '%s' (ogs? med %d distinkte tagger)" % (sortert_flertydige_ord[0][0], sortert_flertydige_ord[0][1], sortert_flertydige_ord[1][0], sortert_flertydige_ord[1][1])) print() # 5: # Endrer ordene i brown_news til kun sm? bokstaver brown_news_lower = [] for word, tag in brown_news: brown_news_lower.append((word.lower(),tag)) # Funksjonen freqs tar et ord som argument og skriver ut hvor ofte ordet forekommer med hver av taggene. def freqs(w): # Oppretter en liste for ordet, itererer gjennom brown_news og legger til alle taggene til ordet i listen w_tag w_tag = [] for word, tag in brown_news_lower: if word == w: w_tag.append(tag) # Itererer gjennom listen w_tag og teller opp antall forekomster av hver tag. # Lagrer resultatet i en ordbok, slik at: # N?kkel: ordklassetaggen # Innholdsverdi: antall forekomster w_tag_teller = {} # Hvis vi ville unng?tt if-statementen nedenfor kunne vi istedenfor brukt en defaultdict, slik: # w_tag_teller = defaultdict(lambda: 0) for tag in w_tag: # Er taggen allerede i ordboken: pluss 1 if tag in w_tag_teller: w_tag_teller[tag] += 1 # Er taggen ikke allerede i ordboken: legg til 1 som innholdsverdi else: w_tag_teller[tag] = 1 #Printer resultatet print("Ord:'%s'" % w) for tag in w_tag_teller: print("%s: %d ganger" % (tag, w_tag_teller[tag])) print() #6: # Bruker informasjonen fra deloppgave 4, der jeg fant ordene med flest tagger - 'to' # og 'house', og bruker 'freqs(w)' til ? skrive ut deres frekvensliste. freqs(sortert_flertydige_ord[0][0]) freqs(sortert_flertydige_ord[1][0])