555e282cc4
pi-agent-plugin checks / lint (push) Has been cancelled
pi-agent-plugin checks / test (20) (push) Has been cancelled
pi-agent-plugin checks / test (22) (push) Has been cancelled
pi-agent-plugin checks / build (push) Has been cancelled
TypeScript SDK CI / check_changes (push) Has been cancelled
TypeScript SDK CI / changelog_check (push) Has been cancelled
ci / changelog_check (push) Has been cancelled
ci / check_changes (push) Has been cancelled
ci / build_mem0 (3.10) (push) Has been cancelled
ci / build_mem0 (3.11) (push) Has been cancelled
ci / build_mem0 (3.12) (push) Has been cancelled
CLI Node CI / lint (push) Has been cancelled
CLI Node CI / test (20) (push) Has been cancelled
CLI Node CI / test (22) (push) Has been cancelled
CLI Node CI / build (push) Has been cancelled
CLI Python CI / lint (push) Has been cancelled
CLI Python CI / test (3.10) (push) Has been cancelled
CLI Python CI / test (3.11) (push) Has been cancelled
CLI Python CI / test (3.12) (push) Has been cancelled
CLI Python CI / build (push) Has been cancelled
openclaw checks / lint (push) Has been cancelled
openclaw checks / test (20) (push) Has been cancelled
openclaw checks / test (22) (push) Has been cancelled
openclaw checks / build (push) Has been cancelled
opencode-plugin checks / build (push) Has been cancelled
TypeScript SDK CI / build_ts_sdk (20) (push) Has been cancelled
TypeScript SDK CI / build_ts_sdk (22) (push) Has been cancelled
TypeScript SDK CI / integration_ts_sdk (20) (push) Has been cancelled
TypeScript SDK CI / integration_ts_sdk (22) (push) Has been cancelled
51 lines
1.4 KiB
Python
51 lines
1.4 KiB
Python
"""
|
|
BM25 lemmatization for consistent keyword matching.
|
|
|
|
Uses spaCy's lemmatizer for better handling of:
|
|
- Verb forms: attending/attends/attended -> attend
|
|
- Comparatives/superlatives: older/oldest -> old
|
|
- Plurals: memories -> memory
|
|
- Avoids over-stemming: organization != organize
|
|
|
|
Also includes original -ing forms alongside lemmas to handle cases
|
|
where spaCy's context-dependent lemmatization produces inconsistent
|
|
results (e.g., "meeting" as noun vs verb -> different lemmas).
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def lemmatize_for_bm25(text: str) -> str:
|
|
"""Lemmatize text for BM25 matching.
|
|
|
|
Returns space-joined lemmas for full-text search. Falls back to
|
|
the original text if spaCy is unavailable.
|
|
"""
|
|
from mem0.utils.spacy_models import get_nlp_lemma
|
|
|
|
nlp = get_nlp_lemma()
|
|
if nlp is None:
|
|
return text
|
|
|
|
doc = nlp(text.lower())
|
|
tokens = []
|
|
|
|
for token in doc:
|
|
if token.is_punct or token.is_stop:
|
|
continue
|
|
|
|
lemma = token.lemma_
|
|
if lemma.isalnum():
|
|
tokens.append(lemma)
|
|
|
|
# Also add original if it ends in -ing and differs from lemma.
|
|
# This handles noun/verb ambiguity (meeting/meet, attending/attend).
|
|
if token.text.endswith("ing") and token.text != lemma and token.text.isalnum():
|
|
tokens.append(token.text)
|
|
|
|
return " ".join(tokens)
|