{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "5e667b10",
   "metadata": {},
   "source": [
    "# Finding duplicate suppliers with embeddings\n",
    "\n",
    "Companion notebook to *Enterprise Master Data Cleaning, Part 2* on abhisheksaha.dev.\n",
    "\n",
    "We turn each supplier record into a list of numbers (an *embedding*), then look for records\n",
    "whose numbers are close. Close numbers = probably the same company. Run the cells top to bottom."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "6cf3087c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-27T09:41:26.541078Z",
     "iopub.status.busy": "2026-09-27T09:41:26.540881Z",
     "iopub.status.idle": "2026-09-27T09:41:27.248151Z",
     "shell.execute_reply": "2026-09-27T09:41:27.247798Z"
    }
   },
   "outputs": [],
   "source": [
    "%pip install -q sentence-transformers chromadb"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "fa578597",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-27T09:41:27.249470Z",
     "iopub.status.busy": "2026-09-27T09:41:27.249385Z",
     "iopub.status.idle": "2026-09-27T09:41:34.664417Z",
     "shell.execute_reply": "2026-09-27T09:41:34.664113Z"
    }
   },
   "outputs": [],
   "source": [
    "from sentence_transformers import SentenceTransformer\n",
    "import chromadb\n",
    "\n",
    "model = SentenceTransformer(\"all-MiniLM-L6-v2\")\n",
    "\n",
    "# In-memory database; \"cosine\" makes distance = 1 - cosine similarity (0 = identical)\n",
    "db = chromadb.EphemeralClient()\n",
    "collection = db.get_or_create_collection(\"suppliers\", metadata={\"hnsw:space\": \"cosine\"})"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "be27b1b3",
   "metadata": {},
   "source": [
    "## The supplier data\n",
    "\n",
    "45 records: 10 real companies typed in several ways, 13 junk entries and one personal name."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "a9f4cd24",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-27T09:41:34.666022Z",
     "iopub.status.busy": "2026-09-27T09:41:34.665704Z",
     "iopub.status.idle": "2026-09-27T09:41:34.678017Z",
     "shell.execute_reply": "2026-09-27T09:41:34.677801Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "45 records\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>supplier</th>\n",
       "      <th>country</th>\n",
       "      <th>city</th>\n",
       "      <th>category</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100234</td>\n",
       "      <td>ABC Logistics AB</td>\n",
       "      <td>Sweden</td>\n",
       "      <td>Stockholm</td>\n",
       "      <td>Transportation</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>100235</td>\n",
       "      <td>Nordic Freight Solutions</td>\n",
       "      <td>Norway</td>\n",
       "      <td>Oslo</td>\n",
       "      <td>Transportation</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>100236</td>\n",
       "      <td>Berlin Office Supplies GmbH</td>\n",
       "      <td>Germany</td>\n",
       "      <td>Berlin</td>\n",
       "      <td>Office Equipment</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>100237</td>\n",
       "      <td>Sunrise Electronics Ltd</td>\n",
       "      <td>United Kingdom</td>\n",
       "      <td>Manchester</td>\n",
       "      <td>Electronics</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>100238</td>\n",
       "      <td>Nordic Freight Solutions AS</td>\n",
       "      <td>Norway</td>\n",
       "      <td>Oslo</td>\n",
       "      <td>Transportation</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>100239</td>\n",
       "      <td>ABC Logistics</td>\n",
       "      <td>Sweden</td>\n",
       "      <td>Stockholm</td>\n",
       "      <td>Transportation</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>100240</td>\n",
       "      <td>A.B.C. Logistics AB</td>\n",
       "      <td>SE</td>\n",
       "      <td>Stockholm</td>\n",
       "      <td>Transportation</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>100241</td>\n",
       "      <td>ABC LOGISTICS AB</td>\n",
       "      <td>Sweden</td>\n",
       "      <td>Stokholm</td>\n",
       "      <td>Transportation</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>100242</td>\n",
       "      <td>Nordic Freight Solutions A/S</td>\n",
       "      <td>Norway</td>\n",
       "      <td>Oslo</td>\n",
       "      <td>Transport</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>100243</td>\n",
       "      <td>Nordic Freight Solution AS</td>\n",
       "      <td>NO</td>\n",
       "      <td>Oslo</td>\n",
       "      <td>Transportation</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       id                      supplier         country        city  \\\n",
       "0  100234              ABC Logistics AB          Sweden   Stockholm   \n",
       "1  100235      Nordic Freight Solutions          Norway        Oslo   \n",
       "2  100236   Berlin Office Supplies GmbH         Germany      Berlin   \n",
       "3  100237       Sunrise Electronics Ltd  United Kingdom  Manchester   \n",
       "4  100238   Nordic Freight Solutions AS          Norway        Oslo   \n",
       "5  100239                 ABC Logistics          Sweden   Stockholm   \n",
       "6  100240           A.B.C. Logistics AB              SE   Stockholm   \n",
       "7  100241              ABC LOGISTICS AB          Sweden    Stokholm   \n",
       "8  100242  Nordic Freight Solutions A/S          Norway        Oslo   \n",
       "9  100243    Nordic Freight Solution AS              NO        Oslo   \n",
       "\n",
       "           category  \n",
       "0    Transportation  \n",
       "1    Transportation  \n",
       "2  Office Equipment  \n",
       "3       Electronics  \n",
       "4    Transportation  \n",
       "5    Transportation  \n",
       "6    Transportation  \n",
       "7    Transportation  \n",
       "8         Transport  \n",
       "9    Transportation  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import io\n",
    "import pandas as pd\n",
    "\n",
    "SUPPLIERS_CSV = \"\"\"id,supplier,country,city,category\n",
    "100234,ABC Logistics AB,Sweden,Stockholm,Transportation\n",
    "100235,Nordic Freight Solutions,Norway,Oslo,Transportation\n",
    "100236,Berlin Office Supplies GmbH,Germany,Berlin,Office Equipment\n",
    "100237,Sunrise Electronics Ltd,United Kingdom,Manchester,Electronics\n",
    "100238,Nordic Freight Solutions AS,Norway,Oslo,Transportation\n",
    "100239,ABC Logistics,Sweden,Stockholm,Transportation\n",
    "100240,A.B.C. Logistics AB,SE,Stockholm,Transportation\n",
    "100241,ABC LOGISTICS AB,Sweden,Stokholm,Transportation\n",
    "100242,Nordic Freight Solutions A/S,Norway,Oslo,Transport\n",
    "100243,Nordic Freight Solution AS,NO,Oslo,Transportation\n",
    "100244,Berlin Office Supplies,Germany,Berlin,Office Equipment\n",
    "100245,Berlin Office Supply GmbH,DE,Berlin,Office Equipment\n",
    "100246,Berlin Ofice Supplies GmbH,Germany,Berlin,Office Equipement\n",
    "100247,Sunrise Electronics Limited,UK,Manchester,Electronics\n",
    "100248,Sunrise Electronics,United Kingdom,Manchestor,Electronics\n",
    "100249,SUNRISE ELECTRONICS LTD.,GB,Manchester,Electronics\n",
    "100250,Berlin Office Supplies GmbH,Germany,Berlin,Office Equipment\n",
    "100251,Fjord Marine Services AS,Norway,Bergen,Transportation\n",
    "100252,Fjord Marine Services,Norway,Bergen,Marine Services\n",
    "100253,Helsinki Steel Oy,Finland,Helsinki,Raw Materials\n",
    "100254,Helsinki Steel OY,FI,Helsinki,Raw Materials\n",
    "100255,Copenhagen Packaging A/S,Denmark,Copenhagen,Packaging\n",
    "100256,Copenhagen Packaging AS,Denmark,København,Packaging\n",
    "100257,Rotterdam Chemicals B.V.,Netherlands,Rotterdam,Chemicals\n",
    "100258,Rotterdam Chemicals BV,NL,Rotterdam,Chemicals\n",
    "100259,Müller & Söhne Maschinenbau GmbH,Germany,Stuttgart,Manufacturing\n",
    "100260,Mueller und Soehne Maschinenbau GmbH,Germany,Stuttgart,Manufacturing\n",
    "100261,\"Acme Industrial Supply, Inc.\",United States,Chicago,Manufacturing\n",
    "100262,Acme Industrial Supply Inc,USA,Chicago,Manufacturing\n",
    "100263,,,,\n",
    "100264,TEST,,,\n",
    "100265,test supplier,Sweden,Stockholm,TEST\n",
    "100266,N/A,N/A,N/A,N/A\n",
    "100267,asdfasdf,xx,zzz,???\n",
    "100268,DO NOT USE - DUPLICATE,Germany,Berlin,Office Equipment\n",
    "100269,12345,Norway,Oslo,Transportation\n",
    "100270,   ,Sweden,Stockholm,Transportation\n",
    "100271,!!!@@@###,,,\n",
    "100272,Unknown Vendor,Unknown,Unknown,Unknown\n",
    "100273,ZZZ_DELETE_ME,United Kingdom,London,\n",
    "100274,\"Smith, John (personal)\",,,\n",
    "100275,null,null,null,null\n",
    "100276,TBD,Sweden,,Transportation\n",
    "100277,Sunrise Electronics Ltd,Narnia,Manchester,Electronics\n",
    "100278,ABC Logistics AB,,,\n",
    "\"\"\"\n",
    "\n",
    "suppliers_df = pd.read_csv(io.StringIO(SUPPLIERS_CSV), dtype={\"id\": str})\n",
    "\n",
    "# Each record becomes one short text. This text is what gets embedded.\n",
    "SUPPLIERS = [\n",
    "    {\n",
    "        \"id\": row[\"id\"],\n",
    "        \"text\": f\"\"\"\n",
    "Supplier: {row['supplier']}\n",
    "Country: {row['country']}\n",
    "City: {row['city']}\n",
    "Category: {row['category']}\n",
    "\"\"\",\n",
    "    }\n",
    "    for _, row in suppliers_df.iterrows()\n",
    "]\n",
    "\n",
    "print(len(SUPPLIERS), \"records\")\n",
    "suppliers_df.head(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9309aba6",
   "metadata": {},
   "source": [
    "## What an embedding looks like\n",
    "\n",
    "The model turns each record into a list of 384 numbers. Records that mean similar things\n",
    "end up with similar numbers. We compare them with **cosine similarity** (1 = same direction,\n",
    "0 = unrelated)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "60755d55",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-27T09:41:34.679049Z",
     "iopub.status.busy": "2026-09-27T09:41:34.678983Z",
     "iopub.status.idle": "2026-09-27T09:41:34.865762Z",
     "shell.execute_reply": "2026-09-27T09:41:34.865498Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dimensions: 384\n",
      "first 8 values: [ 0.051 -0.032 -0.036 -0.014  0.013  0.019  0.043  0.002]\n",
      "100234 vs 100240  similarity=0.938  distance=0.062  (same company, different spelling)\n",
      "100234 vs 100235  similarity=0.799  distance=0.201  (different company, same industry)\n",
      "100234 vs 100236  similarity=0.594  distance=0.406  (different company, different industry)\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "def embed(text):\n",
    "    return model.encode(text, normalize_embeddings=True)\n",
    "\n",
    "vec = embed(SUPPLIERS[0][\"text\"])\n",
    "print(\"dimensions:\", vec.shape[0])\n",
    "print(\"first 8 values:\", np.round(vec[:8], 3))\n",
    "\n",
    "def text_of(supplier_id):\n",
    "    return next(s[\"text\"] for s in SUPPLIERS if s[\"id\"] == supplier_id)\n",
    "\n",
    "examples = [\n",
    "    (\"100234\", \"100240\", \"same company, different spelling\"),\n",
    "    (\"100234\", \"100235\", \"different company, same industry\"),\n",
    "    (\"100234\", \"100236\", \"different company, different industry\"),\n",
    "]\n",
    "for a, b, label in examples:\n",
    "    sim = float(embed(text_of(a)) @ embed(text_of(b)))\n",
    "    print(f\"{a} vs {b}  similarity={sim:.3f}  distance={1 - sim:.3f}  ({label})\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "815a9a50",
   "metadata": {},
   "source": [
    "## Embed every record and add it to the collection"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "275ddaf3",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-27T09:41:34.866985Z",
     "iopub.status.busy": "2026-09-27T09:41:34.866913Z",
     "iopub.status.idle": "2026-09-27T09:41:34.940740Z",
     "shell.execute_reply": "2026-09-27T09:41:34.940499Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "45 vectors stored\n"
     ]
    }
   ],
   "source": [
    "collection.upsert(\n",
    "    ids=[s[\"id\"] for s in SUPPLIERS],\n",
    "    documents=[s[\"text\"] for s in SUPPLIERS],\n",
    "    embeddings=model.encode([s[\"text\"] for s in SUPPLIERS], normalize_embeddings=True).tolist(),\n",
    ")\n",
    "print(collection.count(), \"vectors stored\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4c8b7f2c",
   "metadata": {},
   "source": [
    "## Semantic search\n",
    "\n",
    "A plain-language question finds matching suppliers even though no record contains the\n",
    "word \"transportation supplier\"."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "a746c0de",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-27T09:41:34.941842Z",
     "iopub.status.busy": "2026-09-27T09:41:34.941778Z",
     "iopub.status.idle": "2026-09-27T09:41:34.964929Z",
     "shell.execute_reply": "2026-09-27T09:41:34.964673Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[100270] (distance=0.1829)\n",
      "Supplier:    \n",
      "Country: Sweden\n",
      "City: Stockholm\n",
      "Category: Transportation\n",
      "\n",
      "[100239] (distance=0.2383)\n",
      "Supplier: ABC Logistics\n",
      "Country: Sweden\n",
      "City: Stockholm\n",
      "Category: Transportation\n",
      "\n",
      "[100240] (distance=0.2446)\n",
      "Supplier: A.B.C. Logistics AB\n",
      "Country: SE\n",
      "City: Stockholm\n",
      "Category: Transportation\n",
      "\n",
      "[100234] (distance=0.2464)\n",
      "Supplier: ABC Logistics AB\n",
      "Country: Sweden\n",
      "City: Stockholm\n",
      "Category: Transportation\n",
      "\n",
      "[100241] (distance=0.2578)\n",
      "Supplier: ABC LOGISTICS AB\n",
      "Country: Sweden\n",
      "City: Stokholm\n",
      "Category: Transportation\n",
      "\n"
     ]
    }
   ],
   "source": [
    "question = \"transportation supplier in Sweden\"\n",
    "query_embedding = embed(question).tolist()\n",
    "\n",
    "result = collection.query(query_embeddings=[query_embedding], n_results=5)\n",
    "\n",
    "for doc_id, doc, distance in zip(result[\"ids\"][0], result[\"documents\"][0], result[\"distances\"][0]):\n",
    "    print(f\"[{doc_id}] (distance={distance:.4f}){doc}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2fe436c7",
   "metadata": {},
   "source": [
    "## Duplicate check for a new supplier\n",
    "\n",
    "Before creating a new supplier, look up its nearest neighbour. If the distance is under a\n",
    "threshold, flag it as a possible duplicate."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "d7199ccd",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-27T09:41:34.966047Z",
     "iopub.status.busy": "2026-09-27T09:41:34.965979Z",
     "iopub.status.idle": "2026-09-27T09:41:34.986450Z",
     "shell.execute_reply": "2026-09-27T09:41:34.986239Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Possible duplicate of [100234] (distance=0.0231):\n",
      "Supplier: ABC Logistics AB\n",
      "Country: Sweden\n",
      "City: Stockholm\n",
      "Category: Transportation\n",
      "\n"
     ]
    }
   ],
   "source": [
    "DUPLICATE_THRESHOLD = 0.15  # cosine distance; lower = more similar. Tune on your own data.\n",
    "\n",
    "candidate = \"\"\"\n",
    "Supplier: ABC Logistics A.B.\n",
    "Country: Sweden\n",
    "City: Stockholm\n",
    "Category: Transport\n",
    "\"\"\"\n",
    "\n",
    "candidate_embedding = embed(candidate).tolist()\n",
    "match = collection.query(query_embeddings=[candidate_embedding], n_results=1)\n",
    "\n",
    "nearest_id = match[\"ids\"][0][0]\n",
    "nearest_doc = match[\"documents\"][0][0]\n",
    "nearest_distance = match[\"distances\"][0][0]\n",
    "\n",
    "if nearest_distance <= DUPLICATE_THRESHOLD:\n",
    "    print(f\"Possible duplicate of [{nearest_id}] (distance={nearest_distance:.4f}):{nearest_doc}\")\n",
    "else:\n",
    "    print(f\"No duplicate found. Closest match [{nearest_id}] (distance={nearest_distance:.4f}) is above threshold.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e598d3ab",
   "metadata": {},
   "source": [
    "## Find near-duplicates already in the list\n",
    "\n",
    "Now scan every stored record against its nearest neighbour to find duplicates that are\n",
    "already sitting in the supplier master."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "c93bc996",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-27T09:41:34.987519Z",
     "iopub.status.busy": "2026-09-27T09:41:34.987456Z",
     "iopub.status.idle": "2026-09-27T09:41:35.003649Z",
     "shell.execute_reply": "2026-09-27T09:41:35.003438Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "29 pairs under distance 0.15:\n",
      "\n",
      "[100236] 'Berlin Office Supplies GmbH'            <-> [100250] 'Berlin Office Supplies GmbH'            0.0000\n",
      "[100263] 'nan'                                    <-> [100266] 'nan'                                    0.0000\n",
      "[100263] 'nan'                                    <-> [100275] 'nan'                                    0.0000\n",
      "[100237] 'Sunrise Electronics Ltd'                <-> [100247] 'Sunrise Electronics Limited'            0.0080\n",
      "[100261] 'Acme Industrial Supply, Inc.'           <-> [100262] 'Acme Industrial Supply Inc'             0.0095\n",
      "[100235] 'Nordic Freight Solutions'               <-> [100238] 'Nordic Freight Solutions AS'            0.0103\n",
      "[100235] 'Nordic Freight Solutions'               <-> [100242] 'Nordic Freight Solutions A/S'           0.0196\n",
      "[100234] 'ABC Logistics AB'                       <-> [100239] 'ABC Logistics'                          0.0202\n",
      "[100238] 'Nordic Freight Solutions AS'            <-> [100243] 'Nordic Freight Solution AS'             0.0219\n",
      "[100236] 'Berlin Office Supplies GmbH'            <-> [100244] 'Berlin Office Supplies'                 0.0228\n",
      "[100253] 'Helsinki Steel Oy'                      <-> [100254] 'Helsinki Steel OY'                      0.0228\n",
      "[100236] 'Berlin Office Supplies GmbH'            <-> [100245] 'Berlin Office Supply GmbH'              0.0232\n",
      "[100237] 'Sunrise Electronics Ltd'                <-> [100249] 'SUNRISE ELECTRONICS LTD.'               0.0303\n",
      "[100259] 'Müller & Söhne Maschinenbau GmbH'       <-> [100260] 'Mueller und Soehne Maschinenbau GmbH'   0.0388\n",
      "[100257] 'Rotterdam Chemicals B.V.'               <-> [100258] 'Rotterdam Chemicals BV'                 0.0395\n",
      "[100263] 'nan'                                    <-> [100264] 'TEST'                                   0.0398\n",
      "[100251] 'Fjord Marine Services AS'               <-> [100252] 'Fjord Marine Services'                  0.0429\n",
      "[100255] 'Copenhagen Packaging A/S'               <-> [100256] 'Copenhagen Packaging AS'                0.0478\n",
      "[100234] 'ABC Logistics AB'                       <-> [100241] 'ABC LOGISTICS AB'                       0.0503\n",
      "[100236] 'Berlin Office Supplies GmbH'            <-> [100246] 'Berlin Ofice Supplies GmbH'             0.0615\n",
      "[100234] 'ABC Logistics AB'                       <-> [100240] 'A.B.C. Logistics AB'                    0.0624\n",
      "[100239] 'ABC Logistics'                          <-> [100270] '   '                                    0.0701\n",
      "[100237] 'Sunrise Electronics Ltd'                <-> [100277] 'Sunrise Electronics Ltd'                0.0729\n",
      "[100263] 'nan'                                    <-> [100271] '!!!@@@###'                              0.0735\n",
      "[100263] 'nan'                                    <-> [100274] 'Smith, John (personal)'                 0.0842\n",
      "[100244] 'Berlin Office Supplies'                 <-> [100268] 'DO NOT USE - DUPLICATE'                 0.0857\n",
      "[100263] 'nan'                                    <-> [100278] 'ABC Logistics AB'                       0.0961\n",
      "[100235] 'Nordic Freight Solutions'               <-> [100269] '12345'                                  0.1304\n",
      "[100237] 'Sunrise Electronics Ltd'                <-> [100248] 'Sunrise Electronics'                    0.1304\n"
     ]
    }
   ],
   "source": [
    "def find_near_duplicates(ids_to_scan):\n",
    "    stored = collection.get(ids=ids_to_scan, include=[\"embeddings\", \"documents\"])\n",
    "    seen, pairs = set(), []\n",
    "    for supplier_id, embedding in zip(stored[\"ids\"], stored[\"embeddings\"]):\n",
    "        neighbours = collection.query(query_embeddings=[embedding], n_results=10)\n",
    "        # nearest *other* record that is part of this scan\n",
    "        nearest = next(\n",
    "            (n, d) for n, d in zip(neighbours[\"ids\"][0], neighbours[\"distances\"][0])\n",
    "            if n != supplier_id and n in ids_to_scan\n",
    "        )\n",
    "        pair = tuple(sorted((supplier_id, nearest[0])))\n",
    "        if pair not in seen and nearest[1] <= DUPLICATE_THRESHOLD:\n",
    "            seen.add(pair)\n",
    "            pairs.append((pair, nearest[1]))\n",
    "    return sorted(pairs, key=lambda p: p[1])\n",
    "\n",
    "doc_by_id = {s[\"id\"]: s[\"text\"] for s in SUPPLIERS}\n",
    "name_by_id = dict(zip(suppliers_df[\"id\"], suppliers_df[\"supplier\"]))\n",
    "\n",
    "near_duplicate_pairs = find_near_duplicates([s[\"id\"] for s in SUPPLIERS])\n",
    "\n",
    "print(f\"{len(near_duplicate_pairs)} pairs under distance {DUPLICATE_THRESHOLD}:\\n\")\n",
    "for (a, b), distance in near_duplicate_pairs:\n",
    "    print(f\"[{a}] {str(name_by_id[a])!r:40} <-> [{b}] {str(name_by_id[b])!r:40} {distance:.4f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e9a10128",
   "metadata": {},
   "source": [
    "## Why rules come first\n",
    "\n",
    "Look closely at the list above. Alongside the real duplicates are pairs like a blank name\n",
    "matching *ABC Logistics*, or `12345` matching *Nordic Freight Solutions*. The embedding\n",
    "is built from the whole record, so shared country, city and category pull junk records\n",
    "close to real ones.\n",
    "\n",
    "The fix is cheap and deterministic: filter obvious junk with rules **before** matching."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "d4e2a3d2",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-27T09:41:35.004670Z",
     "iopub.status.busy": "2026-09-27T09:41:35.004616Z",
     "iopub.status.idle": "2026-09-27T09:41:35.015805Z",
     "shell.execute_reply": "2026-09-27T09:41:35.015608Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "junk records set aside for a steward: 13\n",
      "100263 'nan', 100264 'TEST', 100265 'test supplier', 100266 'nan', 100267 'asdfasdf', 100268 'DO NOT USE - DUPLICATE', 100269 '12345', 100270 '   ', 100271 '!!!@@@###', 100272 'Unknown Vendor', 100273 'ZZZ_DELETE_ME', 100275 'nan', 100276 'TBD'\n",
      "\n",
      "21 pairs under distance 0.15 after filtering:\n",
      "\n",
      "[100236] 'Berlin Office Supplies GmbH'            <-> [100250] 'Berlin Office Supplies GmbH'            0.0000\n",
      "[100237] 'Sunrise Electronics Ltd'                <-> [100247] 'Sunrise Electronics Limited'            0.0080\n",
      "[100261] 'Acme Industrial Supply, Inc.'           <-> [100262] 'Acme Industrial Supply Inc'             0.0095\n",
      "[100235] 'Nordic Freight Solutions'               <-> [100238] 'Nordic Freight Solutions AS'            0.0103\n",
      "[100235] 'Nordic Freight Solutions'               <-> [100242] 'Nordic Freight Solutions A/S'           0.0196\n",
      "[100234] 'ABC Logistics AB'                       <-> [100239] 'ABC Logistics'                          0.0202\n",
      "[100238] 'Nordic Freight Solutions AS'            <-> [100243] 'Nordic Freight Solution AS'             0.0219\n",
      "[100236] 'Berlin Office Supplies GmbH'            <-> [100244] 'Berlin Office Supplies'                 0.0228\n",
      "[100253] 'Helsinki Steel Oy'                      <-> [100254] 'Helsinki Steel OY'                      0.0228\n",
      "[100236] 'Berlin Office Supplies GmbH'            <-> [100245] 'Berlin Office Supply GmbH'              0.0232\n",
      "[100237] 'Sunrise Electronics Ltd'                <-> [100249] 'SUNRISE ELECTRONICS LTD.'               0.0303\n",
      "[100259] 'Müller & Söhne Maschinenbau GmbH'       <-> [100260] 'Mueller und Soehne Maschinenbau GmbH'   0.0388\n",
      "[100257] 'Rotterdam Chemicals B.V.'               <-> [100258] 'Rotterdam Chemicals BV'                 0.0395\n",
      "[100251] 'Fjord Marine Services AS'               <-> [100252] 'Fjord Marine Services'                  0.0429\n",
      "[100255] 'Copenhagen Packaging A/S'               <-> [100256] 'Copenhagen Packaging AS'                0.0478\n",
      "[100234] 'ABC Logistics AB'                       <-> [100241] 'ABC LOGISTICS AB'                       0.0503\n",
      "[100236] 'Berlin Office Supplies GmbH'            <-> [100246] 'Berlin Ofice Supplies GmbH'             0.0615\n",
      "[100234] 'ABC Logistics AB'                       <-> [100240] 'A.B.C. Logistics AB'                    0.0624\n",
      "[100237] 'Sunrise Electronics Ltd'                <-> [100277] 'Sunrise Electronics Ltd'                0.0729\n",
      "[100237] 'Sunrise Electronics Ltd'                <-> [100248] 'Sunrise Electronics'                    0.1304\n",
      "[100274] 'Smith, John (personal)'                 <-> [100278] 'ABC Logistics AB'                       0.1466\n"
     ]
    }
   ],
   "source": [
    "import re\n",
    "\n",
    "JUNK_NAMES = {\"\", \"nan\", \"null\", \"n/a\", \"tbd\", \"test\", \"unknown vendor\"}\n",
    "\n",
    "def is_junk(name) -> bool:\n",
    "    n = str(name).strip().lower()\n",
    "    return (\n",
    "        n in JUNK_NAMES\n",
    "        or \"test\" in n\n",
    "        or \"do not use\" in n\n",
    "        or n.startswith(\"zzz\")\n",
    "        or not re.search(r\"[a-z]{3}\", n)          # no real word: '12345', '!!!@@@###'\n",
    "        or re.fullmatch(r\"(.{2,4})\\1+\", n)        # keyboard mash: 'asdfasdf'\n",
    "    )\n",
    "\n",
    "junk_ids = [sid for sid, name in name_by_id.items() if is_junk(name)]\n",
    "clean_ids = [sid for sid in name_by_id if sid not in junk_ids]\n",
    "print(f\"junk records set aside for a steward: {len(junk_ids)}\")\n",
    "print(\", \".join(f\"{sid} {str(name_by_id[sid])!r}\" for sid in junk_ids))\n",
    "\n",
    "near_duplicate_pairs = find_near_duplicates(clean_ids)\n",
    "print(f\"\\n{len(near_duplicate_pairs)} pairs under distance {DUPLICATE_THRESHOLD} after filtering:\\n\")\n",
    "for (a, b), distance in near_duplicate_pairs:\n",
    "    print(f\"[{a}] {str(name_by_id[a])!r:40} <-> [{b}] {str(name_by_id[b])!r:40} {distance:.4f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "824aa712",
   "metadata": {},
   "source": [
    "## Optional: an LLM verdict on the shortlist\n",
    "\n",
    "Two steps: embeddings **shortlist** candidate pairs cheaply, then a local LLM **judges**\n",
    "only those pairs: same company or not, with a reason. Needs [Ollama](https://ollama.com)\n",
    "running at `localhost:11434` with `llama3.2` pulled. In Colab this cell is skipped."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "7bdc7b27",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-27T09:41:35.016783Z",
     "iopub.status.busy": "2026-09-27T09:41:35.016728Z",
     "iopub.status.idle": "2026-09-27T09:42:04.320490Z",
     "shell.execute_reply": "2026-09-27T09:42:04.319973Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[100236] <-> [100250] distance=0.0000\n",
      "  same_supplier=True confidence=1.0 - Identical company name, location, and category\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[100237] <-> [100247] distance=0.0080\n",
      "  same_supplier=True confidence=0.9 - Similar company name with slight difference in capitalization and suffix.\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[100261] <-> [100262] distance=0.0095\n",
      "  same_supplier=True confidence=0.9 - Both names are identical, with minor case difference in the country code.\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[100235] <-> [100238] distance=0.0103\n",
      "  same_supplier=True confidence=0.9 - Both names include 'Nordic Freight Solutions' and match other details.\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[100235] <-> [100242] distance=0.0196\n",
      "  same_supplier=True confidence=0.8 - Similar company names with minor variations in formatting and category\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[100234] <-> [100239] distance=0.0202\n",
      "  same_supplier=True confidence=0.9 - Matching company name and country\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[100238] <-> [100243] distance=0.0219\n",
      "  same_supplier=False confidence=0.8 - Different legal suffixes ('AS' vs 'AS')\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[100236] <-> [100244] distance=0.0228\n",
      "  same_supplier=True confidence=0.9 - Both names contain 'Berlin Office Supplies' and match other details.\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[100253] <-> [100254] distance=0.0228\n",
      "  same_supplier=True confidence=0.9 - Matching company name and country code despite minor differences in capitalization and punctuation.\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[100236] <-> [100245] distance=0.0232\n",
      "  same_supplier=False confidence=0.8 - Different legal suffixes (GmbH vs. GmbH)\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[100237] <-> [100249] distance=0.0303\n",
      "  same_supplier=True confidence=0.9 - Both names are identical, ignoring case and punctuation.\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[100259] <-> [100260] distance=0.0388\n",
      "  same_supplier=True confidence=0.8 - Similar company name with slight case differences\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[100257] <-> [100258] distance=0.0395\n",
      "  same_supplier=True confidence=0.9 - Both names are in title case and include 'Rotterdam Chemicals'.\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[100251] <-> [100252] distance=0.0429\n",
      "  same_supplier=False confidence=0.6 - Different legal suffixes (AS vs no suffix)\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[100255] <-> [100256] distance=0.0478\n",
      "  same_supplier=True confidence=0.8 - Similar company name with slight case difference in city name\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[100234] <-> [100241] distance=0.0503\n",
      "  same_supplier=False confidence=0.8 - Different city names due to case mismatch\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[100236] <-> [100246] distance=0.0615\n",
      "  same_supplier=False confidence=0.8 - Different category and equipment type\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[100234] <-> [100240] distance=0.0624\n",
      "  same_supplier=False confidence=0.8 - Different legal suffixes (AB vs. A.B.C.)\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[100237] <-> [100277] distance=0.0729\n",
      "  same_supplier=True confidence=0.9 - Both records have the same company name, category, and city.\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[100237] <-> [100248] distance=0.1304\n",
      "  same_supplier=False confidence=0.8 - Different city names and missing company suffix\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[100274] <-> [100278] distance=0.1466\n",
      "  same_supplier=False confidence=0.0 - Different company names, no common real-world company found\n",
      "\n"
     ]
    }
   ],
   "source": [
    "import json\n",
    "import requests\n",
    "\n",
    "OLLAMA_URL = \"http://localhost:11434/api/generate\"\n",
    "OLLAMA_MODEL = \"llama3.2\"\n",
    "\n",
    "\n",
    "def llm_verdict(record_a: str, record_b: str) -> dict:\n",
    "    prompt = f\"\"\"You are a master data steward. Decide whether these two supplier records\n",
    "describe the SAME real-world company. Differences in legal suffix, punctuation,\n",
    "casing, abbreviation or country code are not enough to make them different\n",
    "companies. Placeholder, empty or junk names (nan, TEST, TBD, ...) are never a\n",
    "match for a real company.\n",
    "\n",
    "Record A:\n",
    "{record_a.strip()}\n",
    "\n",
    "Record B:\n",
    "{record_b.strip()}\n",
    "\n",
    "Reply with JSON only: {{\"same_supplier\": true or false, \"confidence\": 0.0-1.0, \"reason\": \"one short sentence\"}}\"\"\"\n",
    "    resp = requests.post(\n",
    "        OLLAMA_URL,\n",
    "        json={\"model\": OLLAMA_MODEL, \"prompt\": prompt, \"format\": \"json\", \"stream\": False,\n",
    "              \"options\": {\"temperature\": 0}},\n",
    "        timeout=120,\n",
    "    )\n",
    "    resp.raise_for_status()\n",
    "    return json.loads(resp.json()[\"response\"])\n",
    "\n",
    "\n",
    "try:\n",
    "    requests.get(\"http://localhost:11434/api/tags\", timeout=3)\n",
    "except requests.exceptions.RequestException:\n",
    "    print(\"Ollama is not running here, skipping the LLM step.\")\n",
    "else:\n",
    "    for (a, b), distance in near_duplicate_pairs:\n",
    "        v = llm_verdict(doc_by_id[a], doc_by_id[b])\n",
    "        print(f\"[{a}] <-> [{b}] distance={distance:.4f}\")\n",
    "        print(f\"  same_supplier={v.get('same_supplier')} confidence={v.get('confidence')} - {v.get('reason')}\\n\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ec45befa",
   "metadata": {},
   "source": [
    "## See the embeddings\n",
    "\n",
    "384 numbers can't be plotted, so PCA squeezes them into 2. It's a rough map, but each\n",
    "duplicate group still lands together."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "94718f56",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-27T09:42:04.323001Z",
     "iopub.status.busy": "2026-09-27T09:42:04.322777Z",
     "iopub.status.idle": "2026-09-27T09:42:04.878440Z",
     "shell.execute_reply": "2026-09-27T09:42:04.877925Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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WK6f0TBYYA2f4bDU2U8/DdUlSjFgh4E/9PghIrLFxcPD07ndu2I5zD/DV6FCBcLt7HnlyjVdWsLRGWKKef76a7KWuWMd1KiCD9TIIuIDCz440bsJgRqyi/iAicGe6AQl3cg6IwNvvmwXUWxivBd36vS5VpDEZnhPQOPMEiWK6yDB24bBUGTJ33vPeX0ciOjdwzncRFEMGRlzaNSEKgsGufQ2YD4wysmNDFR0gWqWDh06ytixYxlsE8VC1v8bUf3TunUbzVJHRbBNRBRZLCknimLoBDt//nwtF0azHJRMoykYlikiehswjx1f0QlKVcuUsWxiRESxB0rHsW46lulDk0pMLcPUG0z/ICKKSRhwE0UxNNJD0x80vcLcMcx3/eWXYXLpUtjLZBEREb2rtm7dLC1bttJ55mgMiY7z6IcT3QYHiYjCwzncRERERERERE7AOdxERERERERETsCAm4iIiIiIiMgJGHATEREREREROQEDbiIiIiIiIiInYMBNRERERERE5AQMuImIiIiIiIicgAE3ERERERERkRMw4CYiIiIiIiJyAgbcRERERERERE7AgJuIiIiIiIjICRhwExERERERETlBHGfsNCZydXWToKCgqD4MIiIiIrJTUFBgVB8CEVGYGHD/P9hOnTp7VB8GEREREUWAr683g24iitYYcOvoaHBm+9at88xyExEREUVzLi4uTJYQUYzAgNsMgm2OkhIRERFFd2xDREQxA9+tiIiIiIiIiJyAATcRERERERGREzDgJiIiIiIiInICBtxERERERERETsCAm4iIiIiIiMgJGHATEREREREROQEDbiIiIiIiIiInYMBNRERERERE5AQMuImIiIiIiIicgAE3ERERERERkRMw4CYiIiIiIiJyAgbcRERERERERE7AgJuIiIiIiIjICRhwExERRSNuLi4W34mIiCjmihPVB0BERETBMiRKIi1z5BOvBInE96mfzPY+IT5+j6P6sIiIiCiSGHATERFFMWSzfy37gTTPnldczTLbPQuVlnnnT8rXO9dJQFBQlB4jERERRRwDbiIioiiGYBuZbWsIvnE5Yu3uO9dGybERERFR5HEONxERURTOr0YZOTLbYWmRI6+kT5jEYfdJREREbwcz3ERERHZInyiJtDKbXz3r3HG57v/kjfbp9v8MtnkZuS2a6c6ZV8Yc3cvSciIiohiEATcREVEUza/G7RDA2wPbMdgmIiKKWVhSTkREZMf8ausstDG/elSZD94omEe23B7YjkuFERERxSwMuImIiMIoI7dnfnW6hIkjtX9krOd4n5DAcDLXuH7OuZPMcBMREcUwDLiJiIhsQDa5lZ3zq1vlzBfp7PM1v8damh6Wud4nxcef63ETERHFNJzDTUREFMXzqzEPHDdHttw8wEdmG8F2z13rIr1vIiIiijoMuImIiBw0v/pNmqdhne2RR3bpvPDUCRLqPlFGzsw2ERFRzMWAm4iIKJQgeLb3Ce1GHlZZObLQs8+dcMj8apSXjz66R/f1JgE8ERERRQ+cw01ERBQKHzvnV7/petzmjCCbwTYREVHMx4CbiIjIjNH8zNVsfjUy2NadxI3MNudXExERUWhcPDw8Y/0QuouLq3h55RBfX28JCgqM6sMhIqIoXAYMncnRBA1zqGeePSY3/j+P27jOmF+NYNuRmW0ish8/uxFRTMGAm2/aRESxHrLav5b9QNfcDtkl/IRmufHfwZhXzfnVRFGLn92IKKZg0zQiIor1EGyjO7jtNbbz4+O9dhHn/GoiIiKKCM7hJiKiWA2l4shshwXrY6dLmPitHRMRERG9GxhwExFRrIXScMzLDmvZr9eZ7nymhmpERERE9mDATUREsRZKw9EgzR7YjqXkREREFBEMuImIKNZCxhodx+2B7ZjhJiIioohgwE1ERLEWMtazvUOusW3NWHObGW4iIiKKCAbcREQUq/n4PZZ550+Guc1c75Ncc5uIiIgijMuCERFRrId1tpG8RjfykOtwn5Seu9ZF6fERERFRzOTi4eEZ6+vjXFxcxcsrh/j6ektQUGBUHw4REUXhEmHoWp46QUKds40ycma2iaIffnYjopiCGW4iIiKz8vLRR/foXG00SOOcbSIiInoTnMNNRERkxgiyGWwTERHRm2LATUREREREROQEDLiJiIiIiIiInIABNxEREREREZETMOAmIiIiIiIicgIG3ERERE6CTufm34mIiCh24bJgRERETlzT2ytBIl3Te9a541zTm4iIKJZhwE1ERORAyGb/WvYDaZ49r7iaZbZ7Fiot886flK93ruOSY0RERLEEA24iIiIHQrDdMke+EJcj+MbliLW771wbJcdGREREbxfncBMRETmwjByZ7bC0yJFX0iVM/NaOiYiIiKIOA24iIiIHlZJjzrZ5GbktuL5VznxspEZERBQLMOAmIiJyAMzLRoM0e2A7zuMmIiJ69zHgJiIicgBkrNGN3B7YjhluIiKidx8DbiIiIgdAxnq29wkJDCdzjetnnzvBDDcREVEswICbiIjIQXz8HuvSX2GZ632S63ETERHFElwWjIiIyIGwzjaS1+hGbt5ADZltBNs9d62L0uMjIiKit8fFw8Mz1te0ubi4ipdXDvH19ZagoMCoPhwiInpHlghD1/LUCRLqnG2UkTOzTeQY/OxGRDEFM9xEREROKi8ffXSPztVGgzTO2SYiIop9OIebiIjISYwgm8E2ERFR7MSAm4iIiIiIiMgJGHATEREREREROQEDbiIiIiIiIiInYMBNRERERERE5AQMuImIiIiIiIicgAE3ERERERERkRMw4CYiIiIiIiJyAgbcRERERERERE7AgJuIiIiIiIjICRhwExERERERETkBA24iIiIiIiIiJ2DATUREREREROQEcSQGSJw4qZQuXUXix3eXly9fyO7dm+XRo/uhbl+1al1JkcJTFi6c+laPk4iIiIiIiChGZbhLlqwo58+fkpUr58qpU4eldOnKoW6bO3cBefz40Vs9PiIiIiIiIqIYF3Ajq+3hkUouXTqnv1+9elESJkysWW9rSZOmkAwZsmpQTkRERERERBSVon3AjeD66VN/CQoKMl3m7/9EEiVKbLGdi4urZsL37dsqQUGBYe7T1dVV4sSJa/YVIyrriYiIiIiIKAZ5ZyLN/PmLybVrF+XRowchgnFrefMWkQIFipt+f/XqlWzbtu0tHCURERERERHFFtE+4EY2O0GChOLi4mLKciPr7ef3xGK71KnTaqCdM2d+cXV1kbhx40m9eq1l7dpF8vz5M4ttT548JKdPHzX9jn2nTJnlLT0iIiIiIiIiig2ifcCNYPnevTuSJUtOuXjxrGTMmFX8/f3kyRPLxmgbNiwz/YzAu2bNprJ8+Syb+wwMDNQv83J0IiIiIiIiolgVcAPmZWNZMJSCv3z5Uvbs2ayXY862j89l/SIiIiIiIiKKTlw8PDxfdyOLpZDh9vLKIb6+3uE2XCMiIiKiqMXPbkQUU7CWmoiIiIiIiMgJGHATEREREREROQEDbiIiIiIiIiInYMBNRERERERE5AQMuImIiIiIiIicgAE3ERERERERkRMw4CYiIiIiIiJyAgbcRERERERERE7AgJuIiIiIiIjICRhwExERERERETkBA24iIiIiIiIiJ2DATUREREREROQEDLiJiIiIiIiInIABNxEREREREZETMOAmIiIiIiIicgIG3EREREREREROwICbiIiIiIiIyAkYcBMRERERERE5AQNuIiIiIiIiIidgwE1ERERERETkBAy4iYiIiIiIiJyAATcRERERERGREzDgJiIiIiIiInICBtxERERERERETsCAm4iIiIiIiMgJGHATEREREREROQEDbiIiIiIiIiInYMBNRERERERE5AQMuImIiIiIiIicgAE3ERERERERkRMw4CYiIiIiIiJyAgbcRERERERERE7AgJuIiIiIiIjICRhwExERERERETkBA24iIiIiIiIiJ2DATUREREREROQEDLiJiIiIiIiInIABNxEREREREZETMOAmIiIiIiIicgIG3EREREREREROwICbiIiIiIiIyAkYcBMRERERERE5AQNuIiIiIiIiIidgwE1ERERERETkBAy4iYiIiIiIiJyAATcRERERUTjcXFwsvscUJUqUl169Bpt+//bboZI3byGn32/z5p/IkCF/yKBBv+nvmTNn1/v++ec/pUKFD6RZs4+lbt3m8q7p2rWPVKxYXX/Oli2XDBgwOqoPiaJYnKg+ACIiIiKi6Cx9oiTSKkc+8UqQSHyf+smsc8fluv8TpwRrWbLkkICAAAkKCpIHD+7J6tWL5ciRfQ67j+HD+77R7RMnTip16zbToD1+fHe5d++O7NixUbZvX2/aJmvWnFKwYHEZMqSXPHv2VC+rXbuJHDy4W9atWybOVrlyTSlTpookTZpMXr16KdevX5U5c/6R+/fvyNt04cJZGTSoh0Qn5q8xw9Ch38qjRw+i9LjeZQy4iYiIiIhsQDb717IfSPPsecXVLLPds1BpmXf+pHy9c50EBAU59D6XL58nW7eu1Z8R1H7ySTe5cuWC3L9/N8L7cnV1c+ixubsnlG7dfhAfn8syevQgefjwgWTLllNatfpMUqRIKcuXz9XtUqZMJQ8e3DUF2+DhkUpu3HgdlDtLsWJlpUKFavLXX6Pl5k0fPeY8efKLiGOfp+gmTZr0cvfuLXn58qXF5RkyZJFr1y6F+hoj52PATURERERkA4LtljnyhbgcwTcuR6zdfafzApeTJ4/I06f+kjp1WlPAnSFD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",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "from sklearn.decomposition import PCA\n",
    "\n",
    "# Colour each duplicate group found above (pairs that share a record join into one group)\n",
    "group_of = {sid: sid for sid in clean_ids}\n",
    "def root(x):\n",
    "    while group_of[x] != x:\n",
    "        x = group_of[x]\n",
    "    return x\n",
    "for (a, b), _ in near_duplicate_pairs:\n",
    "    group_of[root(a)] = root(b)\n",
    "groups = {}\n",
    "for sid in clean_ids:\n",
    "    groups.setdefault(root(sid), []).append(sid)\n",
    "groups = [g for g in groups.values() if len(g) > 1]\n",
    "\n",
    "stored = collection.get(ids=clean_ids, include=[\"embeddings\"])\n",
    "xy = PCA(n_components=2).fit_transform(np.vstack([stored[\"embeddings\"], [query_embedding, candidate_embedding]]))\n",
    "pos = dict(zip(stored[\"ids\"], xy[:-2]))\n",
    "\n",
    "BG, INK, MUTED = \"#121214\", \"#f4f4f8\", \"#a1a1b5\"\n",
    "PALETTE = [\"#fb7185\", \"#2dd4bf\", \"#60a5fa\", \"#fbbf24\", \"#b975ff\", \"#a3e635\", \"#f472b6\", \"#ff9d3d\", \"#22d3ee\", \"#e4e4ed\", \"#94a3b8\"]\n",
    "\n",
    "def short(name, limit=24):\n",
    "    out = \"\"\n",
    "    for word in name.split():\n",
    "        if len(out) + len(word) + 1 > limit:\n",
    "            break\n",
    "        out = f\"{out} {word}\".strip()\n",
    "    return out.rstrip(\",&\")\n",
    "\n",
    "def group_label(g):\n",
    "    names = sorted({str(name_by_id[s]).strip() for s in g}, key=len)\n",
    "    first_words = {re.sub(r\"[^a-z]\", \"\", n.split()[0].lower()) for n in names}\n",
    "    if len(first_words) > 1:  # names that don't even start alike: show both\n",
    "        return \" / \".join(short(n, 18) for n in names[:2])\n",
    "    return f\"{short(names[0])}  ×{len(g)}\"\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(10, 6), facecolor=BG)\n",
    "ax.set_facecolor(BG)\n",
    "for spine in ax.spines.values():\n",
    "    spine.set_color(\"#2a2a3a\")\n",
    "ax.tick_params(colors=\"#6b6b7b\", labelsize=8)\n",
    "\n",
    "for colour, g in zip(PALETTE, sorted(groups, key=len, reverse=True)):\n",
    "    pts = np.array([pos[s] for s in g])\n",
    "    ax.scatter(pts[:, 0], pts[:, 1], s=70, color=colour, edgecolor=BG, zorder=3, label=group_label(g))\n",
    "\n",
    "lone = [sid for sid in clean_ids if not any(sid in g for g in groups)]\n",
    "if lone:\n",
    "    pts = np.array([pos[s] for s in lone])\n",
    "    ax.scatter(pts[:, 0], pts[:, 1], s=70, color=\"#6b6b7b\", edgecolor=BG, zorder=2, label=\"no duplicate\")\n",
    "\n",
    "ax.scatter(*xy[-2], marker=\"x\", s=100, color=INK, linewidths=2.5, zorder=4, label=\"search query\")\n",
    "ax.scatter(*xy[-1], marker=\"+\", s=160, color=INK, linewidths=2.5, zorder=4, label=\"new supplier\")\n",
    "\n",
    "legend = ax.legend(loc=\"center left\", bbox_to_anchor=(1.01, 0.5), frameon=False, fontsize=9, labelcolor=MUTED)\n",
    "ax.set_title(\"Supplier embeddings squeezed to 2D (PCA). Each colour is one duplicate group.\", color=INK, loc=\"left\", fontsize=12, pad=12)\n",
    "ax.set_xlabel(\"PC1\", color=\"#6b6b7b\"); ax.set_ylabel(\"PC2\", color=\"#6b6b7b\")\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "57fc476f",
   "metadata": {},
   "source": [
    "## Mini RAG: ask a question in plain words\n",
    "\n",
    "RAG = **R**etrieve, then **G**enerate.\n",
    "\n",
    "1. **Retrieve:** find the records closest to the question (same search as above, junk set aside).\n",
    "2. **Generate:** give only those records to the language model and ask it to answer, citing record ids.\n",
    "\n",
    "The model can only use what retrieval found. If the answer isn't in those records, it should say so."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "9fe90d6c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-27T09:42:04.880725Z",
     "iopub.status.busy": "2026-09-27T09:42:04.880498Z",
     "iopub.status.idle": "2026-09-27T09:42:14.915310Z",
     "shell.execute_reply": "2026-09-27T09:42:14.914806Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "QUESTION: Which Swedish transport suppliers might be duplicates of each other?\n",
      "RETRIEVED:\n",
      "[100239] Supplier: ABC Logistics | Country: Sweden | City: Stockholm | Category: Transportation\n",
      "[100240] Supplier: A.B.C. Logistics AB | Country: SE | City: Stockholm | Category: Transportation\n",
      "[100234] Supplier: ABC Logistics AB | Country: Sweden | City: Stockholm | Category: Transportation\n",
      "[100241] Supplier: ABC LOGISTICS AB | Country: Sweden | City: Stokholm | Category: Transportation\n",
      "[100242] Supplier: Nordic Freight Solutions A/S | Country: Norway | City: Oslo | Category: Transport\n",
      "[100243] Supplier: Nordic Freight Solution AS | Country: NO | City: Oslo | Category: Transportation\n",
      "ANSWER: Based on the records, the following Swedish transport suppliers might be duplicates of each other:\n",
      "\n",
      "* ABC Logistics [100239] and ABC Logistics AB [100234] have the same name and category, but different country codes (SE and SW, respectively).\n",
      "* ABC LOGISTICS AB [100241] has a slightly different name, but the same country code (SW) and category (Transportation) as the other two.\n",
      "* A.B.C. Logistics AB [100240] has a different country code (SE) than the other two, but the same name and category.\n",
      "\n",
      "These suppliers may be duplicates of each other, but the country codes suggest that they may be different entities. \n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "QUESTION: Do we have any suppliers in Finland?\n",
      "RETRIEVED:\n",
      "[100253] Supplier: Helsinki Steel Oy | Country: Finland | City: Helsinki | Category: Raw Materials\n",
      "[100254] Supplier: Helsinki Steel OY | Country: FI | City: Helsinki | Category: Raw Materials\n",
      "[100242] Supplier: Nordic Freight Solutions A/S | Country: Norway | City: Oslo | Category: Transport\n",
      "[100243] Supplier: Nordic Freight Solution AS | Country: NO | City: Oslo | Category: Transportation\n",
      "[100238] Supplier: Nordic Freight Solutions AS | Country: Norway | City: Oslo | Category: Transportation\n",
      "[100235] Supplier: Nordic Freight Solutions | Country: Norway | City: Oslo | Category: Transportation\n",
      "ANSWER: Yes, we have a supplier in Finland. The supplier is Helsinki Steel Oy [100253] and Helsinki Steel OY [100254]. Both records list Finland as the country. \n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "QUESTION: What is the bank account number for ABC Logistics AB?\n",
      "RETRIEVED:\n",
      "[100278] Supplier: ABC Logistics AB | Country: nan | City: nan | Category: nan\n",
      "[100234] Supplier: ABC Logistics AB | Country: Sweden | City: Stockholm | Category: Transportation\n",
      "[100241] Supplier: ABC LOGISTICS AB | Country: Sweden | City: Stokholm | Category: Transportation\n",
      "[100239] Supplier: ABC Logistics | Country: Sweden | City: Stockholm | Category: Transportation\n",
      "[100240] Supplier: A.B.C. Logistics AB | Country: SE | City: Stockholm | Category: Transportation\n",
      "[100261] Supplier: Acme Industrial Supply, Inc. | Country: United States | City: Chicago | Category: Manufacturing\n",
      "ANSWER: Not in these records. The records do not contain the bank account number for ABC Logistics AB. \n",
      "\n"
     ]
    }
   ],
   "source": [
    "def ask(question, n=6):\n",
    "    # 1. Retrieve: nearest clean records to the question\n",
    "    hits = collection.query(query_embeddings=[embed(question).tolist()], n_results=n + len(junk_ids))\n",
    "    top = [i for i in hits[\"ids\"][0] if i in clean_ids][:n]\n",
    "    records = \"\\n\".join(f\"[{i}] \" + \" | \".join(doc_by_id[i].strip().splitlines()) for i in top)\n",
    "\n",
    "    # 2. Generate: the model answers from those records only\n",
    "    prompt = f\"\"\"Answer the question using ONLY the supplier records below.\n",
    "Cite record ids in [brackets]. If the records don't contain the answer, say \"Not in these records.\"\n",
    "\n",
    "Records:\n",
    "{records}\n",
    "\n",
    "Question: {question}\n",
    "Answer in at most 4 short sentences.\"\"\"\n",
    "    resp = requests.post(\n",
    "        OLLAMA_URL,\n",
    "        json={\"model\": OLLAMA_MODEL, \"prompt\": prompt, \"stream\": False, \"options\": {\"temperature\": 0}},\n",
    "        timeout=120,\n",
    "    )\n",
    "    resp.raise_for_status()\n",
    "    return records, resp.json()[\"response\"].strip()\n",
    "\n",
    "\n",
    "try:\n",
    "    requests.get(\"http://localhost:11434/api/tags\", timeout=3)\n",
    "except requests.exceptions.RequestException:\n",
    "    print(\"Ollama is not running here, skipping the RAG step.\")\n",
    "else:\n",
    "    for question in [\n",
    "        \"Which Swedish transport suppliers might be duplicates of each other?\",\n",
    "        \"Do we have any suppliers in Finland?\",\n",
    "        \"What is the bank account number for ABC Logistics AB?\",\n",
    "    ]:\n",
    "        records, answer = ask(question)\n",
    "        print(\"QUESTION:\", question)\n",
    "        print(\"RETRIEVED:\\n\" + records)\n",
    "        print(\"ANSWER:\", answer, \"\\n\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3be5e4f9",
   "metadata": {},
   "source": [
    "## Scaling beyond this demo\n",
    "\n",
    "`chromadb` in memory is fine for a demo. For a real supplier master:\n",
    "\n",
    "| Approach | When to reach for it | Trade-off |\n",
    "|---|---|---|\n",
    "| **ChromaDB** | Prototypes, under ~100k records | Single process, no sharding or replication |\n",
    "| **Postgres + pgvector** | You already run Postgres | Handles tens of millions of vectors with an HNSW index |\n",
    "| **Qdrant, Milvus** | Tens of millions of vectors, high query rates | Another service to run |\n",
    "| **Managed (Pinecone, etc.)** | Same scale, no infrastructure | External dependency and ongoing cost |\n",
    "\n",
    "The per-record query loop above is also one query per supplier. At scale, block first\n",
    "(same country, same tax-ID prefix) and batch the queries."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}