Vettori di parole e similarità semantica

NLP avanzato con spaCy

Ines Montani

spaCy core developer

Confrontare la similarità semantica

  • spaCy può confrontare due oggetti e stimare la similarità
  • Doc.similarity(), Span.similarity() e Token.similarity()
  • Prendono un altro oggetto e restituiscono uno score di similarità (01)
  • Importante: serve un modello con word vectors, ad es.:
    • SÌ: en_core_web_md (medium)
    • SÌ: en_core_web_lg (large)
    • NO: en_core_web_sm (small)
NLP avanzato con spaCy

Esempi di similarità (1)

# Carica un modello più grande con vettori
nlp = spacy.load('en_core_web_md')

# Confronta due documenti doc1 = nlp("I like fast food") doc2 = nlp("I like pizza") print(doc1.similarity(doc2))
0.8627204117787385
# Confronta due token
doc = nlp("I like pizza and pasta")
token1 = doc[2]
token2 = doc[4]
print(token1.similarity(token2))
0.7369546
NLP avanzato con spaCy

Esempi di similarità (2)

# Confronta un documento con un token
doc = nlp("I like pizza")
token = nlp("soap")[0]

print(doc.similarity(token))
0.32531983166759537
# Confronta uno span con un documento
span = nlp("I like pizza and pasta")[2:5]
doc = nlp("McDonalds sells burgers")

print(span.similarity(doc))
0.619909235817623
NLP avanzato con spaCy

Come spaCy predice la similarità?

  • La similarità si basa sui word vectors
  • Rappresentazioni multidimensionali del significato delle parole
  • Generate con algoritmi tipo Word2Vec e molti testi
  • Possono essere aggiunti ai modelli statistici di spaCy
  • Default: similarità coseno, ma è modificabile
  • I vettori di Doc e Span sono la media dei vettori dei token
  • Frasi corte meglio di documenti lunghi con parole irrilevanti
NLP avanzato con spaCy

Word vectors in spaCy

# Carica un modello più grande con vettori
nlp = spacy.load('en_core_web_md')

doc = nlp("I have a banana") # Accedi al vettore con l'attributo token.vector print(doc[3].vector)
 [2.02280000e-01,  -7.66180009e-02,   3.70319992e-01,
  3.28450017e-02,  -4.19569999e-01,   7.20689967e-02,
 -3.74760002e-01,   5.74599989e-02,  -1.24009997e-02,
  5.29489994e-01,  -5.23800015e-01,  -1.97710007e-01,
 -3.41470003e-01,   5.33169985e-01,  -2.53309999e-02,
  1.73800007e-01,   1.67720005e-01,   8.39839995e-01,
  5.51070012e-02,   1.05470002e-01,   3.78719985e-01,
  2.42750004e-01,   1.47449998e-02,   5.59509993e-01,
  1.25210002e-01,  -6.75960004e-01,   3.58420014e-01,
 -4.00279984e-02,   9.59490016e-02,  -5.06900012e-01,
 -8.53179991e-02,   1.79800004e-01,   3.38669986e-01,
  ...
NLP avanzato con spaCy

La similarità dipende dal contesto applicativo

  • Utile in molte applicazioni: raccomandazioni, rilevare duplicati, ecc.
  • Non esiste una definizione oggettiva di "similarità"
  • Dipende dal contesto e dall'obiettivo dell'applicazione
doc1 = nlp("I like cats")
doc2 = nlp("I hate cats")

print(doc1.similarity(doc2))
0.9501447503553421
NLP avanzato con spaCy

Passons à la pratique !

NLP avanzato con spaCy

Preparing Video For Download...