feat(leadscraper): spaCy NER mini-service + Impressum owner detection fix #7

Merged
forgejo-admin merged 1 commit from feature/ner-service into main 2026-07-25 20:20:58 +00:00

Zusammenfassung

  • Neuer eigenständiger NER-Mini-Dienst (ner-service/, spaCy de_core_news_sm, Python 3.13) zur Inhaber-/Geschäftsführer-Erkennung im Impressum-Scan, isoliert von der Frappe-Bench (spaCys thinc-Abhängigkeit hat kein Wheel für die von Frappe verlangte Python-Version >=3.14).
  • Bugfix in scan_website(): Die Funktion brach bisher ab, sobald irgendwo (meist Footer der Startseite) eine E-Mail gefunden wurde, und besuchte die eigentliche Impressum-Seite dadurch oft nie. Jetzt werden Impressum-Kandidatenseiten immer geprüft; Impressum-Daten haben Vorrang vor Startseiten-Daten (E-Mail und Owner), Startseite bleibt Fallback.
  • extract_owner(): Regex bleibt primär (liefert nie Unsinn, nur leer oder korrekt), spaCy-Dienst nur als gefilterte Zweitmeinung wenn Regex leer bleibt — gefiltert über denselben strukturellen Keyword-Anker (Großbuchstabe muss direkt folgen) plus eine Sperrliste bekannter Nicht-Namen-Wörter (GDPR-/Cookie-Jargon, sowie Rechtsanwalt "Christian Solmecke" aus verbreiteten Datenschutz-Textbausteinen).

Verifikation

Gegen 19 echte, bereits importierte Polsterei/Sattlerei-Leads getestet:

  • Owner-Erkennung vorher (Bug): 0/19
  • Nach Bugfix (reine Regex): 7/19, keine Fehltreffer
  • Mit spaCy zuerst (verworfen): 2 Fehltreffer ("Cookies", "Erstellers" als Personenname erkannt)
  • Finale Kombination (Regex primär + gefilterte NER-Zweitmeinung): 7/19, keine Fehltreffer

ner-service isoliert gebaut/getestet (Health-Check, /extract-persons, Fallback bei gestopptem Container).

Docs

docs/install.md Abschnitt 7a aktualisiert (Architektur, Verifikations-Ergebnisse, bekannte Grenze: Name-vor-Rolle-Formate wie "Marcin Brodatzki\nInhaber / Polstermeister" werden aktuell nicht erkannt).

Gehört zusammen mit dem PR in Docker-Stacks/frappe-crm-erp (fügt den ner-service-Container dem Compose-Stack hinzu).

## Zusammenfassung - Neuer eigenständiger NER-Mini-Dienst (`ner-service/`, spaCy `de_core_news_sm`, Python 3.13) zur Inhaber-/Geschäftsführer-Erkennung im Impressum-Scan, isoliert von der Frappe-Bench (spaCys `thinc`-Abhängigkeit hat kein Wheel für die von Frappe verlangte Python-Version >=3.14). - **Bugfix in `scan_website()`:** Die Funktion brach bisher ab, sobald irgendwo (meist Footer der Startseite) eine E-Mail gefunden wurde, und besuchte die eigentliche Impressum-Seite dadurch oft nie. Jetzt werden Impressum-Kandidatenseiten immer geprüft; Impressum-Daten haben Vorrang vor Startseiten-Daten (E-Mail und Owner), Startseite bleibt Fallback. - `extract_owner()`: Regex bleibt primär (liefert nie Unsinn, nur leer oder korrekt), spaCy-Dienst nur als gefilterte Zweitmeinung wenn Regex leer bleibt — gefiltert über denselben strukturellen Keyword-Anker (Großbuchstabe muss direkt folgen) plus eine Sperrliste bekannter Nicht-Namen-Wörter (GDPR-/Cookie-Jargon, sowie Rechtsanwalt "Christian Solmecke" aus verbreiteten Datenschutz-Textbausteinen). ## Verifikation Gegen 19 echte, bereits importierte Polsterei/Sattlerei-Leads getestet: - Owner-Erkennung vorher (Bug): 0/19 - Nach Bugfix (reine Regex): 7/19, keine Fehltreffer - Mit spaCy zuerst (verworfen): 2 Fehltreffer ("Cookies", "Erstellers" als Personenname erkannt) - Finale Kombination (Regex primär + gefilterte NER-Zweitmeinung): 7/19, keine Fehltreffer `ner-service` isoliert gebaut/getestet (Health-Check, `/extract-persons`, Fallback bei gestopptem Container). ## Docs `docs/install.md` Abschnitt 7a aktualisiert (Architektur, Verifikations-Ergebnisse, bekannte Grenze: Name-vor-Rolle-Formate wie "Marcin Brodatzki\nInhaber / Polstermeister" werden aktuell nicht erkannt). Gehört zusammen mit dem PR in `Docker-Stacks/frappe-crm-erp` (fügt den `ner-service`-Container dem Compose-Stack hinzu).
Adds an isolated spaCy-based NER microservice (ner-service/, Python 3.13) for
Impressum owner-name extraction, since spaCy's thinc dependency has no wheel
for the Python version the Frappe bench requires.

Fixes a control-flow bug in scan_website() where an email found on the
homepage (very common in footers) short-circuited the scan before the actual
Impressum page was ever visited - the field most likely to contain the owner
name. Impressum data now always takes priority over homepage data for both
email and owner, with the homepage only used as a final fallback.

extract_owner() tries the structurally strict regex first (verified against
19 real leads to never return garbage, only empty or correct) and only
consults the ner-service as a filtered second opinion when the regex finds
nothing - filtered through the same structural keyword anchor plus a
blocklist of GDPR/cookie boilerplate words that spaCy's small model
mistakenly tags as PERSON on dense legal text.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
forgejo-admin deleted branch feature/ner-service 2026-07-25 20:20:58 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Frappe-Projekte/LeadScraper-Google!7
No description provided.