Conținut curs
Python Avansat
Despre lecție

Obiective

În această lecție, veți învăța:

  1. Ce este Natural Language Processing (NLP) și de ce este important
  2. Introducere în bibliotecile spaCy și NLTK
  3. Preprocesarea textului cu spaCy și NLTK
  4. Analiza limbajului natural și extragerea informațiilor
  5. Aplicații practice ale NLP

1. Ce este Natural Language Processing (NLP) și de ce este important

Natural Language Processing (NLP) este o ramură a inteligenței artificiale (AI) care se ocupă cu analiza și procesarea limbajului natural, adică textul și vorbirea umană. NLP are o gamă largă de aplicații, cum ar fi traducerea automată, generarea de rezumate, analiza sentimentelor, chatbots și multe altele.

2. Introducere în bibliotecile spaCy și NLTK

spaCy și NLTK (Natural Language Toolkit) sunt două biblioteci populare de NLP pentru Python.

  • spaCy este o bibliotecă modernă, optimizată pentru performanță și ușurință în utilizare. spaCy vine cu modele pre-antrenate pentru diverse limbi și oferă funcționalități pentru preprocesarea textului, analiza sintactică, recunoașterea entităților și multe altele.

  • NLTK este o bibliotecă mai veche, dar foarte puternică și cuprinzătoare, care oferă multe resurse lingvistice și funcționalități pentru analiza textului, generarea de texte și procesarea semnalelor.

Pentru a începe lucrul cu spaCy și NLTK, trebuie să le instalați:

pip install spacy
pip install nltk

3. Preprocesarea textului cu spaCy și NLTK

Preprocesarea este un pas esențial în majoritatea problemelor de NLP, care implică curățarea și pregătirea textului înainte de a fi analizat sau utilizat pentru a antrena modele.

3.1. Tokenizarea

Tokenizarea implică împărțirea textului în unități mai mici, cum ar fi cuvintele și punctuația.

Tokenizare cu spaCy:

python
import spacy

nlp = spacy.load('en_core_web_sm')
text = "This is an example sentence."
doc = nlp(text)

tokens = [token.text for token in doc]
print(tokens)

Tokenizare cu NLTK:

python
import nltk
from nltk.tokenize import word_tokenize

nltk.download('punkt')
text = "This is an example sentence."
tokens = word_tokenize(text)
print(tokens)

3.2. Eliminarea stopwords

Stopwords sunt cuvinte comune care nu contribuie semnificativ la sensul unei propoziții, cum ar fi „the”, „and”, „is”, etc.

Eliminarea stopwords cu spaCy:

python
from spacy.lang.en.stop_words import STOP_WORDS

filtered_tokens = [token for token in tokens if token.lower() not in STOP_WORDS]
print(filtered_tokens)

Eliminarea stopwords cu NLTK:

python
from nltk.corpus import stopwords

nltk.download('stopwords')
stop_words = set(stopwords.words('english'))
filtered_tokens = [token for token in tokens if token.lower() not in stop_words]
print(filtered_tokens)

3.3. Stemming și Lemmatization

Stemming și Lemmatization sunt tehnici de normalizare a cuvintelor care reduc cuvintele la forma lor de bază.

Lemmatization cu spaCy:

python
lemmas = [token.lemma_ for token in doc]
print(lemmas)

Stemming cu NLTK:

python
from nltk.stem import PorterStemmer

stemmer = PorterStemmer()
stems = [stemmer.stem(token) for token in tokens]
print(stems)

4. Analiza limbajului natural și extragerea informațiilor

4.1. Part-of-speech (POS) tagging

POS tagging implică atribuirea categoriilorgramaticale (substantiv, verb, adjectiv etc.) cuvintelor dintr-o propoziție.

POS tagging cu spaCy:

python
pos_tags = [(token.text, token.pos_) for token in doc]
print(pos_tags)

POS tagging cu NLTK:

python
nltk.download('averaged_perceptron_tagger')
pos_tags = nltk.pos_tag(tokens)
print(pos_tags)

4.2. Recunoașterea entităților numite (Named Entity Recognition, NER)

NER este procesul de identificare și clasificare a entităților din text, cum ar fi nume de persoane, organizații, locuri, date etc.

NER cu spaCy:

python
entities = [(ent.text, ent.label_) for ent in doc.ents]
print(entities)

NER cu NLTK:

python
nltk.download('maxent_ne_chunker')
nltk.download('words')
tree = nltk.ne_chunk(pos_tags)
entities = [tuple(reversed(entity)) for entity in tree if hasattr(entity, 'label')]
print(entities)

4.3. Analiza sintactică (Parsing)

Analiza sintactică implică identificarea structurii gramaticale a unei propoziții și construirea unui arbore de analiză.

Parsing cu spaCy:

python
for token in doc:
    print(f"{token.text}t{token.dep_}t{token.head.text}")

Parsing cu NLTK:

python
nltk.download('punkt')
nltk.download('maxent_ne_chunker')
nltk.download('words')
nltk.download('averaged_perceptron_tagger')

from nltk.parse import RecursiveDescentParser
from nltk.grammar import CFG

grammar = """
S -> NP VP
NP -> Det N | Det N PP
VP -> V NP | VP PP
PP -> P NP
Det -> 'a' | 'an' | 'the'
N -> 'girl' | 'school' | 'book'
V -> 'saw' | 'gave'
P -> 'in' | 'to'
"""

cfg = CFG.fromstring(grammar)
rd_parser = RecursiveDescentParser(cfg)
tree = list(rd_parser.parse(tokens))[0]
tree.pretty_print()

5. Aplicații practice ale NLP

5.1. Analiza sentimentelor

Analiza sentimentelor implică determinarea sentimentului sau emoției exprimate într-un text (de exemplu, pozitiv, negativ sau neutru).

python
import spacy
from spacy import displacy

nlp = spacy.load('en_core_web_sm')
text = "I love this product! It's amazing."
doc = nlp(text)

sentiment = doc.sentiment
print(sentiment)

displacy.serve(doc, style='ent')

5.2. Rezumarea textului

Rezumarea textului implică generarea unui rezumat scurt și concis al unui text mai lung.

python
from nltk.tokenize import sent_tokenize
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np

def summarize(text, n_sentences=3):
    sentences = sent_tokenize(text)
    vectorizer = TfidfVectorizer(stop_words='english')
    X = vectorizer.fit_transform(sentences)
    sentence_scores = cosine_similarity(X, X).sum(axis=1)
    top_sentence_indices = np.argsort(sentence_scores)[-n_sentences:]
    summary = ' '.join([sentences[i] for i in sorted(top_sentence_indices)])
    return summary

text = """
Your long text here...
"""

summary = summarize(text)
print(summary)

5.3. Traducerea automată

Traducerea automată implică traducerea textului dintr-o limbă în alta.

python
from googletrans import Translator

translator = Translator()
text = "Bonjour tout le monde!"
translated = translator.translate(text, src='fr', dest='en')
print(translated.text)

Acestea sunt doar câteva exemple de aplicații practice ale NLP. Cu spaCy și NLTK, puteți aborda o gamă largă de probleme și proiecte de NLP.