# Dokumentacja Grafy vs podstawowe metody do klasyfikacji Fake News
## Spis treści
1. [Ogólne założenia projektu](#ogólne-założenia-projektu)
2. [Zawartość dokumentacji](#zawartość-dokumentacji)
3. [Co znajduje się w repozytorium](#co-znajduje-się-w-repozytorium---fakenewsnlp)
4. [Komendy serwer Emag](#jak-uruchomić-kod-na-maszynce---komendy-serwer-emag)
5. [Jak korzystać z ClearML](#jak-korzystać-z-clearml)
6. [Metody tworzące grafy](#metody-tworzące-grafy)
7. [Opis Tabeli porównującej Grafy](#opis-tabeli-porównującej-grafy-z-poszczególnych-metod)
8. [Opis Threshold dla każdej metody](#opis-threshold-dla-każdej-metody)
---
## Ogólne założenia projektu
Projekt służy do porównania metod bazowych z metodami opartymi na budowie grafów w problemie klasyfikacji **Fake Newsów**, początkowo na bazie danych **LIAR**, a następnie na bazie **ISOT**.
Baza danych **LIAR** okazała się źle oznaczona, co skutkowało bardzo niskimi wynikami dla wszystkich metod.
Baza danych **ISOT** okazała się lepszym wyborem, ponieważ została poprawnie oznaczona przez jej twórców.
W większości przypadków **metody podstawowe** okazały się lepsze od metod opartych na grafach.
Ostatecznie projekt skupił się na porównaniu różnych metod budowania grafów przy użyciu następujących metryk:
- **Coverage Score** – gloss recall względem źródła
- **Entropy / Diversity ROUGE-1** – najlepszy wynik ROUGE
- **Jaccard Similarity**
- **Precision / Recall / F1** na poziomie tokenów
- **chrF++** – Character F-score
- **Token Accuracy**
- **Levenshtein Distance** – Edit Distance
- **BLEU** – Bilingual Evaluation Understudy
Wyniki można zobaczyć w tabelach porównawczych, opisanych poniżej.
**Miłej zabawy! :)**
---
## Zawartość dokumentacji
Dokumentacja zawiera:
- Instrukcje korzystania z **serwera**, **GitHub** i **ClearML**
- Wyjaśnienie kodu
- Opis działania metod budowania grafów
- Interpretację wyników porównania powyższych metod
---
## Co znajduje się w Repozytorium - FakeNewsNLP?
Branches:
- [main](https://github.com/Badacze/FakeNewsNLP/tree/main) – Notebook zawierający szablon z preprocessingiem i ClearML
- [BagOfWords](https://github.com/Badacze/FakeNewsNLP/tree/BagOfWords) – metoda Bag of Words
- [Bert](https://github.com/Badacze/FakeNewsNLP/tree/Bert) – metoda BERT
- [NER-AI](https://github.com/Badacze/FakeNewsNLP/tree/NER-AI) – metoda NER-AI
- [TF-IDF](https://github.com/Badacze/FakeNewsNLP/tree/TF-IDF) – metoda TF-IDF
- [Word2Vec](https://github.com/Badacze/FakeNewsNLP/tree/Word2Vec) – metoda Word2Vec
- [graph-tool](https://github.com/Badacze/FakeNewsNLP/tree/graph-tool) – grafy
- [maszynka](https://github.com/Badacze/FakeNewsNLP/tree/maszynka) – metody grafowe na serwerze
*(pełny opis w oryginalnym dokumencie)*
---
## Jak uruchomić kod na maszynce? - Komendy serwer Emag
Maszynka postawiona jest na Ubuntu, więc warto znać podstawowe komendy z basha.
#### SSH
```bash
ssh user@adres_IP
ssh ai@10.255.145.217
```
- odpalanie skryptów
``` bash
nohup python3 skrypt.py > output.log 2>&1 &
```
nohup - działanie po wyjsciu z ssh
">" - przekierowanie wyjścia i/lub błędów do pliku
& - działanie w tle
- monitorowanie procesów
``` bash
htop - wszystkie
ntop - jeśli używa grafy
ps aux | grep python - wyłapanie procesów pythona np. żeby zabić jakis po pid
```
- podgląd pliku na bieżąco
``` bash
tail -f log.txt
```
## Jak korzystać z ClearML?
### 1. Wprowadzenie
ClearML to platforma, która umożliwia między innymi:
- rejestrowanie metryk,
- logów,
- porównywanie modeli,
- zarządzanie danymi,
- orkiestrację treningów na wielu maszynach.
W naszym projekcie używamy ClearML do śledzenia treningów modeli, porównywania wyników różnych eksperymentów oraz przechowywania zbiorów danych.
---
### 2. Instalacja ClearML
Dokumentacja: https://clear.ml/docs/latest/docs/clearml_sdk/clearml_sdk_setup
Poradnik w wersji video:
https://youtu.be/s3k9ntmQmD4?si=tqWpVcWaGwF_vLr8
**Instalacja paczki ClearML**
W terminalu naszego środowiska (np. PyCharm) lub systemowym (Linux, macOS) pobieramy paczkę komendą:
```bash
pip install clearml
```
**Konfiguracja**
Po udanej instalacji paczki przechodzimy do konfiguracji ClearML. W terminalu wpisujemy:
```bash
clearml-init
```
Jeśli tworzymy konfigurację po raz pierwszy to zostaniemy poproszeni o wklejenie **credentials** w terminalu. Aby to zrobić należy wykonać następujące kroki:
1. W prawym górnym rogu ekranu kliknij ikonę profilu, następnie przejdź do **Settings**

2. Przechodzimy do zakładki **Workspace** i klikamy **Create new credentials**

3. Kopiujemy **credentials** i przeklejamy do konsoli
---
### 3. Obsługa
#### 1. Logowanie
W celu zalogowania się do naszego panelu ClearML wchodzimy na stronę: https://app.clear.ml/login
Z metod logowania wybieramy **"Continue with Email"**

**Logujemy się za pomocą:**
**Login:** `badacze@interia.pl`
**Hasło:** `Uk8d67*g3WNn5PH3$A3j`
#### 2. Zarządzanie danymi
**Dokumentacja:**
Zarządzanie danymi: https://clear.ml/docs/latest/docs/getting_started/data_management
Funkcje w zakładce **Datasets**
https://clear.ml/docs/latest/docs/webapp/datasets/webapp_dataset_page,
https://clear.ml/docs/latest/docs/webapp/datasets/webapp_dataset_viewing
Poradnik video: https://youtu.be/S2pz9jn26uI?si=bEXPSSCnUN13iAYk
Zakładkę **Datasets** znajdziemy na pasku po lewej stronie ekranu:

Po wybraniu dodanego wcześniej datasetu możemy wyświetlić jego szczegóły zmieniając widok na górnym pasku:

Następnie naciskając przycisk **Details** mamy wgląd do informacji takich jak *ID datasetu*, jego *rozmiar* czy *przykładowe dane* ze zbioru.

Dane do eksperymentów pobieramy w kodzie bezpośrednio z ClearML zamiast z lokalnych plików. Dzięki temu wszyscy w zespole pracują na tych samych, wersjonowanych danych i łatwo można je udostępniać.
Kod odpowiedzialny za dataset:

Używane w kodzie ID wybranego datasetu możemy skopiować naciskając pole **"ID"** w jego szczegółach po prawej stronie ekranu:

#### 3. Projekty i eksperymenty
Poradnik video: https://youtu.be/bjWwZAzDxTY?si=8PxXUhKUzk0YONAS
Aby dostać się do naszych projektów i podglądu wykonywanych eksperymentów wchodzimy w zakładkę **Projects** na pasku z lewej strony ekranu:

Dla każdego projektu dostępne są proste statystyki takie jak:
- **TOTAL** - liczba wszystkich tasków znajdujących się w projekcie
- **RUNNING** - liczba aktualnie działających tasków
- **COMPLETED** - liczba tasków zakończonych sukcesem z ostatniej doby

Aby wejść do podglądu tasków wybieramy interesujący nas projekt (u nas **FakeNewsDetection**).
W zakładce **TASKS** po lewej stronie mamy listę wszystkich zadań:

Po wybraniu danego taska, mamy możliwość przechodzenia po zakładkach w celu analizy różnych danych w zależności co nas interesuje. Najważniejsze z zakładek to:
- **CONFIGURATION** - konfiguracja parametrów danego taska. Przydatne do wglądu np. gdy testujemy różne kombinacje parametrów.
- **INFO** - podstawowe informacje i szczegóły taska
- **CONSOLE** - logi z konsoli
- **SCALARS** - różne skalary takie jak wyniki modelu(np. accuracy, f1) lub zużycie zasobów maszyny
- **PLOTS** - bardziej rozbudowane wykresy działania modeli

Aby móc wyświetlać aktualną konfigurację, skalary czy wykresy trzeba najpierw ustawić w kodzie "logowanie" odpowiednich danych do ClearML.
Inicjalizacja taska i logowanie jego konfiguracji:

Config w panelu ClearML:

Istnieje również możliwość porównywania tasków ze sobą. Aby to zrobić należy zaznaczyć wybrane taski i na pasku który pojawi się w dolnej części ekranu nacisnąć **COMPARE**.


Teraz możemy porównać wartości zaznaczonych tasków takie jak wyniki na skalarach, konfiguracje i inne.
---
## Metody tworzące grafy
### 1. Coverage Score
Metoda coverage polega na mierzeniu pokrycia słów między dwoma tekstami.
• Z tekstu wybierane są tokeny spełniające warunki (np. tylko rzeczowniki i czasowniki, min. długość 3 znaki).
• Porównywane są dwa zbiory słów:
○ A – zbiór tokenów z tekstu pierwszego
○ B – zbiór tokenów z tekstu drugiego
Miara coverage określa, jaka część słów z jednego tekstu znajduje się w drugim.
Wzór
Coverage(A, B) = |A ∩ B| / |A|
Coverage(B, A) = |A ∩ B| / |B|
Coverage_sym(A, B) = max(Coverage(A, B), Coverage(B, A))
Przykład
Dokument A (fake):
"Trump says climate change is a hoax created by China."
→ {trump, say, climate, change, hoax, create, china}
Dokument B (real):
"China and US sign climate agreement on reducing emissions."
→ {china, us, sign, climate, agreement, reduce, emission}
Obliczenie coverage
• Część wspólna: {china, climate}
• Coverage(A,B) = 2 / 7 ≈ 0.285
• Coverage(B,A) = 2 / 7 ≈ 0.285
• Coverage_sym = 0.285
Węzły = zdania/dokumenty.
Krawędź powstaje, gdy coverage_sym ≥ threshold.
Coverage dobrze sprawdza się w zadaniach typu fake news detection, ponieważ:
• ignoruje słowa nieistotne (stopwords, krótkie tokeny),
• koncentruje się na istotnych częściach mowy (rzeczowniki, czasowniki)
### 2. Diversity
Mierzy różnorodność słów (glossów) w tekście. Połączone dwie wypowiedzi są tokenizowane na pojedyncze słowa, a następnie oblicza się:
$$
\text{Diversity} = \frac{\text{liczba unikalnych glossów}}{\text{liczba glossów}}
$$
Wyższa wartość oznacza większą różnorodność słownictwa i mniej powtórzeń w tekście. W ostatniej wersji kodu zastosowano `1 - Diversity`, aby większa wartość odpowiadała większej powtarzalności słów w połączonym tekście.
### 3. Rouge 1
Metoda **ROUGE-1** tworzy graf podobieństwa między wypowiedziami, wykorzystując miarę ROUGE-1 jako miarę podobieństwa. Każda wypowiedź to węzeł, a krawędzie łączą te pary, których ROUGE-1 przekracza ustalony próg threshold (np. 0.3).
##### Budowa grafu ROUGE-1
1. Dla każdej pary wypowiedzi obliczana jest miara **ROUGE-1**, czyli pokrycie **unigramów**.
- Recall:
$$
\text{ROUGE-1}_{rec}(A, B) \;=\; \frac{|\text{tokens}(A) \cap \text{tokens}(B)|}{|\text{tokens}(A)|}
$$
- Precision:
$$
\text{ROUGE-1}_{prec}(A, B) \;=\; \frac{|\text{tokens}(A) \cap \text{tokens}(B)|}{|\text{tokens}(B)|}
$$
- F1-score:
$$
\text{ROUGE-1}_{F1}(A, B) \;=\; \frac{2 \cdot \text{ROUGE-1}_{prec}(A, B) \cdot \text{ROUGE-1}_{rec}(A, B)}{\text{ROUGE-1}_{prec}(A, B) + \text{ROUGE-1}_{rec}(A, B)}
$$
3. Wynik mieści się w przedziale [0,1] i określa stopień podobieństwa dwóch zdań na podstawie unigramów.3. Wynik ROUGE-1 może być mierzony na trzy sposoby: recall, precision lub F1-score.W praktyce najczęściej stosuje się **recall** lub **F1-score** jako ostateczną wartość podobieństwa (wagę krawędzi w grafie).
### 4. Jaccard Similarity
Metoda Jaccard Similarity tworzy graf podobieństwa między dokumentami, traktując je jako zbiory słów (tokenów). Dla każdej pary dokumentów obliczany jest współczynnik Jaccarda:
$$
J(A, B) = \frac{|A \cap B|}{|A \cup B|}
$$
gdzie:
A, B – zbiory słów z dwóch dokumentów,
Wartość mieści się w przedziale [0,1], gdzie 0 oznacza brak wspólnych słów, a 1 – pełną zgodność. Krawędzie w grafie są tworzone tylko wtedy, gdy podobieństwo Jaccarda przekracza ustalony próg threshold (np. 0.1–0.3).
#### Budowa grafu Jaccard
1. Tokenizacja dokumentów na słowa.
2. Tworzenie zbiorów tokenów (bez duplikatów).
3. Obliczanie wartości Jaccarda dla każdej pary.
4. Dodanie krawędzi, jeśli wynik ≥ threshold.
#### Cechy metody
- Prosta i intuicyjna, łatwa w interpretacji.
- Niezależna od kolejności słów.
- Wrażliwa na długość dokumentów i brak analizy semantycznej (różne słowa o podobnym znaczeniu traktowane są jako odmienne).
### 5. F1 na poziomie tokenów
Metoda F1 tworzy graf podobieństwa między **zdaniami/wypowiedziami**, wykorzystując **F1-score na poziomie tokenów** jako miarę podobieństwa. Każda wypowiedź/zdanie to **węzeł**, a krawędzie łączą te pary, których F1 przekracza ustalony próg ``threshold``(np. 0.4). Wagi krawędzi odpowiadają wartości prawdopodobieństwa.
Podczas predykcji wybierane są najbardziej podobne wypowiedzi z grafu, a do głosowania więkoszściowego uwzględnia się tylko sąsiadów, których podobieńśtwo spełnia dodatkowy próg ``predict_threshold`` (np. 0.3). Na tej podstawie ustalana jest etykieta FAKE/TRUE.
#### Metoda F1 - budowa grafu
1. Każda wypowiedź jest tokenizowana (dzielona na słowa)
2. Dla każdej pary wypowiedzi obliczany jest F1-score na poziomie tokenów:
- *Precison* = ile tokenów wypowiedzi A znajduje się w wypowiedzi B =
***wspólne tokeny / liczba tokenów w pierwszej wypowiedzi***,
- *Recall* = ile tokenów z wypowiedzi B znajduje się w wypowiedzi
***wspólne tokeny / liczba tokenów w drugiej wypowiedzi***
- *F1* = średnia harmoniczna Precision i Recall
***2 * precision * recall / (precision + recall)***.
### 6. chrF++
Metoda **chrF++** tworzy graf podobieństwa między wypowiedziami, wykorzystując miarę chrF++ jako miarę podobieństwa. Każda wypowiedź to węzeł, a krawędzie łączą te pary, których chrF++ przekracza ustalony próg threshold (np. 0.3).
##### Budowa grafu chrF++
1. Każda wypowiedź jest tokenizowana na **n-gramy znakowe i wyrazowe**.
2. Dla każdej pary wypowiedzi obliczany jest wynik chrF++ jako ważona średnia F-skorów:
$$
\text{chrF++}(A,B) \;=\; (1 - \beta) \cdot P_{chr} \;+\; \beta \cdot R_{chr}
$$
gdzie:
- **P_chr** – precyzja n-gramów (znakowych i wyrazowych)
- **R_chr** – recall n-gramów (znakowych i wyrazowych)
- **β** – współczynnik równoważący precision/recall
3. Wynik mieści się w przedziale [0,1] i określa stopień podobieństwa dwóch zdań.
### 7. Token Accuracy
Metoda **Token Accuracy** tworzy graf podobieństwa między wypowiedziami, wykorzystując dokładność tokenową jako miarę podobieństwa. Każda wypowiedź to węzeł, a krawędzie łączą te pary, których Token Accuracy przekracza ustalony próg threshold (np. 0.3). Wagi krawędzi odpowiadają wartości podobieństwa.
Podczas predykcji wybierane są najbardziej podobne wypowiedzi z grafu, a do głosowania większościowego uwzględnia się tylko sąsiadów, których podobieństwo spełnia dodatkowy próg predict_threshold (np. 0.3). Na tej podstawie ustalana jest etykieta FAKE/TRUE.
##### Budowa grafu Token Accuracy
1. Każda wypowiedź jest tokenizowana (dzielona na słowa).
2. Dla każdej pary wypowiedzi obliczana jest dokładność tokenowa:
$$
\text{TokenAccuracy}(A, B) \;=\; \frac{\text{liczba wspólnych tokenów}}{\max(A,B)}
$$
3. Wynik mieści się w przedziale [0,1] i określa stopień podobieństwa dwóch zdań.
### 8. Levenshtein Distance
**Levenshtein Distance** (znany również jako **Edit Distance**) to miara określająca, jak bardzo dwa łańcuchy znaków (słowa, zdania) różnią się od siebie. Konkretnie, definiuje minimalną liczbę pojedynczych operacji edycji niezbędnych do przekształcenia jednego ciągu znaków w drugi.
**Zasada działania:**
1.Stworzenie dwuwymiarowej macierzy o wymiarach i x j
- i - długość pierwszego łańcucha znaków + 1
- j - długość drugiego łańcucha znaków + 1
2.Uzupełnienie pierwszego wiersza wartościami od 0 do i, i pierwszej kolumny wartościami od 0 do j:
| | * | k | i | t |
| --- | --- | --- | --- | --- |
| * | 0 | 1 | 2 | 3 |
| k | 1 | | | |
| o | 2 | | | |
| t | 3 | | | |
3.Wypełnienie macierzy według wzoru: M[i][j] = min(M[i-1][j] + 1, M[i][j-1] + 1, M[i-1][j-1] + koszt)
koszt - 0 jak znaki są takie same, 1 jak są inne
**Przykładowa macierz:**
| | * | k | i | t |
| --- | --- | --- | --- | --- |
| * | 0 | 1 | 2 | 3 |
| k | 1 | 0 | 1 | 2 |
| o | 2 | 1 | 1 | 2 |
| t | 3 | 2 | 2 | <font color="#FF0000">1</font> |
**Obliczony dystans:** 1 (Ostatni element macierzy)
### 9. BLEU (Bilingual Evaluation Understudy)
**BLEU** mierzy, jak bardzo tłumaczenie maszynowe przypomina tłumaczenie referencyjne.
#### Jak działa?
1. Dzielimy tekst na **n-gramy** (ciągi słów).
2. Liczymy **precyzję n-gramów**:
$$
P_n = \frac{\text{dopasowane n-gramy}}{\text{wszystkie n-gramy w tłumaczeniu}}
$$
3. Dodajemy **karę za długość**:
$$
BP = \begin{cases}
1 & \text{jeśli } c > r \\
e^{(1-r/c)} & \text{jeśli } c \leq r
\end{cases}
$$
gdzie \(c\) – długość tłumaczenia, \(r\) – długość referencyjna.
4. Wynik końcowy:
$$
BLEU = BP \cdot \exp\left(\frac{1}{N}\sum_{n=1}^N \log P_n\right)
$$
---
#### Przykład
- **Referencja:** `the cat is on the mat`
- **Tłumaczenie:** `the cat is on mat`
**1-gramy dopasowane:** 4/5
**2-gramy dopasowane:** 3/4
$$
P_1 = 0.8, \quad P_2 = 0.75
$$
**Średnia (N=2):**
$$
\exp\left(\tfrac{1}{2}(\log 0.8 + \log 0.75)\right) \approx 0.77
$$
**Kara za długość (c=5, r=6):**
$$
BP = e^{(1-6/5)} \approx 0.82
$$
**BLEU:**
$$
0.77 \times 0.82 \approx 0.63
$$
---
## Opis Tabeli porównującej Grafy z poszczególnych metod
Porównania grafów przy użyciu wskaźników Jaccard, liczby wspólnych krawędzi, podobieństwa krawędzi oraz odległości edycyjnej (GED) pokazują, że stopień podobieństwa między grafami jest zróżnicowany i silnie zależy od użytej metody.
### Metryki porównywania grafów
- **Jaccard (edge Jaccard similarity)**
Mierzy, jaka część krawędzi w dwóch grafach się pokrywa.
Oblicza się to jako stosunek liczby wspólnych krawędzi do liczby wszystkich krawędzi w obu grafach.
Wynik mieści się w przedziale [0,1]. Im bliżej **1**, tym grafy są bardziej podobne pod względem struktury.
- **Common_edges_number**
Liczba wspólnych krawędzi w obu grafach.
Im większa wartość, tym więcej relacji między węzłami powtarza się w obu grafach.
- **Edge_similarity**
Stosunek liczby wspólnych krawędzi do liczby krawędzi w **większym** z grafów.
Pokazuje, jak bardzo mniejszy graf „pokrywa się” z większym.
- **Edges_GED (Graph Edit Distance)**
Liczba zmian (dodanie/usunięcie krawędzi), które trzeba wykonać, aby jeden graf przekształcić w drugi.
Im mniejsza wartość, tym grafy są bardziej podobne.
### Opis poszczególnych porównań
**Najwyższe wartości podobieństwa Jaccarda** uzyskano dla par grafów opartych na metodach **Jaccard (0,1) i F1 (0,1)** – wartość współczynnika wyniosła **0,58**, co oznacza, że ponad połowa krawędzi w obu grafach się pokrywa. Wysokie podobieństwo zanotowano także dla pary **BLEU (0,15) i F1 (0,1) (0,53)** oraz **Jaccard (0,1) i ROUGE-1 (0,10) (0,51)**.
Z drugiej strony, **najniższe wartości Jaccarda** widoczne są dla porównań z grafem opartym na **Coverage Score**, np. z metodą **Diversity (0,4) (0,056)** czy **Levenshtein (0,07)**. Oznacza to, że te grafy mają bardzo mało wspólnych krawędzi i różnią się pod względem struktury.
Analiza wskaźnika **common_edges_number** potwierdza te obserwacje – najwięcej wspólnych krawędzi **(ponad 147 tys.)** zaobserwowano między grafami **Jaccard (0,1) i F1 (0,1)**, natomiast zdecydowanie mniej **(ok. 21 tys.)** między **Coverage Score i Levenshtein**.
Podobne wnioski wynikają z miary **edge_similarity** – największe podobieństwo **(ponad 0,72)** odnotowano dla grafów **Jaccard i F1**, natomiast najniższe **(ok. 0,09–0,10)** dla grafów **Coverage Score i Levenshtein lub Diversity**.
Odległość edycyjna **(edges_GED)** potwierdza, że najbardziej odmienne są grafy bazujące na **Coverage Score (konieczność dokonania ponad 390 tys. zmian)**, natomiast bliższe sobie są grafy tworzone metodami **Jaccard, F1 i BLEU (ok. 120–180 tys. zmian)**.
### Podsumowanie
Najbardziej zbliżone strukturalnie są grafy oparte na metodach **Jaccard, F1, BLEU i ROUGE**, natomiast największe różnice występują w porównaniach z grafami budowanymi na podstawie **Coverage Score i Diversity**, które tworzą bardziej odmienne i mniej gęste struktury.

- kod porównujacy znajduje sie na branchu "maszynka" w folderze GRAFY_PKL kod zostal zapisany jako csv oraz przekonwertowany do formalu xlsx ;)
## Opis Threshold dla każdej metody
**Threshold (próg)** to wartość graniczna, która decyduje, czy dane połączenie w grafie zostanie zachowane. Jeśli próg jest niski, w grafie zostaje wiele krawędzi (także słabszych). Jeśli próg jest wysoki, zostają tylko najmocniejsze i najbardziej pewne połączenia.
**Najczęstszym progiem używanym w metodach była wartość około 0,1**, odpowiadająca poziomowi bazowemu (baseline), przy której uzyskano **największą liczbę krawędzi w grafach**. Wraz ze wzrostem progu liczba krawędzi systematycznie malała, ponieważ coraz więcej połączeń było odrzucanych jako zbyt słabe. **Szczególnie wyraźny spadek widoczny jest od wartości 0,4** – przykładowo, w metodzie ROUGE-1 liczba krawędzi zmniejszyła się z ponad 179 000 (przy 0,3) do około 104 000 (przy 0,4), a w metodzie chrF++ z prawie 200 000 (przy 0,3) do około 110 000 (przy 0,4). Dalsze zwiększanie progu prowadzi do **gwałtownej redukcji liczby krawędzi** – np. w metodzie Jaccard przy progu 0,1 liczba krawędzi wynosiła prawie 200 000, natomiast przy 0,9 pozostało już tylko 236. Oznacza to, że **wyższe wartości threshold bardzo silnie ograniczają gęstość grafu**, pozostawiając wyłącznie najbardziej jednoznaczne i pewne powiązania. **Podsumowując, niższe progi prowadzą do powstawania dużych i gęstych grafów, a wyższe – do ich znacznego przerzedzenia**.

<br>

[Treshold porównawczy](https://docs.google.com/spreadsheets/d/1FY-BGqq0fRbTxlKTB5yIu76T4yqfEikQl0s3DMJgrCg/edit?gid=0#gid=0)
## Podsumowanie
W projekcie porównano **podstawowe metody klasyfikacji tekstu** z metodami opartymi na **grafach**. Analiza wykazała, że:
- **Metody bazowe** (np. TF-IDF, BERT, Bag of Words) w wielu przypadkach osiągały **wyższe wyniki** niż podejście grafowe.
- **Metody grafowe** są bardziej eksperymentalne, ale pozwalają lepiej zrozumieć **strukturę podobieństw między tekstami** i analizować zależności w danych.
- **Najbardziej spójne grafy** powstawały przy użyciu metod **Jaccard, F1, BLEU oraz ROUGE-1**, które dawały wysoką zbieżność krawędzi.
- **Metody Coverage i Diversity** tworzyły natomiast **bardziej odmienne grafy**, o mniejszej gęstości i słabszym pokryciu z innymi.
- Kluczowym parametrem w budowie grafów okazał się **threshold**, którego niskie wartości prowadziły do powstawania dużych i gęstych grafów, a wysokie – do ich radykalnego przerzedzenia.
Podsumowując, **grafy mogą być użytecznym narzędziem do analizy powiązań między dokumentami**, jednak wymagają starannego doboru metody oraz parametrów (np. threshold). W praktycznych zadaniach klasyfikacji Fake News lepsze rezultaty dawały **tradycyjne metody NLP**, natomiast podejście grafowe dostarczyło **cennych informacji strukturalnych**, które mogą być rozwijane w dalszych badaniach.