AI FÖR NATURLIGT SPRÅK
Kursinfo
Kursmaterial
FAQ
Kursmaterial
/
Kapitel
Slutuppgift: Hitta nyckelord
Bearbeta text och hitta nyckelord
Följande filer används i uppgiften:
• text1.txt - Text från Gustav III:s Wikipedia-sida.
• text2.txt - Text från en annan historisk persons Wikipedia-sida.
För att spara filerna, högerklicka på länken och välj att spara filen. Du behöver inte ladda ned några filer för att genomföra uppgiften, utan de är per automatik tillgängliga för användning i kodcellerna nedan.
I denna slutuppgift är vi intresserade av att ta fram nyckelorden i en text. Detta är intressant för att identifiera vilka ord som verkar definiera texten.
Vi använder oss av samma data som föregående deluppgift, Gustav III:s Wikipedia-sida, och läser in filen rad för rad.
xxxxxxxxxx
def read_data(filename):
with open(filename) as f:
return [line.rstrip() for line in f]
text = read_data('data/ch2/text1.txt')
Likt föregående uppgift importerar vi Spacy och laddar ned den svenska modellen. Denna gång ska vi använda oss av ytterligare en komponent som finns i vår pipeline: en lemmatiserare. Vad den gör är att den försöker hitta grundformen till varje ord. Vår pipeline kommer därför först dela upp meningen i tokens och lemmatisera varje token.
xxxxxxxxxx
import spacy
nlp = spacy.load("sv_core_news_sm")
I textdata förekommer det många ord vars syfte är att hjälpa oss att förstå meningars betydelse. Sådana ord kan vara ‘att’, ‘och’, ‘eller’, m.m. Dessa ord kallar vi stoppord. Stoppord brukar vara vanligt förekommande, och när vi ska hitta nyckelorden i en text så vill vi undvika att räkna med dem. (De säger helt enkelt inte så mycket om just vår text.)
I nästa kodcell ska du tokenisera textdata. För att endast spara token som kan räknas som nyckelord ska du bara spara de som innehåller alfabetiska tecken och som inte är stoppord. Information om en token innehåller alfabetiska tecken och om den är ett stoppord finner du hos en tokens attribut (se dokumentation om attribut. Den token du sparar ska vara ett lemma av ordet. Ordets lemma går också att hitta bland en tokens attribut (välj det attribut för lemman som representeras av en sträng).
För att verifiera att du har en fungerande lösning, innan du applicerar den på hela texten, ska du i följande kodcell bearbeta meningen “Kristina blev Sveriges drottning år 1632.”.
xxxxxxxxxx
def preprocess(lines):
tokens = []
for line in lines:
doc = _____
for token in _____:
if _____:
tokens.append(_____)
return tokens
result = preprocess(["Kristina blev Sveriges drottning år 1632."])
print(result)
När du får ett korrekt resultat kan du tillämpa din lösning på all textdata i nästa kodcell.
xxxxxxxxxx
def preprocess(lines):
tokens = []
for line in lines:
doc = _____
for token in _____:
if _____:
tokens.append(_____)
return tokens
result = preprocess(text)
print(text[:10])
print(result[:5])
Du ska nu använda dig av resultatet i föregående steg för att ta fram frekvensen per token. Spara sedan dem i en sorterad lista, från hög frekvens till låg, där varje element i listan är en tuple innehållandes ordet och dess frekvens.
xxxxxxxxxx
from collections import Counter
token_freq = Counter()
# TODO: Lägg till kod på för att räkna ut frekvens per token
sorted_freq = ______
print(sorted_freq[:5])
Bra jobbat! I nästa kodcell använder vi frekvensen för att skapa ett ordmoln med våra nyckelord.
xxxxxxxxxx
from wordcloud import WordCloud
import matplotlib.pyplot as plt
wordcloud = WordCloud(width=1680,
height=950,
background_color ='white'
).generate_from_frequencies(dict(sorted_freq))
plt.figure(figsize = (10, 10), facecolor = None)
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()
Tycker du att orden fångar den text som vi har arbetat på?
Det finns en till text-fil, text2.txt
, med data som har extraherats från en Wikipedia-sida, och som du kan upprepa processen på om du vill. Kan du lista ut vem Wikipedia-sidan tillhör?
Om du kör om kodcellerna med annan data behöver du använda dig av Kör kod bara, då Registrera svar genomför tester som är specifika för text1.txt
.
Denna webbsajt innehåller kursmaterialet för kursen ETE335 AI för naturligt språk.
Materialet är licenserat under en Creative Commons Erkännande 4.0 Internationell licens.
Copyright © 2022, Marco Kuhlmann & Oskar Holmström