{"id":13221,"date":"2026-06-09T13:13:38","date_gmt":"2026-06-09T11:13:38","guid":{"rendered":"https:\/\/flaven.fr\/?post_type=bf_videos_manager&#038;p=13221"},"modified":"2026-06-09T13:20:27","modified_gmt":"2026-06-09T11:20:27","slug":"wordpress-taxonomy-pipeline-pt-1-fetch-tags-spacy-ner-in-python-docker","status":"publish","type":"bf_videos_manager","link":"https:\/\/flaven.fr\/videos\/wordpress-taxonomy-pipeline-pt-1-fetch-tags-spacy-ner-in-python-docker\/","title":{"rendered":"WordPress Taxonomy Pipeline Pt.1: Fetch Tags + spaCy NER in Python &#038; Docker"},"content":{"rendered":"<p>Part 1 of 2 | AI-Powered WordPress Taxonomy Migration<\/p>\n<p>In this video I walk through the first half of a 4-step Python pipeline<br \/>\nthat semantically enriches WordPress tags using NLP and knowledge graphs \u2014<br \/>\nall running locally in Docker.<\/p>\n<p>What you will see:<\/p>\n<p>Step 1 \u2014 Connect Python directly to a WordPress MySQL database and fetch<br \/>\n100 taxonomy terms (post_tag) with post counts. No plugin required \u2014 raw<br \/>\nSQL via Python.<br \/>\nCommand used:<br \/>\n  python source\/pipeline\/001_step_1_list_tags_categories_wp.py \\<br \/>\n    &#8211;limit 100 &#8211;taxonomy post_tag &#8211;no-dry-run<\/p>\n<p>Step 2 \u2014 Run spaCy Named Entity Recognition (NER) on each tag to classify<br \/>\nthem automatically: is &#8220;Amazon&#8221; a company (ORG), a location (GPE), or a<br \/>\nproduct (PRODUCT)? NER answers that without any manual labelling.<br \/>\nCommand used:<br \/>\n  python source\/pipeline\/002_step_2_spacy_ner.py \\<br \/>\n    &#8211;limit 100 &#8211;taxonomy post_tag &#8211;no-dry-run<\/p>\n<p>Step 3 starts \u2014 Wikidata enrichment kicks off for 100 tags. Because the<br \/>\nWikidata API queries take several minutes to complete, I leave Step 3<br \/>\nrunning and pick up the results in Part 2 (video 001_b).<\/p>\n<p>Stack used:<br \/>\n&#8211; Python 3.9 managed via Anaconda (conda env: tags_treatment)<br \/>\n&#8211; Docker + WordPress + phpMyAdmin running locally on ports 8080 \/ 8081<br \/>\n&#8211; spaCy NER model: en_core_web_md<br \/>\n&#8211; MySQL connector for direct WordPress DB access<\/p>\n<p>Why this matters for SEO:<br \/>\nMost WordPress sites accumulate taxonomy chaos \u2014 hundreds of tags with<br \/>\nzero semantic meaning attached. This pipeline is the first step toward<br \/>\nconverting raw taxonomy strings into structured, AI-readable breadcrumb<br \/>\nproposals. That is the foundation for GEO (Generative Engine<br \/>\nOptimization): making your content legible to LLMs and AI agents, not<br \/>\njust to search-engine crawlers.<\/p>\n<p>Full article: https:\/\/wp.me\/p3Vuhl-3rb<br \/>\nGitHub: https:\/\/github.com\/bflaven\/ia_usages\/tree\/main\/ia_seo_ia_semantic_breadcrumb_webmcp<\/p>\n<p>Continue in Part 2 (001_b): Wikidata results + breadcrumb JSON +<br \/>\nWordPress plugin demo.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Part 1 of 2 | AI-Powered WordPress Taxonomy Migration In this video I walk through the first half of a 4-step Python pipeline that semantically&hellip; <\/p>\n<p class=\"text-center\"><a href=\"https:\/\/flaven.fr\/videos\/wordpress-taxonomy-pipeline-pt-1-fetch-tags-spacy-ner-in-python-docker\/\" class=\"more-link\">Continue reading &rarr; <span class=\"screen-reader-text\">WordPress Taxonomy Pipeline Pt.1: Fetch Tags + spaCy NER in Python &#038; Docker<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":11806,"comment_status":"open","ping_status":"closed","template":"","bf_videos_manager_tag":[3244,2685,2797,2683,2840,2846,3062,2672,2745,2749],"bf_videos_manager_cat":[2729,2700,2681,2682,2678,2679,2680],"class_list":["post-13221","bf_videos_manager","type-bf_videos_manager","status-publish","has-post-thumbnail","hentry","bf_videos_manager_tag-ai-generated","bf_videos_manager_tag-anaconda","bf_videos_manager_tag-artificial-intelligence","bf_videos_manager_tag-p-o","bf_videos_manager_tag-po","bf_videos_manager_tag-poc","bf_videos_manager_tag-product-owner","bf_videos_manager_tag-python","bf_videos_manager_tag-wordpress","bf_videos_manager_tag-workflow","bf_videos_manager_cat-agile","bf_videos_manager_cat-anaconda","bf_videos_manager_cat-development","bf_videos_manager_cat-experiences","bf_videos_manager_cat-python","bf_videos_manager_cat-tutorials","bf_videos_manager_cat-videos"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/bf_videos_manager\/13221","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/bf_videos_manager"}],"about":[{"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/types\/bf_videos_manager"}],"author":[{"embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/comments?post=13221"}],"version-history":[{"count":1,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/bf_videos_manager\/13221\/revisions"}],"predecessor-version":[{"id":13222,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/bf_videos_manager\/13221\/revisions\/13222"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/media\/11806"}],"wp:attachment":[{"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/media?parent=13221"}],"wp:term":[{"taxonomy":"bf_videos_manager_tag","embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/bf_videos_manager_tag?post=13221"},{"taxonomy":"bf_videos_manager_cat","embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/bf_videos_manager_cat?post=13221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}