Evolució del PLN: de Bag of Words als LLMs
El Processament del Llenguatge Natural (PLN, o NLP de l'anglès Natural Language Processing) és la branca de la IA que s'ocupa de la interacció entre ordinadors i llenguatge humà. L'any 2025, el PLN ha viscut la revolució més gran de la seva història: els Large Language Models (LLMs) com GPT-4o, Claude 3.5 i Gemini 1.5 han demostrat capacitats que fa uns pocs anys semblaven impossibles — escriure codi, analitzar documents complexos, traduir entre idiomes, raona pas a pas o mantenir converses naturals durant hores.
Però per comprendre per què els LLMs funcionen tan bé (i per què fallen de les maneres que fallen), cal entendre l'evolució completa del camp: des dels primers models estadístics fins a l'arquitectura Transformer que ho ha canviat tot.
Per quin motiu el PLN és fonamental per al perfil IABD?
El 80% de les dades empresarials existents és text no estructurat: emails, informes, contractes, comentaris de clients, posts a xarxes socials, manuals tècnics. Saber processar, analitzar i extreure valor d'aquest text és una competència diferencial clau per a qualsevol professional de dades.
Abans de les dades: chatbots basats en regles
Molt abans dels models estadístics, els primers sistemes conversacionals (com ELIZA, 1966) no aprenien de dades: es limitaven a aplicar regles de coincidència de paraules clau escrites a mà. Un exemple simple —un bot meteorològic per a Blanes— es podria programar així:
def bot_meteo(missatge: str) -> str:
text = missatge.lower()
if "hola" in text or "salutacions" in text:
return "Salutacions, sóc un bot que dóna la predicció del temps a Blanes."
if "temps" in text or "predicció" in text:
return "La predicció del temps per demà a Blanes és assolellat, 22°C."
return "Ho sento, no t'entenc."
Aquest enfocament (idèntic en esperit als sistemes basats en regles del RA2) funciona bé per a un domini molt tancat, però és fràgil: "Fa molt de temps que no parlem" activaria per error la regla 2 perquè conté la paraula "temps". No hi ha manera d'entendre la intenció real darrere de les paraules —per això calia un canvi de paradigma cap a tècniques estadístiques i, més tard, neuronals.
Era estadística (1990-2010)
Bag of Words (BoW) El model més simple: representa un document com un vector de freqüències de paraules, ignorant l'ordre i el context. "El gat menja el ratolí" i "El ratolí menja el gat" produirien el mateix vector.
Limitació fonamental: perd tot el context i la semàntica.
TF-IDF (Term Frequency – Inverse Document Frequency) Millora el BoW pondero les paraules que apareixen sovint en un document (TF alta) però rarament en la col·lecció (IDF alta). Segueix ignorant el context però captura la "importància" de cada terme.
Aplicació típica: cerca de documents, classificació de spam, anàlisi de sentiment bàsica.
N-grames i Models de Markov En comptes de paraules individuals, es consideren seqüències de N paraules consecutives (bigrames, trigrames, etc.) per capturar una mica de context local. Base dels primers sistemes de reconeixement de veu i traducció automàtica estadística.
Era dels embeddings (2013-2017)
Word2Vec (Mikolov et al., Google, 2013) El salt qualitatiu: paraules similars semànticament ocupen posicions properes en un espai vectorial de alta dimensió (típicament 100-300 dimensions). L'entrenament és no supervisat sobre grans corpus de text.
La propietat més famosa:
Cada paraula és un punt en un espai de 300 dimensions. La distància (cosinus) entre punts reflexa similitud semàntica.
GloVe (Stanford, 2014): Similar a Word2Vec però entrenada sobre estadística global de co-ocurrències. Lleugerament millor en tasques analògiques.
fastText (Facebook AI, 2016): Embeddings de subparaules. Pot generar vectors per a paraules mai vistes durant l'entrenament. Molt millor per a idiomes morfològicament rics (català, alemany, turc).
Limitació fonamental: un embedding per paraula, independentment del context. La paraula "banc" té el mateix vector en "el banc del parc" que en "el banc m'ha denegat el crèdit".
Era dels models contextuals (2018-2019)
ELMo (Embeddings from Language Models, Allen Institute, 2018) Primer model que genera embeddings contextuals: el vector d'una paraula canvia depenent de les paraules que l'envolten. Usat com a capa d'embeddings en altres models.
BERT (Bidirectional Encoder Representations from Transformers, Google, 2018) Un punt d'inflexió. BERT entrena un Transformer bidireccional (llegeix el text en les dues direccions simultàniament) sobre dos objectius: 1. Masked Language Modeling (MLM): predir paraules ocultes (com omplir buits) 2. Next Sentence Prediction (NSP): predir si dos fragments de text són consecutius
El resultat: representacions contextuals riquíssimes. BERT va superar l'estat de l'art en 11 tasques NLP simultàniament en el moment de la seva publicació.
Variants de BERT: RoBERTa (Facebook, millors hiperparàmetres), DistilBERT (50% més petit, 97% del rendiment), ALBERT, DeBERTa, XLM-RoBERTa (multilingüe).
Era dels LLMs (2020-actualitat)
GPT-3 (OpenAI, 2020) — 175 mil milions de paràmetres El primer LLM a demostrar capacitats emergents de few-shot learning: podia realitzar tasques noves amb només 3-5 exemples en el prompt, sense reentrenament.
ChatGPT (OpenAI, novembre 2022) — basat en GPT-3.5 L'aplicació que va portar el PLN a les masses. Clau: entrenament amb RLHF (Reinforcement Learning from Human Feedback) per fer el model més útil, honest i inofensiu.
GPT-4 (OpenAI, març 2023) — multimodal, habilitats de raonament molt superiors.
Claude 3 / 3.5 (Anthropic, 2024): especial èmfasi en seguretat, instruccions llargues i raonament.
Gemini 1.5 Pro (Google DeepMind, 2024): context window d'1 milió de tokens, multimodal nativament.
LLaMA 3.1 (Meta, juliol 2024): fins a 405B paràmetres, obert per a recerca i ús comercial.
graph LR
BOW[Bag of Words 1990] --> TFIDF[TF-IDF 2000]
TFIDF --> W2V[Word2Vec 2013]
W2V --> ELM[ELMo 2018]
ELM --> BERT[BERT 2018]
BERT --> GPT2[GPT-2 2019]
GPT2 --> GPT3[GPT-3 2020]
GPT3 --> CHAT[ChatGPT 2022]
CHAT --> GPT4[GPT-4 2023]
GPT4 --> NOW[GPT-4o Claude Gemini 2024]
Preprocessament del text
Abans que un model pugui explotar un text, cal preprocessar-lo: transformar-lo en un format estandarditzat que redueixi el soroll i faciliti l'aprenentatge. Un projecte de PLN segueix típicament aquestes etapes: recollida de dades → preprocessament → exploració i visualització → construcció del model → avaluació.
graph LR
A[Recollida de dades] --> B[Preprocessament]
B --> C[Exploracio i visualitzacio]
C --> D[Construccio del model]
D --> E[Avaluacio del model]
Les tècniques de preprocessament més habituals són:
- Eliminació de soroll: treure text sobrant sense utilitat (signes de puntuació, caràcters especials, espais en blanc addicionals).
- Eliminació d'URLs i d'elements no verbals: hashtags, emoticones, adreces web que no aporten significat.
- Conversió a minúscules: evita que "Hola", "hola" i "HOLA" es tractin com tres paraules diferents.
- Eliminació de stop-words (paraules buides): elimina paraules molt freqüents i poc informatives ("el", "la", "de", "que"). Exemple: "la casa de la platja" → "casa platja".
- Tokenització: divideix el text en unitats més petites (paraules o frases). Exemple: "La gata menja peix." →
["La", "gata", "menja", "peix", "."]. - Normalització — stemming vs. lematització: dues tècniques per reduir una paraula a una forma base, però no són equivalents:
- Stemming: talla els sufixos de forma mecànica, sense garantir que el resultat sigui una paraula real. Exemple: "estic corrent" → "est corr".
- Lematització: aplica coneixement lingüístic (morfologia, POS) per retornar la forma canònica (el lema) de la paraula. Exemple: "estic corrent" → "estar córrer".
- Vocabulari: elimina paraules duplicades i construeix el lèxic (vocabulari) sobre el qual es basaran les representacions numèriques.
- Vectorització: converteix el text en representació numèrica, des de l'enfoc més simple (one-hot encoding) fins als embeddings vistos més amunt (apartat «Era dels embeddings»).
# Pipeline de preprocessament bàsic amb spaCy (model català)
# pip install spacy && python -m spacy download ca_core_news_sm
import spacy
nlp = spacy.load("ca_core_news_sm")
def preprocessar(text: str) -> list[str]:
doc = nlp(text.lower())
return [
token.lemma_
for token in doc
if not token.is_stop and not token.is_punct and not token.is_space
]
text = "La casa de la platja estava molt a prop del mar!"
print(preprocessar(text))
# ['casa', 'platja', 'estar', 'molt', 'prop', 'mar']
El preprocessament no sempre és desitjable
Els LLMs moderns (GPT-4o, Claude, Gemini) no necessiten gairebé cap preprocessament manual: el seu propi tokenitzador BPE i el seu entrenament massiu gestionen majúscules, puntuació i stop-words de forma implícita. El preprocessament clàssic continua sent imprescindible per a tècniques estadístiques (BoW, TF-IDF, LDA) i per a models petits entrenats des de zero.
Modelatge de temes: Assignació Latent de Dirichlet (LDA)
L'Assignació Latent de Dirichlet (LDA, Latent Dirichlet Allocation), creada el 2003 per David Blei, Andrew Ng i Michael Jordan, és un model generatiu no supervisat molt utilitzat per a l'extracció de temes i l'agrupació de documents.
LDA assumeix que:
- Cada document és una barreja de diversos temes latents (no observats directament).
- Cada tema no és més que una distribució de probabilitat sobre paraules del vocabulari.
- L'aparició de cada paraula en un document es deu a un dels temes als quals pertany el document.
El model tracta les paraules com una bossa de paraules (sense ordre ni context), igual que el BoW vist a l'apartat «Era estadística»: per a LDA, "l'Àlex li fa un regal al Pau" i "el Pau li fa un regal a l'Àlex" són equivalents. Aquesta simplicitat és alhora la seva limitació (perd matisos semàntics) i el seu punt fort (és ràpid i interpretable per a classificar grans col·leccions de documents).
# Extracció de 3 temes d'un conjunt de documents amb scikit-learn
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation
documents = [
"El Bota va guanyar el partit de futbol amb un gol decisiu",
"El nou entrenador ha fitxat dos jugadors per a la davantera",
"El pacient va rebre el diagnòstic després de la ressonància",
"L'hospital ha incorporat un nou escàner per a diagnòstics precoços",
"El govern aprova el pressupost per a l'any vinent",
"El ministre presenta la nova llei de pressupostos generals",
]
vectorizer = CountVectorizer(stop_words=None, max_features=1000)
matriu_dtm = vectorizer.fit_transform(documents)
lda = LatentDirichletAllocation(n_components=3, random_state=42)
lda.fit(matriu_dtm)
paraules = vectorizer.get_feature_names_out()
for i, tema in enumerate(lda.components_):
top_paraules = [paraules[j] for j in tema.argsort()[-5:][::-1]]
print(f"Tema {i}: {', '.join(top_paraules)}")
Casos d'ús típics de LDA: classificació automàtica de notícies per secció (esports, salut, política), descoberta de temes recurrents en enquestes de satisfacció obertes, o organització d'una col·lecció de documents interns sense etiquetar prèviament.