# Mini-corpus français : 7 thèmes sémantiques, généré par gabarits pour que les
# mots d'un même thème apparaissent ensemble. Graine fixe => corpus reproductible.
import re
import math
import numpy as np
from collections import Counter
def tokeniser(phrase):
# Tokenisation naïve sur les lettres (et accents) ; on ignore les apocopes isolées.
return [t for t in re.findall(r"[a-zà-ÿœç-]+", phrase.lower()) if len(t) >= 2]
themes = {
"cuisine": ["tarte","pommes","fraises","gâteau","chocolat","sucre","citron","fromage",
"soupe","cuisine","miel","confiture","brioche","salade","légume","pêche",
"abricot","carotte"],
"informatique": ["ordinateur","programme","algorithme","mémoire","données","serveur",
"réseau","calcul","machine","système","logiciel","processeur",
"fichier","code","binaire","tableau","boucle","variable"],
"météo": ["soleil","pluie","ciel","nuage","tempête","neige","vent","orage","lumière",
"chaleur","brouillard","gel","averse","éclair","crachin","giboulée",
"zéphyr","grêle"],
"animaux": ["chat","chien","oiseau","cheval","renard","souris","fourmi","pré","forêt",
"cour","loup","ours","lapin","hibou","nid","écurie","grange","faucon"],
"transport": ["train","avion","voiture","gare","aéroport","route","ville","voyage",
"tunnel","rivière","quai","rail","vol","billet","périphérie",
"carrefour","paquebot","viaduc"],
"maison": ["maison","fenêtre","toit","chambre","long","mur","pièce","grange","jardin",
"fleur","portail","grenier","cave","escalier","balcon","clôture","haie",
"parquet"],
"émotions": ["joie","peur","colère","tristesse","surprise","amour","visage","cœur",
"sourire","larme","angoisse","haine","espoir","regret","bonheur",
"mélancolie","orgueil","douleur"],
}
gabarits = [
"{a} et {b} vont ensemble",
"le {a} ressemble au {b}",
"un lien unit le {a} et le {b}",
"un {a} rappelle un {b}",
"on associe {a} et {b}",
"le {a} comme le {b}",
"le {a} avec le {b}",
"voici le {a} et le {b}",
"chaque {a} a son {b}",
"entre le {a} et le {b} un lien existe",
]
rng_corpus = np.random.RandomState(42)
corpus = []
for mots_theme in themes.values():
for _ in range(200):
a, b = rng_corpus.choice(mots_theme, size=2, replace=False)
corpus.append(rng_corpus.choice(gabarits).format(a=a, b=b))
phrases = [tokeniser(s) for s in corpus]
vocabulaire = sorted(set(w for p in phrases for w in p))
print("phrases :", len(corpus))
print("occurrences :", sum(len(p) for p in phrases))
print("vocabulaire :", len(vocabulaire))