84 lines
3.3 KiB
Python
Executable File
84 lines
3.3 KiB
Python
Executable File
#!/usr/bin/env python3
|
||
"""Mine 18 godišnjaka 2006-2024: extract klub mentions, sportaš results, trophies."""
|
||
import os
|
||
import psycopg2, re, json
|
||
from collections import defaultdict
|
||
|
||
DB = dict(host='localhost', port=5432, dbname='rinet_v3',
|
||
user='rinet', password=os.environ["DB_PASSWORD"])
|
||
conn = psycopg2.connect(**DB); conn.autocommit = True
|
||
cu = conn.cursor()
|
||
|
||
# Get all godisnjak texts
|
||
cu.execute("""SELECT id, godina, length(sadrzaj) AS chars, sadrzaj
|
||
FROM pgz_sport.dokumenti
|
||
WHERE vrsta='godisnjak' AND godina IS NOT NULL
|
||
ORDER BY godina""")
|
||
godisnjaci = cu.fetchall()
|
||
print(f"Loaded {len(godisnjaci)} godišnjaka")
|
||
|
||
# Get all PGZ klubovi for matching
|
||
cu.execute("""SELECT id, naziv FROM pgz_sport.klubovi WHERE aktivan=true""")
|
||
klubovi = cu.fetchall()
|
||
print(f"Active klubova: {len(klubovi)}")
|
||
|
||
# Build matching index - extract base name from naziv
|
||
def base_name(naziv):
|
||
"""Extract searchable base from club naziv."""
|
||
n = re.sub(r'^(HNK|NK|RK|KK|VK|HK|AK|TK|BK|PK|HAOK|HŠK|ŽNK|ŠD|ŠRK|HRK|HŠŠ|KAK|KKM|KKP|HOO|VKK|HMNL|ŽRK|ŠKD|ŠK|ŠHRK)\s+', '', naziv, flags=re.IGNORECASE).strip()
|
||
n = re.sub(r'\s*\([^)]+\)\s*', ' ', n).strip()
|
||
n = re.sub(r'^(NOGOMETNI|RUKOMETNI|VATERPOLO|ATLETSKI|TENISKI|KOŠARKAŠKI|BOĆARSKI|JEDRILIČARSKI|KARATE)\s+(KLUB|KLUB\s+)', '', n, flags=re.IGNORECASE)
|
||
return n.strip()[:50]
|
||
|
||
# Index for fast lookup
|
||
klub_index = [] # (klub_id, naziv, base, base_lower)
|
||
for kid, naziv in klubovi:
|
||
if not naziv or len(naziv) < 3: continue
|
||
b = base_name(naziv)
|
||
if len(b) < 3: continue
|
||
klub_index.append((kid, naziv, b, b.lower()))
|
||
|
||
# Stats per klub: in which years did it appear?
|
||
klub_mentions = defaultdict(list) # klub_id → [godina,...]
|
||
|
||
# For each godišnjak, find clubs mentioned
|
||
for did, godina, chars, text in godisnjaci:
|
||
if not text or len(text) < 5000: continue
|
||
text_low = text.lower()
|
||
matched_in_doc = set()
|
||
for kid, naziv, base, base_low in klub_index:
|
||
if base_low in text_low:
|
||
matched_in_doc.add(kid)
|
||
print(f" godišnjak {godina}: {len(matched_in_doc)} klubova mentioned")
|
||
for kid in matched_in_doc:
|
||
klub_mentions[kid].append(godina)
|
||
|
||
# Update klubovi with godina_prvog_pojavljivanja and godina_zadnjeg
|
||
print(f"\n=== Klubovi sa mentions: {len(klub_mentions)} ===")
|
||
|
||
# Add new column
|
||
cu.execute("ALTER TABLE pgz_sport.klubovi ADD COLUMN IF NOT EXISTS godisnjak_godine INT[]")
|
||
cu.execute("ALTER TABLE pgz_sport.klubovi ADD COLUMN IF NOT EXISTS godisnjak_prvi INT")
|
||
cu.execute("ALTER TABLE pgz_sport.klubovi ADD COLUMN IF NOT EXISTS godisnjak_zadnji INT")
|
||
|
||
updated = 0
|
||
for kid, godine in klub_mentions.items():
|
||
godine_sorted = sorted(set(godine))
|
||
cu.execute("""UPDATE pgz_sport.klubovi
|
||
SET godisnjak_godine=%s, godisnjak_prvi=%s, godisnjak_zadnji=%s
|
||
WHERE id=%s""",
|
||
(godine_sorted, godine_sorted[0], godine_sorted[-1], kid))
|
||
updated += 1
|
||
|
||
print(f"Updated {updated} klubova sa godinama pojavljivanja")
|
||
|
||
# Top klubovi by mentions
|
||
top_klubovi = sorted(klub_mentions.items(), key=lambda x: len(x[1]), reverse=True)[:20]
|
||
print("\n=== TOP 20 klubova po godinama pojavljivanja ===")
|
||
for kid, godine in top_klubovi:
|
||
cu.execute("SELECT naziv FROM pgz_sport.klubovi WHERE id=%s", (kid,))
|
||
n = cu.fetchone()[0]
|
||
print(f" {len(godine):2}× {n[:60]}")
|
||
|
||
conn.close()
|