Notifications
Clear all
oct. 17, 2025 12:14 pm
Explicaţie pas cu pas a scriptului „Claim‑Review Pipeline”
Mai jos găseşti o descriere detaliată a fiecărui bloc de cod, a scopului său și a bibliotecilor utilizate. Am păstrat ordinea cronologică a execuţiei, astfel încât să poţi înţelege cum se trece de la un articol brut la un fişier JSON‑LD cu obiecte ClaimReview.
1️⃣ Importuri & configurare iniţială
| Linie | Bibliotecă | Scop |
|---|---|---|
import json |
json (standard) | Serializare / deserializare JSON. |
import pandas as pd |
pandas | Manipulare tabelară a datelor (DataFrame). |
from tqdm import tqdm |
tqdm | Bară de progres pentru bucla for. |
import requests |
requests | Apeluri HTTP (Wikidata, Google Fact‑Check). |
from datetime import datetime |
datetime | Generare timestamp pentru numele fişierului de ieşire. |
import os (eventual) |
os | Gestionare căi de fişier, dacă este folosit. |
Notă: Dacă nu ai instalat
pandas,tqdmsaurequests, le poţi adăuga cupip install pandas tqdm requests.
2️⃣ Configurarea variabilelor globale
ARTICLE_URL = " https://exemplu.ro/articol.html"
WIKIDATA_ENDPOINT = " https://www.wikidata.org/w/api.php"
GOOGLE_FACTCHECK_ENDPOINT = " https://factchecktools.googleapis.com/v1alpha1/claims:search"
GOOGLE_API_KEY = "YOUR_GOOGLE_API_KEY"
ARTICLE_URL– adresa web a articolului pe care îl vom analiza.WIKIDATA_ENDPOINT– endpoint‑ul API‑ului Wikidata (folosit pentru interogări SPARQL / căutare de entităţi).GOOGLE_FACTCHECK_ENDPOINT– endpoint‑ul Google Fact‑Check Tools (necesită cheia API).GOOGLE_API_KEY– cheia personală pentru a accesa Google Fact‑Check API.
3️⃣ Funcţia wikidata_check(claim)
def wikidata_check(claim: str) -> dict | None:
# Construieşte interogarea SPARQL pentru a căuta claim‑ul în Wikidata
query = f"""
SELECT ?item WHERE {{
?item ?label "{claim}"@en .
}}
LIMIT 1
"""
params = {"action": "query", "format": "json", "list": "search", "srsearch": claim}
resp = requests.get(WIKIDATA_ENDPOINT, params=params, timeout=10)
if resp.ok:
data = resp.json()
if data.get("search"):
return data["search"][0] # returnează primul rezultat găsit
return None
- Scop: Verifică dacă afirmaţia (
claim) există ca entitate în Wikidata. - Ce face: Trimite o cerere GET cu parametrii de căutare; dacă există rezultate, returnează primul (dicţionar cu
title,snippet,urletc.). Dacă nu, returneazăNone. - Observaţii: În codul original se poate folosi SPARQL, dar aici se foloseşte metoda
searchsimplificată.
4️⃣ Funcţia google_factcheck_check(claim)
def google_factcheck_check(claim: str) -> dict | None:
params = {
"query": claim,
"key": GOOGLE_API_KEY,
"languageCode": "ro", # limba română
}
resp = requests.get(GOOGLE_FACTCHECK_ENDPOINT, params=params, timeout=10)
if resp.ok:
data = resp.json()
if data.get("claims"):
return data["claims"][0] # primul claim găsit în Google Fact‑Check
return None
- Scop: Caută afirmaţia în baza de date Google Fact‑Check.
- Ce face: Trimite o cerere GET cu
query= claim și cheia API. Dacă există rezultate, returnează primul obiectclaim(conţine rating, URL, etc.). - Important: Pentru a funcţiona trebuie să ai un cont Google Cloud și să activezi API‑ul Fact Check Tools.
5️⃣ Funcţia build_claimreview(...)
def build_claimreview(
claim: str,
rating: str,
review_url: str,
author_name: str,
publisher_name: str,
) -> dict:
return {
"@type": "ClaimReview",
"datePublished": datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ"),
"url": review_url,
"author": {"@type": "Organization", "name": author_name},
"publisher": {"@type": "Organization", "name": publisher_name},
"claimReviewed": claim,
"reviewRating": {
"@type": "Rating",
"ratingValue": rating,
"bestRating": "True",
"worstRating": "False",
},
}
- Scop: Construieşte un obiect JSON‑LD conform specificaţiei
ClaimReviewdin schema.org. - Câmpuri cheie:
@type: tipul schema (ClaimReview).datePublished: data curentă în format ISO‑8601 (UTC).url: link‑ul către sursa de verificare (Wikidata sau Google Fact‑Check).author&publisher: informaţii despre entitatea care a făcut verificarea.claimReviewed: textul afirmaţiei originale.reviewRating: ratingul (ex."True","False"sau"Unrated").bestRating/worstRatingsunt setate pentru a indica ce valoare reprezintă adevărat/fals.
6️⃣ Funcţia main()
def main():
# 1️⃣ Citeşte articolul și extrage claim‑urile
df_claims = pd.read_csv("claims.csv") # sau orice altă sursă de date
claimreview_items = []
# 2️⃣ Parcurge fiecare claim cu bară de progres
for _, row in tqdm(df_claims.iterrows(),
total=len(df_claims),
desc="Verificare claim‑uri"):
claim = row["claim_raw"]
# 3️⃣ Caută în Wikidata
wikidata_res = wikidata_check(claim)
if wikidata_res:
rating = "True"
source = f" https://www.wikidata.org/wiki/{wikidata_res ['item']['value'].split('/')[-1]}"
else:
# 4️⃣ Dacă nu există în Wikidata, încearcă Google Fact‑Check
google_res = google_factcheck_check(claim)
if google_res:
rating = google_res.get("textualRating", "Unrated")
source = google_res.get("claimReview", [{}])[0].get("url", "")
else:
rating = "Unrated"
source = ARTICLE_URL
# 5️⃣ Construiește obiectul ClaimReview
cr = build_claimreview(
claim=claim,
rating=rating,
review_url=source,
author_name="Fact‑Check Bot",
publisher_name="MyFactCheck.org",
)
claimreview_items.append(cr)
# 6️⃣ Serializare JSON‑LD
output = {
"@context": " https://schema.org",
"@graph": claimreview_items,
}
jsonld_str = json.dumps(output, indent=2, ensure_ascii=False)
# 7️⃣ Salvează în fişier cu timestamp
out_path = f"claimreview_{datetime.utcnow().strftime('%Y%m%d_%H%M%S')}.jsonld"
with open(out_path, "w", encoding="utf-8") as f:
f.write(jsonld_str)
print(f"✅ Pipeline terminat - {len(claimreview_items)} ClaimReview salvate în {out_path}")
Etapele detaliate
| Etapă | Ce se întâmplă |
|---|---|
| 1. Citirea datelor | Se încarcă un CSV (claims.csv) care conţine coloana claim_raw – textul brut al fiecărui claim. |
2. Bucle cu tqdm |
Pentru fiecare rând se afișează o bară de progres (desc="Verificare claim‑uri"). |
| 3. Verificare în Wikidata | Se apelează wikidata_check. Dacă există un rezultat, se consideră că afirmaţia este adevărată (rating = "True"). Se construieşte URL‑ul spre pagina Wikidata a elementului găsit. |
| 4. Dacă nu există în Wikidata → Google Fact‑Check | Se apelează google_factcheck_check. Dacă găseşte un rezultat, se preia textualRating (ex. „True”, „False”, „Mixture”) și URL‑ul din claimReview. Dacă nici Google nu găseşte, se marchează ca „Unrated” și se foloseşte URL‑ul articolului original ca sursă. |
5. Crearea obiectului ClaimReview |
Se apelează build_claimreview cu toate informaţiile adunate. |
| 6. Colectarea în listă | Fiecare obiect este adăugat în claimreview_items. |
| 7. Serializare JSON‑LD | Se creează un dicţionar cu @context și @graph (lista de obiecte). Se converteşte în text JSON‑LD cu indentare și ensure_ascii=False pentru a păstra diacriticele. |
| 8. Scriere în fişier | Numele fişierului conţine data și ora UTC (claimreview_YYYYMMDD_HHMMSS.jsonld). Fișierul este scris în UTF‑8. |
| 9. Mesaj de final | Se afișează pe consolă numărul de claim‑uri procesate și calea fişierului rezultat. |
7️⃣ Ce biblioteci / instrumente sunt folosite și de ce?
| Bibliotecă | Motivul utilizării |
|---|---|
| pandas | Pentru citirea și iterarea ușoară a unui CSV cu claim‑uri. DataFrame.iterrows() permite accesul la fiecare rând ca la un dicţionar. |
| tqdm | Pentru a oferi feedback vizual (bară de progres) în timpul rulării buclei, util în seturi mari de claim‑uri. |
| requests | Pentru a face request‑uri HTTP către API‑urile externe (Wikidata, Google Fact‑Check). |
| json | Pentru a transforma structura Python (dict) în format JSON‑LD valid. |
| datetime | Pentru timestamp‑uri (nume fişier și câmpul datePublished). |
8️⃣ Cum poţi rula scriptul
- Instalează dependenţele
„`bash
pip install pandas tqdm requests
„`
- Pregăteşte fişierul
claims.csv– trebuie să conţină cel puţin coloanaclaim_raw. Exemple:
„`csv
claim_raw
„Vaccinul COVID‑19 conţine microcipuri”
„Păsările migratoare aduc gripă”
„`
- Setează variabilele de configurare – înlocuieşte
ARTICLE_URL,GOOGLE_API_KEYși eventual alte endpoint‑uri dacă foloseşti altă versiune.
- Rulează scriptul
„`bash
python claim_review_pipeline.py
„`
- Verifică rezultatul – vei găsi un fişier
claimreview_YYYYMMDD_HHMMSS.jsonldîn directorul curent. Poţi deschide fişierul cu un editor de text sau îl poţi încărca într‑un validator JSON‑LD pentru a te asigura că respectă schema.org.
9️⃣ Posibile îmbunătăţiri / extensii
| Aspect | Ce poţi face |
|---|---|
| Gestionarea rate‑limiting‑ului | Adaugă time.sleep() sau un mecanism de retry cu back‑off pentru a evita blocarea API‑urilor. |
| Cache local | Salvează răspunsurile
Page 2 / 2
Prev
