Loren commited on
Commit
aae5cf5
·
verified ·
1 Parent(s): fe53425

Delete script/create_dataset.py

Browse files
Files changed (1) hide show
  1. script/create_dataset.py +0 -186
script/create_dataset.py DELETED
@@ -1,186 +0,0 @@
1
- ##############################################################################################
2
- ### Script de création de la base de données articles à partir du fichier parquet,
3
- ### correspondant au jeu d'essai : https://www.kaggle.com/code/fabiochiusano/medium-articles-simple-data-analysis
4
- ### Téléchargement du csv puis conversion en Parquet avec compression snappy :
5
- ### df = pd.read_csv("medium_articles.csv")
6
- ### df.to_parquet("medium_articles.parquet", engine="pyarrow", compression="snappy")
7
- ###
8
- ### Le fichier a été uploadé dans un dataset HF : Loren/articles_db
9
- ###
10
- ### Ce script
11
- ### - crée une base SQLite articles.db constituée des 3 tables : tags, articles, et tag_article
12
- ### - l'upload dans le dataset HF Loren/articles_db
13
- ### - crée les fichiers Parquet compressés à partir des tables SQLite
14
- ### - l'upload dans le dataset HF Loren/articles_database
15
- ###
16
- ### 👉 Ils peuvent alors être utilisés par un space Hugging Face
17
- ##############################################################################################
18
-
19
- import sqlite3
20
- import pandas as pd
21
- import os
22
- from dotenv import load_dotenv
23
- import itertools
24
- import ast
25
- import uuid
26
- from huggingface_hub import hf_hub_download, upload_file
27
- from pathlib import Path
28
- from collections import Counter
29
-
30
- # Initialisations
31
- print("Initialisations ...")
32
- load_dotenv()
33
- HF_TOKEN = os.getenv('API_HF_TOKEN')
34
-
35
- # Constantes
36
- MIN_COUNT = 5 # nombre minimum d'occurrences pour qu'un tag soit conservé
37
- DATA_DIR = Path("../../Data") # dossier parent du script
38
- REPO_ID_DB = "Loren/articles_db" # dataset HF
39
- REPO_ID = "Loren/articles_database" # dataset HF
40
- DB_NAME = 'articles.db'
41
- SQLITE_FILE = DATA_DIR / DB_NAME
42
- LIST_TABLES = ["articles", "tags", "tag_article"]
43
- PARQUET_DIR = DATA_DIR / "parquet_tables"
44
-
45
- # Chargement des données
46
- parquet_path = hf_hub_download(repo_id=REPO_ID_DB,
47
- filename="medium_articles.parquet",
48
- repo_type="dataset")
49
-
50
- # Créer les dossiers s'ils n'existent pas
51
- DATA_DIR.mkdir(exist_ok=True)
52
- PARQUET_DIR.mkdir(exist_ok=True)
53
-
54
- # Chargement des données
55
- print("Chargement des données ...")
56
- df = pd.read_parquet(parquet_path)
57
-
58
- # Initialisations de la base SQLite
59
- print("Initialisations de la base SQLite ...")
60
- conn = sqlite3.connect(SQLITE_FILE)
61
- cur = conn.cursor()
62
-
63
- # Suppression des anciennes tables
64
- cur.execute("DROP TABLE IF EXISTS tag_article")
65
- cur.execute("DROP TABLE IF EXISTS tags")
66
- cur.execute("DROP TABLE IF EXISTS articles")
67
-
68
- # Création des tables Articles, Tags, et de la table d'association articles <-> tags
69
- cur.execute("""
70
- CREATE TABLE articles (
71
- article_id TEXT PRIMARY KEY, -- UUID
72
- article_title TEXT,
73
- article_text TEXT,
74
- article_url TEXT,
75
- article_authors TEXT,
76
- article_date TEXT -- YYYY-MM-DD
77
- )""")
78
-
79
- cur.execute("""
80
- CREATE TABLE tags (
81
- tag_id INTEGER PRIMARY KEY AUTOINCREMENT,
82
- tag_name TEXT UNIQUE
83
- )""")
84
-
85
- cur.execute("""
86
- CREATE TABLE tag_article (
87
- tag_article_id INTEGER PRIMARY KEY AUTOINCREMENT,
88
- article_id TEXT,
89
- tag_id INTEGER,
90
- FOREIGN KEY(article_id) REFERENCES articles(article_id),
91
- FOREIGN KEY(tag_id) REFERENCES tags(tag_id)
92
- )""")
93
-
94
- # Extraction des tags en une liste
95
- print("Extraction des tags en une liste ...")
96
- df['list_tags'] = df['tags'].apply(lambda x: ast.literal_eval(x) if isinstance(x, str) else [])
97
- # Extraire tous les tags uniques
98
- all_tags = list(itertools.chain.from_iterable(df['list_tags']))
99
- # Comptage du nombre d'occurrences de chaque tag
100
- tag_counts = Counter(all_tags)
101
- # On ne va conserver que les tags avec au moins 100 occurrences
102
- list_tags = [tag for tag, count in tag_counts.items() if count >= MIN_COUNT]
103
-
104
- # Insertion des tags dans la table
105
- print("Insertion des tags dans la table ...")
106
- cur.executemany("INSERT INTO tags (tag_name) VALUES (?)", [(tag,) for tag in list_tags])
107
-
108
- # Récupération des correspondances tag_name -> tag_id
109
- print("Récupération des correspondances tag_name -> tag_id ...")
110
- cur.execute("SELECT tag_id, tag_name FROM tags")
111
- dict_tag_map = {tag_name: tag_id for tag_id, tag_name in cur.fetchall()}
112
-
113
- # Insertion des articles et table d'association dans les tables
114
- print("Insertion des articles et table d'association dans les tables ...")
115
- for _, row in df.iterrows():
116
- # Détermination de l'id article
117
- article_id = str(uuid.uuid4())
118
-
119
- # Extraction de la date du timestamp
120
- date_value = None
121
- if pd.notna(row["timestamp"]):
122
- try:
123
- date_value = str(pd.to_datetime(row["timestamp"]).date())
124
- except Exception:
125
- date_value = None
126
-
127
- # Insertion dans la table Articles
128
- cur.execute("""
129
- INSERT INTO articles (article_id, article_title, article_text, article_url, article_authors, article_date)
130
- VALUES (?, ?, ?, ?, ?, ?)""",
131
- (article_id, row["title"], row["text"], row["url"], row["authors"], date_value))
132
-
133
- # Association aux tags
134
- for tag_name in row['list_tags']:
135
- try:
136
- tag_id = dict_tag_map[tag_name]
137
- cur.execute("INSERT INTO tag_article (article_id, tag_id) VALUES (?, ?)",
138
- (article_id, tag_id))
139
- except:
140
- pass
141
-
142
- print("-> ", len(list_tags), " tags")
143
- cur.execute("SELECT COUNT(*) FROM tag_article")
144
- nb_lignes = cur.fetchone()[0]
145
- print("-> ", nb_lignes, " associations articles <-> tags")
146
- print("-> ", len(df), " articles")
147
-
148
- # Commit
149
- print("Commit ...")
150
- conn.commit()
151
-
152
- # Upload dans le dataset hugging face
153
- print("Upload base Sqlite dans le dataset hugging face ...")
154
- upload_file(
155
- path_or_fileobj=SQLITE_FILE,
156
- path_in_repo=DB_NAME,
157
- repo_id=REPO_ID_DB,
158
- repo_type="dataset",
159
- token=HF_TOKEN
160
- )
161
-
162
- # Création des fichiers Parquet compressés
163
- print("Création des fichiers Parquet compressés ...")
164
- parquet_files = []
165
- for table in LIST_TABLES:
166
- df = pd.read_sql_query(f"SELECT * FROM {table}", conn)
167
- parquet_path = PARQUET_DIR / f"{table}.parquet"
168
- df.to_parquet(parquet_path, engine="pyarrow", index=False, compression="snappy")
169
- parquet_files.append(parquet_path)
170
-
171
- # Upload des fichiers Parquet vers HF
172
- print("Upload des fichiers Parquet dans le dataset hugging face ...")
173
- for parquet_file in parquet_files:
174
- print(f"Uploading {parquet_file.name} ...")
175
- upload_file(
176
- path_or_fileobj=parquet_file,
177
- path_in_repo=parquet_file.name,
178
- repo_id=REPO_ID,
179
- repo_type="dataset",
180
- token=HF_TOKEN
181
- )
182
-
183
- print("Upload terminé ✅")
184
-
185
- conn.close()
186
- print("Traitement terminé.")