Spaces:
Sleeping
Sleeping
File size: 5,106 Bytes
dd0f502 f555d70 e8ff22d dd0f502 f555d70 e8ff22d f555d70 dd0f502 e8ff22d dd0f502 e8ff22d f555d70 e8ff22d f555d70 dd0f502 f555d70 dd0f502 f555d70 dd0f502 f555d70 dd0f502 f555d70 e8ff22d dd0f502 e8ff22d f555d70 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
##############################################################################################
### Script de création de la base de données articles à partir du fichier parquet,
### correspondant au jeu d'essai : https://www.kaggle.com/code/fabiochiusano/medium-articles-simple-data-analysis
### Téléchargement du csv puis conversion en Parquet avec compression snappy :
### df = pd.read_csv("medium_articles.csv")
### df.to_parquet("medium_articles.parquet", engine="pyarrow", compression="snappy")
###
### Le fichier a été uploadé dans un dataset HF : Loren/articles_db
### Le script crée la base SQLite articles.db et l'upload dans le dataset
##############################################################################################
import sqlite3
import pandas as pd
import os
from dotenv import load_dotenv
import itertools
import ast
import uuid
from huggingface_hub import hf_hub_download, upload_file
from pathlib import Path
# Initialisations
print("Initialisations ...")
load_dotenv()
HF_TOKEN = os.getenv('API_HF_TOKEN')
DATA_DIR = Path("../../Data") # dossier parent du script
REPO_ID = "Loren/articles_db" # dataset HF
parquet_path = hf_hub_download(repo_id=REPO_ID,
filename="medium_articles.parquet",
repo_type="dataset")
DB_NAME = 'articles.db'
SQLITE_FILE = DATA_DIR / DB_NAME
# Créer le dossier data s'il n'existe pas
DATA_DIR.mkdir(exist_ok=True)
# Chargement des données
print("Chargement des données ...")
df = pd.read_parquet(parquet_path)
# Initialisations de la base SQLite
print("Initialisations de la base SQLite ...")
conn = sqlite3.connect(SQLITE_FILE)
cur = conn.cursor()
# Suppression des anciennes tables
cur.execute("DROP TABLE IF EXISTS tag_article")
cur.execute("DROP TABLE IF EXISTS tags")
cur.execute("DROP TABLE IF EXISTS articles")
# Création des tables Articles, Tags, et de la table d'association articles <-> tags
cur.execute("""
CREATE TABLE articles (
article_id TEXT PRIMARY KEY, -- UUID
article_title TEXT,
article_text TEXT,
article_url TEXT,
article_authors TEXT,
article_date TEXT -- YYYY-MM-DD
)""")
cur.execute("""
CREATE TABLE tags (
tag_id INTEGER PRIMARY KEY AUTOINCREMENT,
tag_name TEXT UNIQUE
)""")
cur.execute("""
CREATE TABLE tag_article (
tag_article_id INTEGER PRIMARY KEY AUTOINCREMENT,
article_id TEXT,
tag_id INTEGER,
FOREIGN KEY(article_id) REFERENCES articles(article_id),
FOREIGN KEY(tag_id) REFERENCES tags(tag_id)
)""")
# Extraction des tags en une liste unique
print("Extraction des tags en une liste unique ...")
df['list_tags'] = df['tags'].apply(lambda x: ast.literal_eval(x) if isinstance(x, str) else [])
# Extraire tous les tags uniques
all_tags = list(set(itertools.chain.from_iterable(df['list_tags'])))
# Exclusion de certains tags pour question de volume de la database (il faut= 1 Go)
list_exclude = ['Politics', 'Startup', 'Covid 19', 'JavaScript', 'Business', 'Blockchain',
'Cryptocurrency', 'Bitcoin']
list_tags = [t for t in all_tags if t not in list_exclude]
# Insertion des tags dans la table
print("Insertion des tags dans la table ...")
cur.executemany("INSERT INTO tags (tag_name) VALUES (?)", [(tag,) for tag in list_tags])
# Récupération des correspondances tag_name -> tag_id
print("Récupération des correspondances tag_name -> tag_id ...")
cur.execute("SELECT tag_id, tag_name FROM tags")
dict_tag_map = {tag_name: tag_id for tag_id, tag_name in cur.fetchall()}
# Insertion des articles et table d'association dans les tables
print("Insertion des articles et table d'association dans les tables ...")
for _, row in df.iterrows():
# Détermination de l'id article
article_id = str(uuid.uuid4())
# Extraction de la date du timestamp
date_value = None
if pd.notna(row["timestamp"]):
try:
date_value = str(pd.to_datetime(row["timestamp"]).date())
except Exception:
date_value = None
# Association aux tags
ind_ok = True
for tag_name in row['list_tags']:
try:
tag_id = dict_tag_map[tag_name]
cur.execute("INSERT INTO tag_article (article_id, tag_id) VALUES (?, ?)",
(article_id, tag_id))
except:
ind_ok = False
if ind_ok:
# Insertion dans la table Articles
cur.execute("""
INSERT INTO articles (article_id, article_title, article_text, article_url, article_authors, article_date)
VALUES (?, ?, ?, ?, ?, ?)""",
(article_id, row["title"], row["text"], row["url"], row["authors"], date_value))
conn.commit()
conn.close()
# Upload dans le dataset hugging face
print("Upload dans le dataset hugging face ...")
upload_file(
path_or_fileobj=SQLITE_FILE,
path_in_repo=DB_NAME,
repo_id=REPO_ID,
repo_type="dataset",
token=HF_TOKEN
)
print("Traitement terminé.") |