Regelgebaseerd matchen

Geavanceerde NLP met spaCy

Ines Montani

spaCy core developer

Waarom geen reguliere expressies?

  • Match op Doc-objecten, niet alleen strings
  • Match op tokens en tokenattributen
  • Gebruik de voorspellingen van het model
  • Voorbeeld: "duck" (werkwoord) vs. "duck" (zelfstandig naamwoord)
Geavanceerde NLP met spaCy

Matchpatronen

  • Lijsten van dictionaries, één per token

  • Match exacte token-tekst

    [{'ORTH': 'iPhone'}, {'ORTH': 'X'}]
    
  • Match lexicale attributen

    [{'LOWER': 'iphone'}, {'LOWER': 'x'}]
    
  • Match willekeurige tokenattributen

    [{'LEMMA': 'buy'}, {'POS': 'NOUN'}]
    
Geavanceerde NLP met spaCy

De Matcher gebruiken (1)

import spacy

# Importeer de Matcher
from spacy.matcher import Matcher

# Laad een model en maak het nlp-object nlp = spacy.load('en_core_web_sm')
# Initialiseer de matcher met de gedeelde vocab matcher = Matcher(nlp.vocab)
# Voeg het patroon toe aan de matcher pattern = [{'ORTH': 'iPhone'}, {'ORTH': 'X'}] matcher.add('IPHONE_PATTERN', None, pattern)
# Verwerk tekst doc = nlp("New iPhone X release date leaked")
# Roep de matcher aan op de doc matches = matcher(doc)
Geavanceerde NLP met spaCy

De Matcher gebruiken (2)

# Roep de matcher aan op de doc
doc = nlp("New iPhone X release date leaked")
matches = matcher(doc)

# Itereer over de matches for match_id, start, end in matches:
# Haal de gematchte span op matched_span = doc[start:end] print(matched_span.text)
iPhone X
  • match_id: hashwaarde van de patroonnaam
  • start: startindex van de gematchte span
  • end: eindindex van de gematchte span
Geavanceerde NLP met spaCy

Lexicale attributen matchen

pattern = [
    {'IS_DIGIT': True},
    {'LOWER': 'fifa'},
    {'LOWER': 'world'},
    {'LOWER': 'cup'},
    {'IS_PUNCT': True}
]
doc = nlp("2018 FIFA World Cup: France won!")
2018 FIFA World Cup:
Geavanceerde NLP met spaCy

Andere tokenattributen matchen

pattern = [
    {'LEMMA': 'love', 'POS': 'VERB'},
    {'POS': 'NOUN'}
]
doc = nlp("I loved dogs but now I love cats more.")
loved dogs
love cats
Geavanceerde NLP met spaCy

Operatoren en kwantoren gebruiken (1)

pattern = [
    {'LEMMA': 'buy'},
    {'POS': 'DET', 'OP': '?'},  # optioneel: match 0 of 1 keer
    {'POS': 'NOUN'}
]
doc = nlp("I bought a smartphone. Now I'm buying apps.")
bought a smartphone
buying apps
Geavanceerde NLP met spaCy

Operatoren en kwantoren gebruiken (2)

Beschrijving
{'OP': '!'} Negatie: match 0 keer
{'OP': '?'} Optioneel: match 0 of 1 keer
{'OP': '+'} Match 1 of meer keer
{'OP': '*'} Match 0 of meer keer
Geavanceerde NLP met spaCy

Laten we oefenen!

Geavanceerde NLP met spaCy

Preparing Video For Download...