RegEx se spaCy

Zpracování přirozeného jazyka s knihovnou spaCy

Azadeh Mobasher

Principal Data Scientist

Co je RegEx?

 

  • Extrakce informací (IR) na základě pravidel je užitečná pro mnoho NLP úloh
  • Regulární výrazy (RegEx) se používají pro složité vzory shody řetězců
  • RegEx vyhledává a získává vzory nebo nahrazuje shody

RegEx: extrakce odkazů a telefonních čísel

Zpracování přirozeného jazyka s knihovnou spaCy

Silné a slabé stránky RegEx

Výhody:

  • Umožňuje psát robustní pravidla pro extrakci informací
  • Dokáže zachytit různé varianty řetězců
  • Rychlé zpracování
  • Podporováno programovacími jazyky

Nevýhody:

  • Syntaxe je náročná pro začátečníky
  • Vyžaduje znalost všech způsobů, jak se vzor může v textech vyskytovat
Zpracování přirozeného jazyka s knihovnou spaCy

RegEx v Pythonu

 

  • Python obsahuje předinstalovanou knihovnu RegEx, re.
  • Prvním krokem při použití balíčku re je definovat pattern.
  • Výsledný vzor slouží k vyhledání odpovídajícího obsahu.

 

import re

pattern = r"((\d){3}-(\d){3}-(\d){4})"
text = "Our phone number is 832-123-5555 and their phone number is 425-123-4567."
Zpracování přirozeného jazyka s knihovnou spaCy

RegEx v Pythonu

 

  • Používáme metodu .finditer() z balíčku re
iter_matches = re.finditer(pattern, text)

for match in iter_matches: start_char = match.start() end_char = match.end()
print ("Start character: ", start_char, "| End character: ", end_char, "| Matching text: ", text[start_char:end_char])
>>> Start character:  20 | End character:  32 | Matching text:  832-123-5555
Start character:  59 | End character:  71 | Matching text:  425-123-4567
Zpracování přirozeného jazyka s knihovnou spaCy

RegEx ve spaCy

  • RegEx ve třech komponentách pipeline: Matcher, PhraseMatcher a EntityRuler.
text = "Our phone number is 832-123-5555 and their phone number is 425-123-4567."

nlp = spacy.blank("en") patterns = [{"label": "PHONE_NUMBER", "pattern": [{"SHAPE": "ddd"}, {"ORTH": "-"}, {"SHAPE": "ddd"}, {"ORTH": "-"}, {"SHAPE": "dddd"}]}]
ruler = nlp.add_pipe("entity_ruler") ruler.add_patterns(patterns) doc = nlp(text) print ([(ent.text, ent.label_) for ent in doc.ents])
>>> [('832-123-5555', 'PHONE_NUMBER'), ('425-123-4567', 'PHONE_NUMBER')]
Zpracování přirozeného jazyka s knihovnou spaCy

Pojďme cvičit!

Zpracování přirozeného jazyka s knihovnou spaCy

Preparing Video For Download...