Racinement (Stemming) et mots vides
Ce guide couvre l'utilisation des racines (stemmers), des filtres de mots vides (stop words) et de l'analyse de texte spécifique à chaque langue avec Whoosh.
Racines (Stemmers)
Un racine (stemmer) réduit les mots à leur forme racine (par ex., "running" → "run", "cats" → "cat"), afin que les différentes formes du même mot correspondent lors des recherches.
Utilisation de StemmerFilter
from whoosh.analysis import RegexTokenizer, StemmerFilter
from whoosh.lang.porter import stem
from whoosh import fields
# English Porter stemmer
stem_analyzer = RegexTokenizer() | StemmerFilter(stemfn=stem)
schema = fields.Schema(
title=fields.TEXT(stored=True),
content=fields.TEXT(analyzer=stem_analyzer),
)
Racines Snowball
Whoosh inclut des racines Snowball pour plusieurs langues :
from whoosh.analysis import StemmerFilter
from whoosh.lang.snowball import EnglishStemmer
stem_analyzer = RegexTokenizer() | StemmerFilter(stemfn=EnglishStemmer().stem)
Sélection de racine selon la langue
from whoosh.lang import stemmer_for_language, StemmerFilter
from whoosh.analysis import RegexTokenizer
stem = stemmer_for_language("en")
analyzer = RegexTokenizer() | StemmerFilter(stemfn=stem)
# Ou utilisez l'analyseur StemmingAnalyzer :
from whoosh.analysis import StemmingAnalyzer
analyzer = StemmingAnalyzer("en")
Langues disponibles
from whoosh.lang import languages, has_stemmer, has_stopwords
print(languages) # ('ar', 'da', 'nl', 'en', 'fi', 'fr', ...)
print(has_stemmer("en")) # True
print(has_stopwords("en")) # True
Mots vides (Stop Words)
Les mots vides sont des mots fréquents (comme "the", "a", "and") qui sont généralement filtrés lors de l'indexation car ils apparaissent dans trop de documents pour être utiles au classement.
Utilisation de StopFilter
from whoosh.analysis import RegexTokenizer, StopFilter
from whoosh.lang import stopwords_for_language
# English stop words
stop_words = set(stopwords_for_language("en"))
stop_analyzer = RegexTokenizer() | StopFilter(stoplist=stop_words)
schema = fields.Schema(
content=fields.TEXT(analyzer=stop_analyzer),
)
Combinaison de racinement et de mots vides
from whoosh.analysis import StemmingAnalyzer
# StemmingAnalyzer charge automatiquement le racine et les mots vides pour la langue
analyzer = StemmingAnalyzer("en")
schema = fields.Schema(
content=fields.TEXT(analyzer=analyzer),
)
Mots vides personnalisés
from whoosh.analysis import RegexTokenizer, StopFilter
# Liste personnalisée de mots vides
custom_stops = frozenset(["the", "a", "an", "foo", "bar"])
analyzer = RegexTokenizer() | StopFilter(stoplist=custom_stops)
StemmingAnalyzer (Recommandé)
Le StemmingAnalyzer combine le tokeniseur, le racinement et le
filtrage des mots vides :
from whoosh.analysis import StemmingAnalyzer
# Utilise automatiquement le bon racine et les mots vides pour la langue
analyzer = StemmingAnalyzer("en")
# Vous pouvez remplacer les valeurs par défaut
analyzer = StemmingAnalyzer("en",
use_stopwords=True,
use_stems=True)
Options de StemmingAnalyzer
lang: Code de langue (ex. :"en","fr","de")use_stopwords: Charge et applique les mots vides (par défautTrue)use_stems: Applique le racinement (par défautTrue)args: Arguments passés au tokeniseurkwargs: Arguments du mot-clé pour le racine ou les mots vides
Considérations spécifiques selon la langue
Arabe (ISRI Stemmer)
from whoosh.analysis import StemmerFilter
from whoosh.lang.isri import ISRIStemmer
stem_analyzer = RegexTokenizer() | StemmerFilter(stemfn=ISRIStemmer().stem)
Double Métaphone pour la correspondance phonétique
from whoosh.analysis import RegexTokenizer, DoubleMetaphoneFilter
analyzer = RegexTokenizer() | DoubleMetaphoneFilter()
Racinement côté requête
L'analyseur est appliqué à la fois lors de l'indexation et lors de la requête (via l'analyseur de requête), donc le racinement est automatiquement appliqué aux termes de recherche :
from whoosh.qparser import QueryParser
# Si l'index utilise le racinement, les requêtes sont racinées aussi
qp = QueryParser("content", schema=ix.schema)
q = qp.parse("running cats") # Correspondra à "run", "cat", etc.
Analyse N-gramme
Pour la correspondance de sous-chaînes et les requêtes par préfixe, utilisez les analyseurs N-gramme :
from whoosh.analysis import NgramWordAnalyzer
analyzer = NgramWordAnalyzer(minsize=2, maxsize=4)
schema = fields.Schema(content=fields.TEXT(analyzer=analyzer))
Voir le Guide N-grammes pour plus de détails.
Fournisseurs de racines modernes (Whoosh-NG 2.0)
Whoosh-NG 2.0 introduit un système de fournisseurs de racines de style plugin avec détection automatique, support de PyStemmer et d'analyseurs spécifiques à chaque langue. Pour plus de détails, voir le Guide des fournisseurs de racines.