Introduktion till NLP

NLP, Natural Language Processing, är ett delområde inom maskininlärning.  På svenska använder man även termen “språkteknologi”. NLP används för att med hjälp  av datorprogram analysera, förstå och/eller generera mänskligt skrivet eller talat språk.

Möjliga användningsområden

  • Röststyrning.
  • Språköversättning.
  • Automatiska svar på frågor.
  • Chatt-robotar (bottar).
  • Informationsutvinning. Exempelvis att automatiskt lägga till en post i kalendern utifrån texten i ett mejl.
  • Reklam, visa riktad reklam beroende på vad användaren är intresserad av (till exempel skriver i ett Facebook-inlägg).
  • Stavningskontroll.
  • Klassificera dokument. Man försöker klassificera ett dokument utifrån specifika klasser. Exempelvis att klassificera om ett mejl är spam.
  • Sentimentanalys. Att avgöra om en text är positiv eller negativ. Eller om den som skriver är arg, ledsen, nervös, skrämd mm. Vanligt användningsområde är recensioner. Kan även användas för att se det övergripande sentimentet för en produkt eller ett företag, vilket i sin tur sedan kan användas för att avgöra om man ska investera i ett företag eller inte.
  • Uppmärkning av dokument. Nyckelord. Automatiskt taggning av bloggar.
  • Sökning i text.
  • Avgöra hur mycket två dokument påminner om varandra.
  • Hitta relationer mellan olika ord i en text.
  • Natural Language Generation. Används exempelvis för chattbottar och automatisk summering.

Verktyg

För att kunna lösa praktiska uppgifter med NLP finns det en hel del bra verktyg att tillgå. Ett sådant verktyg som är enkelt att använda men ändå väldigt kompetent är den Pythonbaserade plattformen NLTK. Vi kommer att använda NLTK och Python i många av exemplena i denna kurs.

För att kunna installera NLTK krävs det att man först installerat Python. Gör på följande sätt:

  1. Ladda hem och installera Python från https://www.python.org/downloads/. För denna kurs så har vi använt 3.6.3. OBS! Välj en 32 bit Python distribution. NLTK fungerar inte tillsammans med 64 bitars Python.
  2. Ladda hem och installera NLTK från https://pypi.python.org/pypi/nltk. På 64-bitars Windows (men med Python 32-bitars) så kan man istället behöva installera NLTK via pip.

Förbehandling av text

En text innehåller vanligtvis mycket “brus” det vill säga ord som egentligen inte behövs för att förmedla textens grundläggande budskap. Ett första steg för ett NLP program blir därför ofta att ta bort så mycket av de onödiga orden som möjligt för att underlätta vidare behandling av texten.

Stopwords

Om vi skulle vilja analyserar ett dokument med målet att försöka klassificera det utifrån några väl valda nyckelord så skulle ett första steg kunna vara att rensa bort vanliga ord så som “och”, “i”, “på” och “eller”. Detta eftersom dessa ord inte bidrar till att lösa uppgiften. Man kan anta att de flesta texter innehåller dessa ord så att använda dom som nyckelord för ett dokument känns inte aktuellt. Sådana ord brukar kallas “stopwords” på engelska.

NLTK har inbyggda ordlistor med stopwords. NLTK har även en ordlista med svenska stopwords. Följande program skriver ut orden i den svenska stopwords-ordlistan.

import nltk

from nltk.corpus import stopwords

print (stopwords.words('swedish'))

Utskrift från ovanstående program:

['och', 'det', 'att', 'i', 'en', 'jag', 'hon', 'som', 'han', 'på', 'den', 'med', 'var', 'sig', 'för', 'så', 'till', 'är', 'men', 'ett', 'om', 'hade', 'de', 'av', 'icke', 'mig', 'du', 'henne', 'då', 'sin', 'nu', 'har', 'inte', 'hans', 'honom', 'skulle', 'hennes', 'där', 'min', 'man', 'ej', 'vid', 'kunde', 'något', 'från', 'ut', 'när', 'efter', 'upp', 'vi', 'dem', 'vara', 'vad', 'över', 'än', 'dig', 'kan', 'sina', 'här', 'ha', 'mot', 'alla', 'under', 'någon', 'eller', 'allt', 'mycket', 'sedan', 'ju', 'denna', 'själv', 'detta', 'åt', 'utan', 'varit', 'hur', 'ingen', 'mitt', 'ni', 'bli', 'blev', 'oss', 'din', 'dessa', 'några', 'deras', 'blir', 'mina', 'samma', 'vilken', 'er', 'sådan', 'vår', 'blivit', 'dess', 'inom', 'mellan', 'sådant', 'varför', 'varje', 'vilka', 'ditt', 'vem', 'vilket', 'sitta', 'sådana', 'vart', 'dina', 'vars', 'vårt', 'våra', 'ert', 'era', 'vilkas']

I följande Python program så tas svenska stopwords bort från en text.

import nltk
from nltk.corpus import stopwords

stopwords = stopwords.words('swedish')
input_text = "NLP är ett delområde inom maskininlärning."
words = input_text.split()
words_without_stopwords = [word for word in words if word not in stopwords]
text_without_stopwords = " ".join(words_without_stopwords)

print (text_without_stopwords)

Ovanstående Python program kommer att ta bort orden “är”, “ett” och “inom”. Och således blir utskriften från programmet:

NLP delområde maskininlärning.

Normalisering

En annan typ av textförenkling man kan göra är att endast använda grundformen av ett ord. Exempelvis blir grundformen för det böjda verbet programmerade: att programmera. Ett sådant normaliserat ord kallas “lemma”.

Ett liknande men snabbare och enklare sätt att förenkla ord är att använda sig av “stemming”. Det resulterande ordet kan då se konstigt ut men kan ändå vara tillräckligt för att lösa många uppgifter. Och för det svenska språket så är “stemming” det enda som finns att tillgå via NLTK.

I följande Python program görs det böjda verbet hoppade om till sin “stem” form:

import nltk
from nltk.stem import SnowballStemmer

stemmer = SnowballStemmer("swedish")
print (stemmer.stem("hoppade"))

Och utskriften blir:

hopp

Som man kan se i ovanstående exempel görs ordet “hoppade” om till “hopp”. Detta är dock inte grundformen för “hoppade” (grundformen är “att hoppa”).  För att få grundformen så behöver man alltså använda sig av lemmatization istället.

För en engelsk text kan man använda sig av Python paketet WordNetLemmatizer. Tyvärr finns som sagt in stöd för svenska språket i det paketet. Följande program visar hur man gör om ett engelsk ord till dess grundform med hjälp av lemmatization.

import nltk
from nltk.stem.wordnet import WordNetLemmatizer

lemmatizer = WordNetLemmatizer()
print (lemmatizer.lemmatize("jumped", "v"))

Och utskriften blir:

jump