Algorytm generowania podsumowań
Jak Radar Informacji agreguje, klasyfikuje i podsumowuje wiadomości z sieci
Pobieranie wiadomości
Codziennie system pobiera wiadomości ze stron internetowych. Dla każdego artykułu stosuje model językowy google/gemma-3-12b-it (lokalnie uruchomiony, Hugging Face) do wygenerowania podsumowania w języku polskim. Polaryzację (sentyment) detektuje model radlab/polarity-3c (Hugging Face). Rezultatem jest zestaw sformatowanych artykułów wraz z metadanymi (język, PLI, polaryzacja, źródło, URL).
Eksport do formatu JSONL
Pobrane artykuły są konwertowane do formatu JSONL — jedna linia na artykuł z dwoma głównymi polami: tekstem artykułu oraz metadanymi.
| Pole | Opis |
|---|---|
text |
Podsumowanie artykułu wygenerowane przez model LLM |
metadata.language |
Język rozpoznany dla artykułu |
metadata.pli_value |
Wartość Plain Language Index (PLI) — indeks prostego języka |
metadata.polarity_3c |
Polaryzacja w 3 klasach: positive, negative, ambivalent (model radlab/polarity-3c) |
metadata.source |
URL głównej strony (domena źródłowa) |
metadata.news_url |
Bezpośredni URL artykułu |
Wektoryzacja (Embedding)
Każdy tekst jest konwertowany na wektor w 512-wymiarowej przestrzeni za pomocą modelu Sentence-Transformers (bi-encoder). Przed enkodowaniem teksty są przycinane do 508 tokenów (512 − 4 dla tokenów specjalnych). Encodowanie odbywa się partiami po 500 elementów z L2-normalizacją:
Redukcja wymiarowości
Wysokowywymiarowe wektory są redukowane do 2 wymiarów przy użyciu t-SNE (t-Distributed Stochastic Neighbor Embedding) z optymalizatorem Barnes-Hut lub alternatywnie UMAP. Redukcja umożliwia wizualizację i efektywniejsze klasteryzowanie w niskowymiarowej przestrzeni.
| Parametr | Wartość |
|---|---|
device | cuda (GPU) |
embedder_path | article-bi-encoder-20240901 |
reduction | tsne (Barnes-Hut) |
reducer_sim_metric | cosine |
use_reduced_dataset | true (klasteryzacja na zredukowanych wektorach 2D) |
Klasteryzacja HDBSCAN*
Na zredukowanych wektorach uruchamiany jest algorytm HDBSCAN (Hierarchical Density-Based Spatial Clustering). System testuje 32 konfiguracje parametrów — od min_cluster_size=5 do 60 — i wybiera najlepszą kombinację hiperparametrów klastrowania metodą elbow selection:
- Odrzuca wyniki z liczbą klastrów spoza zakresu
[min=25, opt=35, max=45] - Wśród pozostałych wybiera najbliższy
opt_cluster_count(35) - W przypadku remisu — preferuje wynik z mniejszą liczbą punktów outlierowych (label
-1)
| Parametr | Wartość |
|---|---|
method | hdbscan |
metric | euclidean |
min_samples | 1 |
min_cluster_size | 5–60 (32 wartości) |
n_runs_per_param | 2 |
min_cluster_count | 25 |
opt_cluster_count | 35 |
max_cluster_count | 45 |
Generowanie etykiet (Label Generation)
Dla każdego klastra wygenerowana zostaje etykieta (tytuł) za pomocą modelu GenAI (LLM). Do generowania zostaje przekazana reprezentatywna próba newsów dla danej grupy. Model rozpoznaje wspólny temat i generuje krótki, zwięzły tytuł w języku polskim.
Generowanie artykułów podsumowujących
Dla każdego klastra generowany jest artykuł podsumowujący — syntetyczny tekst łączący informacje z wielu źródeł. Proces obejmuje:
- Przekazanie do modelu GenAI losowej próbki tekstów z klastra
- Generowanie syntetycznego artykułu (typ. ~700 znaków)
- Weryfikacja poprawności (check_spelling = true)
Każdy artykuł podsumowujący jest oznaczony metadanymi: dominantą polaryzacji (sentyment), liczbą artykułów, domeny źródłowe oraz wartość PLI.
Obliczanie podobnych dni (Similar Days)
Aby pokazać, które dni były podobne do bieżącego, system porównuje podsumowania klastrów między dniami za pomocą cosine similarity na wektorach wygenerowanych modelem article-bi-encoder-20240901. Dla każdego klastra znajduje top-4 najbardziej podobnych klastrów z poprzedniego/następnego dnia:
Wzór oblicza kąt między dwoma wektorami — wynik 1 oznacza identyczny kierunek (maksymalna podobność), 0 — ortogonalność (brak podobieństwa).
Źródła implementacji
- Klasterer: radlab-dev-group/clusterer (HDBSCAN\*, t-SNE/UMAP, Sentence-Transformers)
- Skrypt cron:
generate_articles_for_yesterday.py(radlab-dev-group/radlab-playground-creator) - Embedding: Sentence-Transformers (bi-encoder, L2-normalizacja)
- Polaryzacja: radlab/polarity-3c (3 klasy: positive, negative, ambivalent)
- Model klasterujący: HDBSCAN\* (Campello et al., 2013)
- Redukcja wymiarowości: t-SNE (van der Maaten & Hinton, 2008) / UMAP (McInnes et al., 2018)