Deep-Studio-Text / core /tokenizer.py
demeulemeesterxmaxime
Ajout d'un support de plusieurs langues, FR ES GR ETC
f23553c
Raw
History Blame Contribute Delete
3.37 kB
"""
Core - Tokenizer Module
Compare différentes méthodes de tokenisation :
- NLTK word-level (punkt)
- SpaCy word-level
- HuggingFace subword WordPiece (BERT tokenizer)
- HuggingFace subword BPE (GPT-2 tokenizer)
"""
from typing import Any
import nltk
import spacy
from transformers import AutoTokenizer
# -- Téléchargement NLTK (une seule fois) --
try:
nltk.data.find("tokenizers/punkt_tab")
except LookupError:
nltk.download("punkt_tab", quiet=True)
# -- Chargement lazy des modèles --
_spacy_nlp = None
_hf_tokenizer = None
_gpt2_tokenizer = None
def _get_spacy_nlp():
"""Charge le modèle SpaCy en lazy loading."""
global _spacy_nlp
if _spacy_nlp is None:
for model in ("fr_core_news_sm", "en_core_web_sm"):
try:
_spacy_nlp = spacy.load(model)
return _spacy_nlp
except OSError:
continue
# Auto-download si aucun modele trouve
import subprocess
subprocess.run(["python", "-m", "spacy", "download", "fr_core_news_sm"], check=True)
_spacy_nlp = spacy.load("fr_core_news_sm")
return _spacy_nlp
def _get_hf_tokenizer():
"""Charge le tokenizer BERT (WordPiece) en lazy loading."""
global _hf_tokenizer
if _hf_tokenizer is None:
_hf_tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
return _hf_tokenizer
def _get_gpt2_tokenizer():
"""Charge le tokenizer GPT-2 (BPE) en lazy loading."""
global _gpt2_tokenizer
if _gpt2_tokenizer is None:
_gpt2_tokenizer = AutoTokenizer.from_pretrained("gpt2")
return _gpt2_tokenizer
# -- Fonctions de tokenisation --
def tokenize_nltk(text: str) -> dict[str, Any]:
"""Tokenise avec NLTK (word-level, punkt)."""
tokens = nltk.word_tokenize(text)
return {
"method": "NLTK - Word-level (punkt)",
"tokens": tokens,
"count": len(tokens),
}
def tokenize_spacy(text: str) -> dict[str, Any]:
"""Tokenise avec SpaCy (word-level)."""
nlp = _get_spacy_nlp()
doc = nlp(text)
tokens = [token.text for token in doc]
return {
"method": "SpaCy - Word-level",
"tokens": tokens,
"count": len(tokens),
}
def tokenize_huggingface(text: str) -> dict[str, Any]:
"""Tokenise avec BERT tokenizer (subword WordPiece)."""
tokenizer = _get_hf_tokenizer()
encoding = tokenizer(text, return_tensors=None)
tokens = tokenizer.convert_ids_to_tokens(encoding["input_ids"])
return {
"method": "BERT - WordPiece",
"tokens": tokens,
"token_ids": encoding["input_ids"],
"count": len(tokens),
}
def tokenize_gpt2(text: str) -> dict[str, Any]:
"""Tokenise avec GPT-2 tokenizer (subword BPE byte-level)."""
tokenizer = _get_gpt2_tokenizer()
encoding = tokenizer(text, return_tensors=None)
tokens = tokenizer.convert_ids_to_tokens(encoding["input_ids"])
return {
"method": "GPT-2 - BPE (byte-level)",
"tokens": tokens,
"token_ids": encoding["input_ids"],
"count": len(tokens),
}
def tokenize_all(text: str) -> list[dict[str, Any]]:
"""Exécute les 4 méthodes de tokenisation et retourne les résultats."""
return [
tokenize_nltk(text),
tokenize_spacy(text),
tokenize_huggingface(text),
tokenize_gpt2(text),
]