{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 🧠 HRHUB v2.1 - Enhanced with LLM (FREE VERSION)\n", "\n", "## πŸ“˜ Project Overview\n", "\n", "**Bilateral HR Matching System with LLM-Powered Intelligence**\n", "\n", "### What's New in v2.1:\n", "- βœ… **FREE LLM**: Using Hugging Face Inference API (no cost)\n", "- βœ… **Job Level Classification**: Zero-shot & few-shot learning\n", "- βœ… **Structured Skills Extraction**: Pydantic schemas\n", "- βœ… **Match Explainability**: LLM-generated reasoning\n", "- βœ… **Flexible Data Loading**: Upload OR Google Drive\n", "\n", "### Tech Stack:\n", "```\n", "Embeddings: sentence-transformers (local, free)\n", "LLM: Hugging Face Inference API (free tier)\n", "Schemas: Pydantic\n", "Platform: Google Colab β†’ VS Code\n", "```\n", "\n", "---\n", "\n", "**Master's Thesis - Aalborg University** \n", "*Business Data Science Program* \n", "*December 2025*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## πŸ“¦ Step 1: Install Dependencies" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "βœ… All packages installed!\n" ] } ], "source": [ "# Install required packages\n", "#!pip install -q sentence-transformers huggingface-hub pydantic plotly pyvis nbformat scikit-learn pandas numpy\n", "\n", "print(\"βœ… All packages installed!\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## πŸ“š Step 2: Import Libraries" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "βœ… Environment variables loaded from .env\n", "βœ… All libraries imported!\n" ] } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "import json\n", "import os\n", "from typing import List, Dict, Optional, Literal\n", "import warnings\n", "warnings.filterwarnings('ignore')\n", "\n", "# ML & NLP\n", "from sentence_transformers import SentenceTransformer\n", "from sklearn.metrics.pairwise import cosine_similarity\n", "\n", "# LLM Integration (FREE)\n", "from huggingface_hub import InferenceClient\n", "from pydantic import BaseModel, Field\n", "\n", "# Visualization\n", "import plotly.graph_objects as go\n", "from IPython.display import HTML, display\n", "\n", "# Configuration Settings\n", "from dotenv import load_dotenv\n", "\n", "# Carrega variΓ‘veis do .env\n", "load_dotenv()\n", "print(\"βœ… Environment variables loaded from .env\")\n", "# ============== ATΓ‰ AQUI ⬆️ ==============\n", "\n", "print(\"βœ… All libraries imported!\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## πŸ”§ Step 3: Configuration" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "βœ… Configuration loaded!\n", "🧠 Embedding model: all-MiniLM-L6-v2\n", "πŸ€– LLM model: meta-llama/Llama-3.2-3B-Instruct\n", "πŸ”‘ HF Token configured: Yes βœ…\n", "πŸ“‚ Data path: ../csv_files/\n" ] } ], "source": [ "class Config:\n", " \"\"\"Centralized configuration for VS Code\"\"\"\n", " \n", " # Paths - VS Code structure\n", " CSV_PATH = '../csv_files/'\n", " PROCESSED_PATH = '../processed/'\n", " RESULTS_PATH = '../results/'\n", " \n", " # Embedding Model\n", " EMBEDDING_MODEL = 'all-MiniLM-L6-v2'\n", " \n", " # LLM Settings (FREE - Hugging Face)\n", " HF_TOKEN = os.getenv('HF_TOKEN', '') # βœ… Pega do .env\n", " LLM_MODEL = 'meta-llama/Llama-3.2-3B-Instruct'\n", " \n", " LLM_MAX_TOKENS = 1000\n", " \n", " # Matching Parameters\n", " TOP_K_MATCHES = 10\n", " SIMILARITY_THRESHOLD = 0.5\n", " RANDOM_SEED = 42\n", "\n", "np.random.seed(Config.RANDOM_SEED)\n", "\n", "print(\"βœ… Configuration loaded!\")\n", "print(f\"🧠 Embedding model: {Config.EMBEDDING_MODEL}\")\n", "print(f\"πŸ€– LLM model: {Config.LLM_MODEL}\")\n", "print(f\"πŸ”‘ HF Token configured: {'Yes βœ…' if Config.HF_TOKEN else 'No ⚠️'}\")\n", "print(f\"πŸ“‚ Data path: {Config.CSV_PATH}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## πŸ“Š Step 5: Load All Datasets" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "πŸ“‚ Loading all datasets...\n", "\n", "======================================================================\n", "βœ… Candidates: 9,544 rows Γ— 35 columns\n", "βœ… Companies (base): 24,473 rows\n", "βœ… Company industries: 24,375 rows\n", "βœ… Company specialties: 169,387 rows\n", "βœ… Employee counts: 35,787 rows\n", "βœ… Postings: 123,849 rows Γ— 31 columns\n", "βœ… Job skills: 213,768 rows\n", "βœ… Job industries: 164,808 rows\n", "\n", "======================================================================\n", "βœ… All datasets loaded successfully!\n", "\n" ] } ], "source": [ "print(\"πŸ“‚ Loading all datasets...\\n\")\n", "print(\"=\" * 70)\n", "\n", "# Load main datasets\n", "candidates = pd.read_csv(f'{Config.CSV_PATH}resume_data.csv')\n", "print(f\"βœ… Candidates: {len(candidates):,} rows Γ— {len(candidates.columns)} columns\")\n", "\n", "companies_base = pd.read_csv(f'{Config.CSV_PATH}companies.csv')\n", "print(f\"βœ… Companies (base): {len(companies_base):,} rows\")\n", "\n", "company_industries = pd.read_csv(f'{Config.CSV_PATH}company_industries.csv')\n", "print(f\"βœ… Company industries: {len(company_industries):,} rows\")\n", "\n", "company_specialties = pd.read_csv(f'{Config.CSV_PATH}company_specialities.csv')\n", "print(f\"βœ… Company specialties: {len(company_specialties):,} rows\")\n", "\n", "employee_counts = pd.read_csv(f'{Config.CSV_PATH}employee_counts.csv')\n", "print(f\"βœ… Employee counts: {len(employee_counts):,} rows\")\n", "\n", "postings = pd.read_csv(f'{Config.CSV_PATH}postings.csv', on_bad_lines='skip', engine='python')\n", "print(f\"βœ… Postings: {len(postings):,} rows Γ— {len(postings.columns)} columns\")\n", "\n", "# Optional datasets\n", "try:\n", " job_skills = pd.read_csv(f'{Config.CSV_PATH}job_skills.csv')\n", " print(f\"βœ… Job skills: {len(job_skills):,} rows\")\n", "except:\n", " job_skills = None\n", " print(\"⚠️ Job skills not found (optional)\")\n", "\n", "try:\n", " job_industries = pd.read_csv(f'{Config.CSV_PATH}job_industries.csv')\n", " print(f\"βœ… Job industries: {len(job_industries):,} rows\")\n", "except:\n", " job_industries = None\n", " print(\"⚠️ Job industries not found (optional)\")\n", "\n", "print(\"\\n\" + \"=\" * 70)\n", "print(\"βœ… All datasets loaded successfully!\\n\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## πŸ”— Step 6: Merge & Enrich Company Data" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "πŸ”— Merging company data...\n", "\n", "βœ… Aggregated industries for 24,365 companies\n", "βœ… Aggregated specialties for 17,780 companies\n", "\n", "βœ… Base company merge complete: 35,787 companies\n", "\n" ] } ], "source": [ "print(\"πŸ”— Merging company data...\\n\")\n", "\n", "# Aggregate industries\n", "company_industries_agg = company_industries.groupby('company_id')['industry'].apply(\n", " lambda x: ', '.join(map(str, x.tolist()))\n", ").reset_index()\n", "company_industries_agg.columns = ['company_id', 'industries_list']\n", "print(f\"βœ… Aggregated industries for {len(company_industries_agg):,} companies\")\n", "\n", "# Aggregate specialties\n", "company_specialties_agg = company_specialties.groupby('company_id')['speciality'].apply(\n", " lambda x: ' | '.join(x.astype(str).tolist())\n", ").reset_index()\n", "company_specialties_agg.columns = ['company_id', 'specialties_list']\n", "print(f\"βœ… Aggregated specialties for {len(company_specialties_agg):,} companies\")\n", "\n", "# Merge all company data\n", "companies_merged = companies_base.copy()\n", "companies_merged = companies_merged.merge(company_industries_agg, on='company_id', how='left')\n", "companies_merged = companies_merged.merge(company_specialties_agg, on='company_id', how='left')\n", "companies_merged = companies_merged.merge(employee_counts, on='company_id', how='left')\n", "\n", "print(f\"\\nβœ… Base company merge complete: {len(companies_merged):,} companies\\n\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## πŸŒ‰ Step 7: Enrich with Job Postings" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "πŸŒ‰ Enriching companies with job posting data...\n", "\n", "======================================================================\n", "KEY INSIGHT: Postings = 'Requirements Language Bridge'\n", "======================================================================\n", "\n", "βœ… Enriched 35,787 companies with posting data\n", "\n" ] } ], "source": [ "print(\"πŸŒ‰ Enriching companies with job posting data...\\n\")\n", "print(\"=\" * 70)\n", "print(\"KEY INSIGHT: Postings = 'Requirements Language Bridge'\")\n", "print(\"=\" * 70 + \"\\n\")\n", "\n", "postings = postings.fillna('')\n", "postings['company_id'] = postings['company_id'].astype(str)\n", "\n", "# Aggregate postings per company\n", "postings_agg = postings.groupby('company_id').agg({\n", " 'title': lambda x: ' | '.join(x.astype(str).tolist()[:10]),\n", " 'description': lambda x: ' '.join(x.astype(str).tolist()[:5]),\n", " 'skills_desc': lambda x: ' | '.join(x.dropna().astype(str).tolist()),\n", " 'formatted_experience_level': lambda x: ' | '.join(x.dropna().unique().astype(str)),\n", "}).reset_index()\n", "\n", "postings_agg.columns = ['company_id', 'posted_job_titles', 'posted_descriptions', 'required_skills', 'experience_levels']\n", "\n", "companies_merged['company_id'] = companies_merged['company_id'].astype(str)\n", "companies_full = companies_merged.merge(postings_agg, on='company_id', how='left').fillna('')\n", "\n", "print(f\"βœ… Enriched {len(companies_full):,} companies with posting data\\n\")" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
company_idnamedescriptioncompany_sizestatecountrycityzip_codeaddressurlindustries_listspecialties_listemployee_countfollower_counttime_recordedposted_job_titlesposted_descriptionsrequired_skillsexperience_levels
01009IBMAt IBM, we do more than work. We create. We cr...7.0NYUSArmonk, New York10504International Business Machines Corp.https://www.linkedin.com/company/ibmIT Services and IT ConsultingCloud | Mobile | Cognitive | Security | Resear...314102162536251712378162
11009IBMAt IBM, we do more than work. We create. We cr...7.0NYUSArmonk, New York10504International Business Machines Corp.https://www.linkedin.com/company/ibmIT Services and IT ConsultingCloud | Mobile | Cognitive | Security | Resear...313142163094641713392385
21009IBMAt IBM, we do more than work. We create. We cr...7.0NYUSArmonk, New York10504International Business Machines Corp.https://www.linkedin.com/company/ibmIT Services and IT ConsultingCloud | Mobile | Cognitive | Security | Resear...313147163099851713402495
31009IBMAt IBM, we do more than work. We create. We cr...7.0NYUSArmonk, New York10504International Business Machines Corp.https://www.linkedin.com/company/ibmIT Services and IT ConsultingCloud | Mobile | Cognitive | Security | Resear...311223163148461713501255
41016GE HealthCareEvery day millions of people feel the impact o...7.00USChicago0-https://www.linkedin.com/company/gehealthcareHospitals and Health CareHealthcare | Biotechnology5687321853681712382540
\n", "
" ], "text/plain": [ " company_id name \\\n", "0 1009 IBM \n", "1 1009 IBM \n", "2 1009 IBM \n", "3 1009 IBM \n", "4 1016 GE HealthCare \n", "\n", " description company_size state \\\n", "0 At IBM, we do more than work. We create. We cr... 7.0 NY \n", "1 At IBM, we do more than work. We create. We cr... 7.0 NY \n", "2 At IBM, we do more than work. We create. We cr... 7.0 NY \n", "3 At IBM, we do more than work. We create. We cr... 7.0 NY \n", "4 Every day millions of people feel the impact o... 7.0 0 \n", "\n", " country city zip_code address \\\n", "0 US Armonk, New York 10504 International Business Machines Corp. \n", "1 US Armonk, New York 10504 International Business Machines Corp. \n", "2 US Armonk, New York 10504 International Business Machines Corp. \n", "3 US Armonk, New York 10504 International Business Machines Corp. \n", "4 US Chicago 0 - \n", "\n", " url \\\n", "0 https://www.linkedin.com/company/ibm \n", "1 https://www.linkedin.com/company/ibm \n", "2 https://www.linkedin.com/company/ibm \n", "3 https://www.linkedin.com/company/ibm \n", "4 https://www.linkedin.com/company/gehealthcare \n", "\n", " industries_list \\\n", "0 IT Services and IT Consulting \n", "1 IT Services and IT Consulting \n", "2 IT Services and IT Consulting \n", "3 IT Services and IT Consulting \n", "4 Hospitals and Health Care \n", "\n", " specialties_list employee_count \\\n", "0 Cloud | Mobile | Cognitive | Security | Resear... 314102 \n", "1 Cloud | Mobile | Cognitive | Security | Resear... 313142 \n", "2 Cloud | Mobile | Cognitive | Security | Resear... 313147 \n", "3 Cloud | Mobile | Cognitive | Security | Resear... 311223 \n", "4 Healthcare | Biotechnology 56873 \n", "\n", " follower_count time_recorded posted_job_titles posted_descriptions \\\n", "0 16253625 1712378162 \n", "1 16309464 1713392385 \n", "2 16309985 1713402495 \n", "3 16314846 1713501255 \n", "4 2185368 1712382540 \n", "\n", " required_skills experience_levels \n", "0 \n", "1 \n", "2 \n", "3 \n", "4 " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "companies_full.head()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "================================================================================\n", "πŸ” DUPLICATE DETECTION REPORT\n", "================================================================================\n", "\n", "β”Œβ”€ πŸ“Š resume_data.csv (Candidates)\n", "β”‚ Primary Key: Resume_ID\n", "β”‚ Total rows: 9,544\n", "β”‚ Unique rows: 9,544\n", "β”‚ Duplicates: 0\n", "β”‚ Status: βœ… CLEAN\n", "└─\n", "\n", "β”Œβ”€ πŸ“Š companies.csv (Companies Base)\n", "β”‚ Primary Key: company_id\n", "β”‚ Total rows: 24,473\n", "β”‚ Unique rows: 24,473\n", "β”‚ Duplicates: 0\n", "β”‚ Status: βœ… CLEAN\n", "└─\n", "\n", "β”Œβ”€ πŸ“Š company_industries.csv\n", "β”‚ Primary Key: company_id + industry\n", "β”‚ Total rows: 24,375\n", "β”‚ Unique rows: 24,375\n", "β”‚ Duplicates: 0\n", "β”‚ Status: βœ… CLEAN\n", "└─\n", "\n", "β”Œβ”€ πŸ“Š company_specialities.csv\n", "β”‚ Primary Key: company_id + speciality\n", "β”‚ Total rows: 169,387\n", "β”‚ Unique rows: 169,387\n", "β”‚ Duplicates: 0\n", "β”‚ Status: βœ… CLEAN\n", "└─\n", "\n", "β”Œβ”€ πŸ“Š employee_counts.csv\n", "β”‚ Primary Key: company_id\n", "β”‚ Total rows: 35,787\n", "β”‚ Unique rows: 24,473\n", "β”‚ Duplicates: 11,314\n", "β”‚ Status: πŸ”΄ HAS DUPLICATES\n", "└─\n", "\n", "β”Œβ”€ πŸ“Š postings.csv (Job Postings)\n", "β”‚ Primary Key: job_id\n", "β”‚ Total rows: 123,849\n", "β”‚ Unique rows: 123,849\n", "β”‚ Duplicates: 0\n", "β”‚ Status: βœ… CLEAN\n", "└─\n", "\n", "β”Œβ”€ πŸ“Š companies_full (After Enrichment)\n", "β”‚ Primary Key: company_id\n", "β”‚ Total rows: 35,787\n", "β”‚ Unique rows: 24,473\n", "β”‚ Duplicates: 11,314\n", "β”‚ Status: πŸ”΄ HAS DUPLICATES\n", "β”‚\n", "β”‚ Top duplicate company_ids:\n", "β”‚ - 33242739 (Confidential): 13 times\n", "β”‚ - 5235 (LHH): 13 times\n", "β”‚ - 79383535 (Akkodis): 12 times\n", "β”‚ - 1681 (Robert Half): 12 times\n", "β”‚ - 220336 (Hyatt Hotels Corporation): 11 times\n", "└─\n", "\n", "================================================================================\n", "πŸ“Š SUMMARY\n", "================================================================================\n", "\n", "βœ… Clean datasets: 5/7\n", "πŸ”΄ Datasets with duplicates: 2/7\n", "πŸ—‘οΈ Total duplicates found: 22,628 rows\n", "\n", "⚠️ DUPLICATES DETECTED!\n", "================================================================================\n" ] } ], "source": [ "## πŸ” Data Quality Check - Duplicate Detection\n", "\n", "\"\"\"\n", "Checking for duplicates in all datasets based on primary keys.\n", "This cell only REPORTS duplicates, does not modify data.\n", "\"\"\"\n", "\n", "print(\"=\" * 80)\n", "print(\"πŸ” DUPLICATE DETECTION REPORT\")\n", "print(\"=\" * 80)\n", "print()\n", "\n", "# Define primary keys for each dataset\n", "duplicate_report = []\n", "\n", "# 1. Candidates\n", "print(\"β”Œβ”€ πŸ“Š resume_data.csv (Candidates)\")\n", "print(f\"β”‚ Primary Key: Resume_ID\")\n", "cand_total = len(candidates)\n", "cand_unique = candidates['Resume_ID'].nunique() if 'Resume_ID' in candidates.columns else len(candidates)\n", "cand_dups = cand_total - cand_unique\n", "print(f\"β”‚ Total rows: {cand_total:,}\")\n", "print(f\"β”‚ Unique rows: {cand_unique:,}\")\n", "print(f\"β”‚ Duplicates: {cand_dups:,}\")\n", "print(f\"β”‚ Status: {'βœ… CLEAN' if cand_dups == 0 else 'πŸ”΄ HAS DUPLICATES'}\")\n", "print(\"└─\\n\")\n", "duplicate_report.append(('Candidates', cand_total, cand_unique, cand_dups))\n", "\n", "# 2. Companies Base\n", "print(\"β”Œβ”€ πŸ“Š companies.csv (Companies Base)\")\n", "print(f\"β”‚ Primary Key: company_id\")\n", "comp_total = len(companies_base)\n", "comp_unique = companies_base['company_id'].nunique()\n", "comp_dups = comp_total - comp_unique\n", "print(f\"β”‚ Total rows: {comp_total:,}\")\n", "print(f\"β”‚ Unique rows: {comp_unique:,}\")\n", "print(f\"β”‚ Duplicates: {comp_dups:,}\")\n", "print(f\"β”‚ Status: {'βœ… CLEAN' if comp_dups == 0 else 'πŸ”΄ HAS DUPLICATES'}\")\n", "if comp_dups > 0:\n", " dup_ids = companies_base[companies_base.duplicated('company_id', keep=False)]['company_id'].value_counts().head(3)\n", " print(f\"β”‚ Top duplicates:\")\n", " for cid, count in dup_ids.items():\n", " print(f\"β”‚ - company_id={cid}: {count} times\")\n", "print(\"└─\\n\")\n", "duplicate_report.append(('Companies Base', comp_total, comp_unique, comp_dups))\n", "\n", "# 3. Company Industries\n", "print(\"β”Œβ”€ πŸ“Š company_industries.csv\")\n", "print(f\"β”‚ Primary Key: company_id + industry\")\n", "ci_total = len(company_industries)\n", "ci_unique = len(company_industries.drop_duplicates(subset=['company_id', 'industry']))\n", "ci_dups = ci_total - ci_unique\n", "print(f\"β”‚ Total rows: {ci_total:,}\")\n", "print(f\"β”‚ Unique rows: {ci_unique:,}\")\n", "print(f\"β”‚ Duplicates: {ci_dups:,}\")\n", "print(f\"β”‚ Status: {'βœ… CLEAN' if ci_dups == 0 else 'πŸ”΄ HAS DUPLICATES'}\")\n", "print(\"└─\\n\")\n", "duplicate_report.append(('Company Industries', ci_total, ci_unique, ci_dups))\n", "\n", "# 4. Company Specialties\n", "print(\"β”Œβ”€ πŸ“Š company_specialities.csv\")\n", "print(f\"β”‚ Primary Key: company_id + speciality\")\n", "cs_total = len(company_specialties)\n", "cs_unique = len(company_specialties.drop_duplicates(subset=['company_id', 'speciality']))\n", "cs_dups = cs_total - cs_unique\n", "print(f\"β”‚ Total rows: {cs_total:,}\")\n", "print(f\"β”‚ Unique rows: {cs_unique:,}\")\n", "print(f\"β”‚ Duplicates: {cs_dups:,}\")\n", "print(f\"β”‚ Status: {'βœ… CLEAN' if cs_dups == 0 else 'πŸ”΄ HAS DUPLICATES'}\")\n", "print(\"└─\\n\")\n", "duplicate_report.append(('Company Specialties', cs_total, cs_unique, cs_dups))\n", "\n", "# 5. Employee Counts\n", "print(\"β”Œβ”€ πŸ“Š employee_counts.csv\")\n", "print(f\"β”‚ Primary Key: company_id\")\n", "ec_total = len(employee_counts)\n", "ec_unique = employee_counts['company_id'].nunique()\n", "ec_dups = ec_total - ec_unique\n", "print(f\"β”‚ Total rows: {ec_total:,}\")\n", "print(f\"β”‚ Unique rows: {ec_unique:,}\")\n", "print(f\"β”‚ Duplicates: {ec_dups:,}\")\n", "print(f\"β”‚ Status: {'βœ… CLEAN' if ec_dups == 0 else 'πŸ”΄ HAS DUPLICATES'}\")\n", "print(\"└─\\n\")\n", "duplicate_report.append(('Employee Counts', ec_total, ec_unique, ec_dups))\n", "\n", "# 6. Postings\n", "print(\"β”Œβ”€ πŸ“Š postings.csv (Job Postings)\")\n", "print(f\"β”‚ Primary Key: job_id\")\n", "if 'job_id' in postings.columns:\n", " post_total = len(postings)\n", " post_unique = postings['job_id'].nunique()\n", " post_dups = post_total - post_unique\n", "else:\n", " post_total = len(postings)\n", " post_unique = len(postings.drop_duplicates())\n", " post_dups = post_total - post_unique\n", "print(f\"β”‚ Total rows: {post_total:,}\")\n", "print(f\"β”‚ Unique rows: {post_unique:,}\")\n", "print(f\"β”‚ Duplicates: {post_dups:,}\")\n", "print(f\"β”‚ Status: {'βœ… CLEAN' if post_dups == 0 else 'πŸ”΄ HAS DUPLICATES'}\")\n", "print(\"└─\\n\")\n", "duplicate_report.append(('Postings', post_total, post_unique, post_dups))\n", "\n", "# 7. Companies Full (After Merge)\n", "print(\"β”Œβ”€ πŸ“Š companies_full (After Enrichment)\")\n", "print(f\"β”‚ Primary Key: company_id\")\n", "cf_total = len(companies_full)\n", "cf_unique = companies_full['company_id'].nunique()\n", "cf_dups = cf_total - cf_unique\n", "print(f\"β”‚ Total rows: {cf_total:,}\")\n", "print(f\"β”‚ Unique rows: {cf_unique:,}\")\n", "print(f\"β”‚ Duplicates: {cf_dups:,}\")\n", "print(f\"β”‚ Status: {'βœ… CLEAN' if cf_dups == 0 else 'πŸ”΄ HAS DUPLICATES'}\")\n", "if cf_dups > 0:\n", " dup_ids = companies_full[companies_full.duplicated('company_id', keep=False)]['company_id'].value_counts().head(5)\n", " print(f\"β”‚\")\n", " print(f\"β”‚ Top duplicate company_ids:\")\n", " for cid, count in dup_ids.items():\n", " comp_name = companies_full[companies_full['company_id'] == cid]['name'].iloc[0]\n", " print(f\"β”‚ - {cid} ({comp_name}): {count} times\")\n", "print(\"└─\\n\")\n", "duplicate_report.append(('Companies Full', cf_total, cf_unique, cf_dups))\n", "\n", "# Summary\n", "print(\"=\" * 80)\n", "print(\"πŸ“Š SUMMARY\")\n", "print(\"=\" * 80)\n", "print()\n", "\n", "total_dups = sum(r[3] for r in duplicate_report)\n", "clean_datasets = sum(1 for r in duplicate_report if r[3] == 0)\n", "dirty_datasets = len(duplicate_report) - clean_datasets\n", "\n", "print(f\"βœ… Clean datasets: {clean_datasets}/{len(duplicate_report)}\")\n", "print(f\"πŸ”΄ Datasets with duplicates: {dirty_datasets}/{len(duplicate_report)}\")\n", "print(f\"πŸ—‘οΈ Total duplicates found: {total_dups:,} rows\")\n", "print()\n", "\n", "if dirty_datasets > 0:\n", " print(\"⚠️ DUPLICATES DETECTED!\")\n", "else:\n", " print(\"βœ… All datasets are clean! No duplicates found.\")\n", "\n", "print(\"=\" * 80)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "🧹 CLEANING DUPLICATES...\n", "\n", "================================================================================\n", "βœ… companies_base: Already clean\n", "\n", "βœ… company_industries: Already clean\n", "\n", "βœ… company_specialties: Already clean\n", "\n", "βœ… employee_counts:\n", " Removed 11,314 duplicates\n", " 35,787 β†’ 24,473 rows\n", "\n", "βœ… postings: Already clean\n", "\n", "βœ… companies_full:\n", " Removed 11,314 duplicates\n", " 35,787 β†’ 24,473 rows\n", "\n", "================================================================================\n", "βœ… DATA CLEANING COMPLETE!\n", "================================================================================\n", "\n", "πŸ“Š Total duplicates removed: 22,628 rows\n", "\n", "Cleaned datasets:\n", " - employee_counts: 35,787 β†’ 24,473\n", " - companies_full: 35,787 β†’ 24,473\n" ] } ], "source": [ "\"\"\"\n", "## 🧹 Data Cleaning - Remove Duplicates\n", "\n", "Based on the report above, removing duplicates from datasets.\n", "\"\"\"\n", "\n", "print(\"🧹 CLEANING DUPLICATES...\\n\")\n", "print(\"=\" * 80)\n", "\n", "# Store original counts\n", "original_counts = {}\n", "\n", "# 1. Clean Companies Base (if needed)\n", "if len(companies_base) != companies_base['company_id'].nunique():\n", " original_counts['companies_base'] = len(companies_base)\n", " companies_base = companies_base.drop_duplicates(subset=['company_id'], keep='first')\n", " removed = original_counts['companies_base'] - len(companies_base)\n", " print(f\"βœ… companies_base:\")\n", " print(f\" Removed {removed:,} duplicates\")\n", " print(f\" {original_counts['companies_base']:,} β†’ {len(companies_base):,} rows\\n\")\n", "else:\n", " print(f\"βœ… companies_base: Already clean\\n\")\n", "\n", "# 2. Clean Company Industries (if needed)\n", "if len(company_industries) != len(company_industries.drop_duplicates(subset=['company_id', 'industry'])):\n", " original_counts['company_industries'] = len(company_industries)\n", " company_industries = company_industries.drop_duplicates(subset=['company_id', 'industry'], keep='first')\n", " removed = original_counts['company_industries'] - len(company_industries)\n", " print(f\"βœ… company_industries:\")\n", " print(f\" Removed {removed:,} duplicates\")\n", " print(f\" {original_counts['company_industries']:,} β†’ {len(company_industries):,} rows\\n\")\n", "else:\n", " print(f\"βœ… company_industries: Already clean\\n\")\n", "\n", "# 3. Clean Company Specialties (if needed)\n", "if len(company_specialties) != len(company_specialties.drop_duplicates(subset=['company_id', 'speciality'])):\n", " original_counts['company_specialties'] = len(company_specialties)\n", " company_specialties = company_specialties.drop_duplicates(subset=['company_id', 'speciality'], keep='first')\n", " removed = original_counts['company_specialties'] - len(company_specialties)\n", " print(f\"βœ… company_specialties:\")\n", " print(f\" Removed {removed:,} duplicates\")\n", " print(f\" {original_counts['company_specialties']:,} β†’ {len(company_specialties):,} rows\\n\")\n", "else:\n", " print(f\"βœ… company_specialties: Already clean\\n\")\n", "\n", "# 4. Clean Employee Counts (if needed)\n", "if len(employee_counts) != employee_counts['company_id'].nunique():\n", " original_counts['employee_counts'] = len(employee_counts)\n", " employee_counts = employee_counts.drop_duplicates(subset=['company_id'], keep='first')\n", " removed = original_counts['employee_counts'] - len(employee_counts)\n", " print(f\"βœ… employee_counts:\")\n", " print(f\" Removed {removed:,} duplicates\")\n", " print(f\" {original_counts['employee_counts']:,} β†’ {len(employee_counts):,} rows\\n\")\n", "else:\n", " print(f\"βœ… employee_counts: Already clean\\n\")\n", "\n", "# 5. Clean Postings (if needed)\n", "if 'job_id' in postings.columns:\n", " if len(postings) != postings['job_id'].nunique():\n", " original_counts['postings'] = len(postings)\n", " postings = postings.drop_duplicates(subset=['job_id'], keep='first')\n", " removed = original_counts['postings'] - len(postings)\n", " print(f\"βœ… postings:\")\n", " print(f\" Removed {removed:,} duplicates\")\n", " print(f\" {original_counts['postings']:,} β†’ {len(postings):,} rows\\n\")\n", " else:\n", " print(f\"βœ… postings: Already clean\\n\")\n", "\n", "# 6. Clean Companies Full (if needed)\n", "if len(companies_full) != companies_full['company_id'].nunique():\n", " original_counts['companies_full'] = len(companies_full)\n", " companies_full = companies_full.drop_duplicates(subset=['company_id'], keep='first')\n", " removed = original_counts['companies_full'] - len(companies_full)\n", " print(f\"βœ… companies_full:\")\n", " print(f\" Removed {removed:,} duplicates\")\n", " print(f\" {original_counts['companies_full']:,} β†’ {len(companies_full):,} rows\\n\")\n", "else:\n", " print(f\"βœ… companies_full: Already clean\\n\")\n", "\n", "print(\"=\" * 80)\n", "print(\"βœ… DATA CLEANING COMPLETE!\")\n", "print(\"=\" * 80)\n", "print()\n", "\n", "# Summary\n", "if original_counts:\n", " total_removed = sum(original_counts[k] - globals()[k].shape[0] if k in globals() else 0 \n", " for k in original_counts.keys())\n", " print(f\"πŸ“Š Total duplicates removed: {total_removed:,} rows\")\n", " print()\n", " print(\"Cleaned datasets:\")\n", " for dataset, original in original_counts.items():\n", " current = len(globals()[dataset]) if dataset in globals() else 0\n", " print(f\" - {dataset}: {original:,} β†’ {current:,}\")\n", "else:\n", " print(\"βœ… No duplicates found - all datasets were already clean!\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 🧠 Step 8: Load Embedding Model & Pre-computed Vectors" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "🧠 Loading embedding model...\n", "\n", "βœ… Model loaded: all-MiniLM-L6-v2\n", "πŸ“ Embedding dimension: ℝ^384\n", "\n", "πŸ“‚ Loading pre-computed embeddings...\n", "βœ… Loaded from ../processed/\n", "πŸ“Š Candidate vectors: (9544, 384)\n", "πŸ“Š Company vectors: (35787, 384)\n", "\n" ] } ], "source": [ "print(\"🧠 Loading embedding model...\\n\")\n", "model = SentenceTransformer(Config.EMBEDDING_MODEL)\n", "embedding_dim = model.get_sentence_embedding_dimension()\n", "print(f\"βœ… Model loaded: {Config.EMBEDDING_MODEL}\")\n", "print(f\"πŸ“ Embedding dimension: ℝ^{embedding_dim}\\n\")\n", "\n", "print(\"πŸ“‚ Loading pre-computed embeddings...\")\n", "\n", "try:\n", " # Try to load from processed folder\n", " cand_vectors = np.load(f'{Config.PROCESSED_PATH}candidate_embeddings.npy')\n", " comp_vectors = np.load(f'{Config.PROCESSED_PATH}company_embeddings.npy')\n", " \n", " print(f\"βœ… Loaded from {Config.PROCESSED_PATH}\")\n", " print(f\"πŸ“Š Candidate vectors: {cand_vectors.shape}\")\n", " print(f\"πŸ“Š Company vectors: {comp_vectors.shape}\\n\")\n", " \n", "except FileNotFoundError:\n", " print(\"⚠️ Pre-computed embeddings not found!\")\n", " print(\" Embeddings will need to be generated (takes ~5-10 minutes)\")\n", " print(\" This is normal if running for the first time.\\n\")\n", " \n", " # You can add embedding generation code here if needed\n", " # For now, we'll skip to keep notebook clean\n", " cand_vectors = None\n", " comp_vectors = None" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 🎯 Step 9: Core Matching Function" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "βœ… Matching function ready\n" ] } ], "source": [ "def find_top_matches(candidate_idx: int, top_k: int = 10) -> List[tuple]:\n", " \"\"\"\n", " Find top K company matches for a candidate using cosine similarity.\n", " \n", " Args:\n", " candidate_idx: Index of candidate\n", " top_k: Number of top matches to return\n", " \n", " Returns:\n", " List of (company_index, similarity_score) tuples\n", " \"\"\"\n", " if cand_vectors is None or comp_vectors is None:\n", " raise ValueError(\"Embeddings not loaded! Please run Step 8 first.\")\n", " \n", " cand_vec = cand_vectors[candidate_idx].reshape(1, -1)\n", " similarities = cosine_similarity(cand_vec, comp_vectors)[0]\n", " top_indices = np.argsort(similarities)[::-1][:top_k]\n", " \n", " return [(int(idx), float(similarities[idx])) for idx in top_indices]\n", "\n", "print(\"βœ… Matching function ready\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## πŸ€– Step 10: Initialize FREE LLM (Hugging Face)\n", "\n", "### Get your FREE token: https://huggingface.co/settings/tokens" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "βœ… Hugging Face client initialized (FREE)\n", "πŸ€– Model: meta-llama/Llama-3.2-3B-Instruct\n", "πŸ’° Cost: $0.00 (completely free!)\n", "\n", "βœ… LLM helper functions ready\n" ] } ], "source": [ "# Initialize Hugging Face Inference Client (FREE)\n", "if Config.HF_TOKEN:\n", " try:\n", " hf_client = InferenceClient(token=Config.HF_TOKEN)\n", " print(\"βœ… Hugging Face client initialized (FREE)\")\n", " print(f\"πŸ€– Model: {Config.LLM_MODEL}\")\n", " print(\"πŸ’° Cost: $0.00 (completely free!)\\n\")\n", " LLM_AVAILABLE = True\n", " except Exception as e:\n", " print(f\"⚠️ Failed to initialize HF client: {e}\")\n", " LLM_AVAILABLE = False\n", "else:\n", " print(\"⚠️ No Hugging Face token configured\")\n", " print(\" LLM features will be disabled\")\n", " print(\"\\nπŸ“ To enable:\")\n", " print(\" 1. Go to: https://huggingface.co/settings/tokens\")\n", " print(\" 2. Create a token (free)\")\n", " print(\" 3. Set: Config.HF_TOKEN = 'your-token-here'\\n\")\n", " LLM_AVAILABLE = False\n", " hf_client = None\n", "\n", "def call_llm(prompt: str, max_tokens: int = 1000) -> str:\n", " \"\"\"\n", " Generic LLM call using Hugging Face Inference API (FREE).\n", " \"\"\"\n", " if not LLM_AVAILABLE:\n", " return \"[LLM not available - check .env file for HF_TOKEN]\"\n", " \n", " try:\n", " response = hf_client.chat_completion( # βœ… chat_completion\n", " messages=[{\"role\": \"user\", \"content\": prompt}],\n", " model=Config.LLM_MODEL,\n", " max_tokens=max_tokens,\n", " temperature=0.7\n", " )\n", " return response.choices[0].message.content # βœ… Extrai conteΓΊdo\n", " except Exception as e:\n", " return f\"[Error: {str(e)}]\"\n", "\n", "print(\"βœ… LLM helper functions ready\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## πŸ€– Step 11: Pydantic Schemas for Structured Output" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "βœ… Pydantic schemas defined\n" ] } ], "source": [ "class JobLevelClassification(BaseModel):\n", " \"\"\"Job level classification result\"\"\"\n", " level: Literal['Entry', 'Mid', 'Senior', 'Executive']\n", " confidence: float = Field(ge=0.0, le=1.0)\n", " reasoning: str\n", "\n", "class SkillsTaxonomy(BaseModel):\n", " \"\"\"Structured skills extraction\"\"\"\n", " technical_skills: List[str] = Field(default_factory=list)\n", " soft_skills: List[str] = Field(default_factory=list)\n", " certifications: List[str] = Field(default_factory=list)\n", " languages: List[str] = Field(default_factory=list)\n", "\n", "class MatchExplanation(BaseModel):\n", " \"\"\"Match reasoning\"\"\"\n", " overall_score: float = Field(ge=0.0, le=1.0)\n", " match_strengths: List[str]\n", " skill_gaps: List[str]\n", " recommendation: str\n", " fit_summary: str = Field(max_length=200)\n", "\n", "print(\"βœ… Pydantic schemas defined\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 🏷️ Step 12: Job Level Classification (Zero-Shot)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "πŸ§ͺ Testing zero-shot classification...\n", "\n", "πŸ“Š Classification Result:\n", "{\n", " \"level\": \"Mid\",\n", " \"confidence\": 0.85,\n", " \"reasoning\": \"The job requires working with an executive team on a daily basis, but the experience level is not explicitly stated as Executive\"\n", "}\n" ] } ], "source": [ "def classify_job_level_zero_shot(job_description: str) -> Dict:\n", " \"\"\"\n", " Zero-shot job level classification.\n", " \n", " Returns classification as: Entry, Mid, Senior, or Executive\n", " \"\"\"\n", " \n", " prompt = f\"\"\"Classify this job posting into ONE seniority level.\n", "\n", "Levels:\n", "- Entry: 0-2 years experience, junior roles\n", "- Mid: 3-5 years experience, independent work\n", "- Senior: 6-10 years experience, technical leadership\n", "- Executive: 10+ years, strategic leadership, C-level\n", "\n", "Job Posting:\n", "{job_description[:500]}\n", "\n", "Return ONLY valid JSON:\n", "{{\n", " \"level\": \"Entry|Mid|Senior|Executive\",\n", " \"confidence\": 0.85,\n", " \"reasoning\": \"Brief explanation\"\n", "}}\n", "\"\"\"\n", " \n", " response = call_llm(prompt)\n", " \n", " try:\n", " # Extract JSON\n", " json_str = response.strip()\n", " if '```json' in json_str:\n", " json_str = json_str.split('```json')[1].split('```')[0].strip()\n", " elif '```' in json_str:\n", " json_str = json_str.split('```')[1].split('```')[0].strip()\n", " \n", " # Find JSON in response\n", " if '{' in json_str and '}' in json_str:\n", " start = json_str.index('{')\n", " end = json_str.rindex('}') + 1\n", " json_str = json_str[start:end]\n", " \n", " result = json.loads(json_str)\n", " return result\n", " except:\n", " return {\n", " \"level\": \"Unknown\",\n", " \"confidence\": 0.0,\n", " \"reasoning\": \"Failed to parse response\"\n", " }\n", "\n", "# Test if LLM available and data loaded\n", "if LLM_AVAILABLE and len(postings) > 0:\n", " print(\"πŸ§ͺ Testing zero-shot classification...\\n\")\n", " sample = postings.iloc[0]['description']\n", " result = classify_job_level_zero_shot(sample)\n", " \n", " print(\"πŸ“Š Classification Result:\")\n", " print(json.dumps(result, indent=2))\n", "else:\n", " print(\"⚠️ Skipped - LLM not available or no data\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## πŸŽ“ Step 13: Few-Shot Learning" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "πŸ§ͺ Comparing Zero-Shot vs Few-Shot...\n", "\n", "πŸ“Š Comparison:\n", "Zero-shot: Mid (confidence: 0.85)\n", "Few-shot: Unknown (confidence: 0.00)\n" ] } ], "source": [ "def classify_job_level_few_shot(job_description: str) -> Dict:\n", " \"\"\"\n", " Few-shot classification with examples.\n", " \"\"\"\n", " \n", " prompt = f\"\"\"Classify this job posting using examples.\n", "\n", "EXAMPLES:\n", "\n", "Example 1 (Entry):\n", "\"Recent graduate wanted. Python basics. Mentorship provided.\"\n", "β†’ Entry level (learning focus, 0-2 years)\n", "\n", "Example 2 (Senior):\n", "\"5+ years backend. Lead team of 3. System architecture.\"\n", "β†’ Senior level (technical leadership, 6-10 years)\n", "\n", "Example 3 (Executive):\n", "\"CTO position. 15+ years. Define technical strategy.\"\n", "β†’ Executive level (C-level, strategic)\n", "\n", "NOW CLASSIFY:\n", "{job_description[:500]}\n", "\n", "Return JSON:\n", "{{\n", " \"level\": \"Entry|Mid|Senior|Executive\",\n", " \"confidence\": 0.0-1.0,\n", " \"reasoning\": \"Explain\"\n", "}}\n", "\"\"\"\n", " \n", " response = call_llm(prompt)\n", " \n", " try:\n", " json_str = response.strip()\n", " if '```json' in json_str:\n", " json_str = json_str.split('```json')[1].split('```')[0].strip()\n", " \n", " if '{' in json_str and '}' in json_str:\n", " start = json_str.index('{')\n", " end = json_str.rindex('}') + 1\n", " json_str = json_str[start:end]\n", " \n", " result = json.loads(json_str)\n", " return result\n", " except:\n", " return {\"level\": \"Unknown\", \"confidence\": 0.0, \"reasoning\": \"Parse error\"}\n", "\n", "# Compare zero-shot vs few-shot\n", "if LLM_AVAILABLE and len(postings) > 0:\n", " print(\"πŸ§ͺ Comparing Zero-Shot vs Few-Shot...\\n\")\n", " sample = postings.iloc[0]['description']\n", " \n", " zero = classify_job_level_zero_shot(sample)\n", " few = classify_job_level_few_shot(sample)\n", " \n", " print(\"πŸ“Š Comparison:\")\n", " print(f\"Zero-shot: {zero['level']} (confidence: {zero['confidence']:.2f})\")\n", " print(f\"Few-shot: {few['level']} (confidence: {few['confidence']:.2f})\")\n", "else:\n", " print(\"⚠️ Skipped\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## πŸ” Step 14: Structured Skills Extraction" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "πŸ” Testing skills extraction...\n", "\n", "πŸ“Š Extracted Skills:\n", "{\n", " \"technical_skills\": [\n", " \"Adobe Creative Cloud\",\n", " \"Microsoft Office Suite\"\n", " ],\n", " \"soft_skills\": [\n", " \"Communication\",\n", " \"Leadership\",\n", " \"Organization\",\n", " \"Proactivity\",\n", " \"Responsibility\",\n", " \"Respect\",\n", " \"Time management\",\n", " \"Positive attitude\",\n", " \"Creativity\"\n", " ],\n", " \"certifications\": [\n", " \"AWS Certified\"\n", " ],\n", " \"languages\": []\n", "}\n" ] } ], "source": [ "def extract_skills_taxonomy(job_description: str) -> Dict:\n", " \"\"\"\n", " Extract structured skills using LLM + Pydantic validation.\n", " \"\"\"\n", " \n", " prompt = f\"\"\"Extract skills from this job posting.\n", "\n", "Job Posting:\n", "{job_description[:800]}\n", "\n", "Return ONLY valid JSON:\n", "{{\n", " \"technical_skills\": [\"Python\", \"Docker\", \"AWS\"],\n", " \"soft_skills\": [\"Communication\", \"Leadership\"],\n", " \"certifications\": [\"AWS Certified\"],\n", " \"languages\": [\"English\", \"Danish\"]\n", "}}\n", "\"\"\"\n", " \n", " response = call_llm(prompt, max_tokens=800)\n", " \n", " try:\n", " json_str = response.strip()\n", " if '```json' in json_str:\n", " json_str = json_str.split('```json')[1].split('```')[0].strip()\n", " \n", " if '{' in json_str and '}' in json_str:\n", " start = json_str.index('{')\n", " end = json_str.rindex('}') + 1\n", " json_str = json_str[start:end]\n", " \n", " data = json.loads(json_str)\n", " # Validate with Pydantic\n", " validated = SkillsTaxonomy(**data)\n", " return validated.model_dump()\n", " except:\n", " return {\n", " \"technical_skills\": [],\n", " \"soft_skills\": [],\n", " \"certifications\": [],\n", " \"languages\": []\n", " }\n", "\n", "# Test extraction\n", "if LLM_AVAILABLE and len(postings) > 0:\n", " print(\"πŸ” Testing skills extraction...\\n\")\n", " sample = postings.iloc[0]['description']\n", " skills = extract_skills_taxonomy(sample)\n", " \n", " print(\"πŸ“Š Extracted Skills:\")\n", " print(json.dumps(skills, indent=2))\n", "else:\n", " print(\"⚠️ Skipped\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## πŸ’‘ Step 15: Match Explainability" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "πŸ’‘ Testing match explainability...\n", "\n", "πŸ“Š Match Explanation:\n", "{\n", " \"overall_score\": 0.7028058171272278,\n", " \"match_strengths\": [\n", " \"Data Science skills\",\n", " \"Big Data Analyst experience\"\n", " ],\n", " \"skill_gaps\": [\n", " \"Missing skills\"\n", " ],\n", " \"recommendation\": \"Review the candidate's resume and portfolio to identify areas where they may be missing skills or experience that are more closely aligned with the company's specific needs. Consider whether the candidate's Big Data Analyst experience could be leveraged to support TeachTown's data-driven initiatives.\",\n", " \"fit_summary\": \"Although the candidate's skills and experience don't perfectly match TeachTown's requirements, they demonstrate some relevant strengths that could make them a good fit for the company.\"\n", "}\n" ] } ], "source": [ "def explain_match(candidate_idx: int, company_idx: int, similarity_score: float) -> Dict:\n", " \"\"\"\n", " Generate LLM explanation for why candidate matches company.\n", " \"\"\"\n", " \n", " cand = candidates.iloc[candidate_idx]\n", " comp = companies_full.iloc[company_idx]\n", " \n", " cand_skills = str(cand.get('skills', 'N/A'))[:300]\n", " cand_exp = str(cand.get('positions', 'N/A'))[:300]\n", " comp_req = str(comp.get('required_skills', 'N/A'))[:300]\n", " comp_name = comp.get('name', 'Unknown')\n", " \n", " prompt = f\"\"\"Explain why this candidate matches this company.\n", "\n", "Candidate:\n", "Skills: {cand_skills}\n", "Experience: {cand_exp}\n", "\n", "Company: {comp_name}\n", "Requirements: {comp_req}\n", "\n", "Similarity Score: {similarity_score:.2f}\n", "\n", "Return JSON:\n", "{{\n", " \"overall_score\": {similarity_score},\n", " \"match_strengths\": [\"Top 3-5 matching factors\"],\n", " \"skill_gaps\": [\"Missing skills\"],\n", " \"recommendation\": \"What candidate should do\",\n", " \"fit_summary\": \"One sentence summary\"\n", "}}\n", "\"\"\"\n", " \n", " response = call_llm(prompt, max_tokens=1000)\n", " \n", " try:\n", " json_str = response.strip()\n", " if '```json' in json_str:\n", " json_str = json_str.split('```json')[1].split('```')[0].strip()\n", " \n", " if '{' in json_str and '}' in json_str:\n", " start = json_str.index('{')\n", " end = json_str.rindex('}') + 1\n", " json_str = json_str[start:end]\n", " \n", " data = json.loads(json_str)\n", " return data\n", " except:\n", " return {\n", " \"overall_score\": similarity_score,\n", " \"match_strengths\": [\"Unable to generate\"],\n", " \"skill_gaps\": [],\n", " \"recommendation\": \"Review manually\",\n", " \"fit_summary\": f\"Match score: {similarity_score:.2f}\"\n", " }\n", "\n", "# Test explainability\n", "if LLM_AVAILABLE and cand_vectors is not None and len(candidates) > 0:\n", " print(\"πŸ’‘ Testing match explainability...\\n\")\n", " matches = find_top_matches(0, top_k=1)\n", " if matches:\n", " comp_idx, score = matches[0]\n", " explanation = explain_match(0, comp_idx, score)\n", " \n", " print(\"πŸ“Š Match Explanation:\")\n", " print(json.dumps(explanation, indent=2))\n", "else:\n", " print(\"⚠️ Skipped - requirements not met\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## πŸ“Š Step 16: Summary\n", "\n", "### What We Built" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "======================================================================\n", "🎯 HRHUB v2.1 - SUMMARY\n", "======================================================================\n", "\n", "βœ… IMPLEMENTED:\n", " 1. Zero-Shot Job Classification (Entry/Mid/Senior/Executive)\n", " 2. Few-Shot Learning with Examples\n", " 3. Structured Skills Extraction (Pydantic schemas)\n", " 4. Match Explainability (LLM-generated reasoning)\n", " 5. FREE LLM Integration (Hugging Face)\n", " 6. Flexible Data Loading (Upload OR Google Drive)\n", "\n", "πŸ’° COST: $0.00 (completely free!)\n", "\n", "πŸ“ˆ COURSE ALIGNMENT:\n", " βœ… LLMs for structured output\n", " βœ… Pydantic schemas\n", " βœ… Classification pipelines\n", " βœ… Zero-shot & few-shot learning\n", " βœ… JSON extraction\n", " βœ… Transformer architecture (embeddings)\n", " βœ… API deployment strategies\n", "\n", "======================================================================\n", "πŸš€ READY TO MOVE TO VS CODE!\n", "======================================================================\n" ] } ], "source": [ "print(\"=\"*70)\n", "print(\"🎯 HRHUB v2.1 - SUMMARY\")\n", "print(\"=\"*70)\n", "print(\"\")\n", "print(\"βœ… IMPLEMENTED:\")\n", "print(\" 1. Zero-Shot Job Classification (Entry/Mid/Senior/Executive)\")\n", "print(\" 2. Few-Shot Learning with Examples\")\n", "print(\" 3. Structured Skills Extraction (Pydantic schemas)\")\n", "print(\" 4. Match Explainability (LLM-generated reasoning)\")\n", "print(\" 5. FREE LLM Integration (Hugging Face)\")\n", "print(\" 6. Flexible Data Loading (Upload OR Google Drive)\")\n", "print(\"\")\n", "print(\"πŸ’° COST: $0.00 (completely free!)\")\n", "print(\"\")\n", "print(\"πŸ“ˆ COURSE ALIGNMENT:\")\n", "print(\" βœ… LLMs for structured output\")\n", "print(\" βœ… Pydantic schemas\")\n", "print(\" βœ… Classification pipelines\")\n", "print(\" βœ… Zero-shot & few-shot learning\")\n", "print(\" βœ… JSON extraction\")\n", "print(\" βœ… Transformer architecture (embeddings)\")\n", "print(\" βœ… API deployment strategies\")\n", "print(\"\")\n", "print(\"=\"*70)\n", "print(\"πŸš€ READY TO MOVE TO VS CODE!\")\n", "print(\"=\"*70)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "# Visualization\n", "import plotly.graph_objects as go\n", "import plotly.express as px\n", "from sklearn.manifold import TSNE" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "# ============================================================================\n", "# 🎨 VISUALIZATION MODULE\n", "# ============================================================================\n", "\n", "def visualize_vector_space(n_candidates=500, n_companies=2000):\n", " \"\"\"\n", " Visualize candidates and companies in 2D space (TSNE projection)\n", " \"\"\"\n", " print(\"🎨 Creating vector space visualization...\\\\n\")\n", " \n", " # Sample data for visualization\n", " cand_sample = cand_vectors[:n_candidates]\n", " comp_sample = comp_vectors[:n_companies]\n", " \n", " # Combine and project\n", " all_vectors = np.vstack([cand_sample, comp_sample])\n", " \n", " print(f\" β€’ {n_candidates} candidates\")\n", " print(f\" β€’ {n_companies} companies\")\n", " print(f\" β€’ From ℝ^{embedding_dim} β†’ ℝ² (t-SNE projection)\\\\n\")\n", " \n", " print(\"πŸ”„ Running t-SNE (takes 2-5 minutes)...\")\n", " tsne = TSNE(\n", " n_components=2,\n", " perplexity=30,\n", " random_state=42,\n", " n_iter=1000,\n", " verbose=0\n", " )\n", " \n", " vectors_2d = tsne.fit_transform(all_vectors)\n", " cand_2d = vectors_2d[:n_candidates]\n", " comp_2d = vectors_2d[n_candidates:]\n", " \n", " # Create visualization\n", " fig = go.Figure()\n", " \n", " # Companies (red)\n", " fig.add_trace(go.Scatter(\n", " x=comp_2d[:, 0], y=comp_2d[:, 1],\n", " mode='markers',\n", " name='Companies',\n", " marker=dict(size=6, color='#ff6b6b', opacity=0.6),\n", " text=[f\"Company: {companies_full.iloc[i].get('name', 'N/A')[:30]}\" \n", " for i in range(n_companies)],\n", " hovertemplate='%{text}'\n", " ))\n", " \n", " # Candidates (green)\n", " fig.add_trace(go.Scatter(\n", " x=cand_2d[:, 0], y=cand_2d[:, 1],\n", " mode='markers',\n", " name='Candidates',\n", " marker=dict(size=10, color='#00ff00', opacity=0.8, \n", " line=dict(width=1, color='white')),\n", " text=[f\"Candidate {i}\" for i in range(n_candidates)],\n", " hovertemplate='%{text}'\n", " ))\n", " \n", " fig.update_layout(\n", " title='🎯 HRHUB Vector Space: Bridging Candidates ↔ Companies',\n", " xaxis_title='TSNE Dimension 1',\n", " yaxis_title='TSNE Dimension 2',\n", " width=1200, height=800,\n", " plot_bgcolor='#1a1a1a',\n", " paper_bgcolor='#0d0d0d',\n", " font=dict(color='white'),\n", " legend=dict(x=0.02, y=0.98)\n", " )\n", " \n", " # Add annotation about bridging concept\n", " fig.add_annotation(\n", " x=0.02, y=0.02,\n", " xref=\"paper\", yref=\"paper\",\n", " text=\"πŸ’‘ Overlap = Postings successfully bridge the gap!\",\n", " showarrow=False,\n", " font=dict(size=14, color=\"#00ff00\"),\n", " bgcolor=\"rgba(0,0,0,0.8)\",\n", " bordercolor=\"#00ff00\",\n", " borderwidth=2\n", " )\n", " \n", " fig.show()\n", " print(\"βœ… Vector space visualization created!\")\n", " return fig\n", "\n", "# Quick visualization (optional - comment if takes too long)\n", "# visualize_vector_space(n_candidates=200, n_companies=500)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "🎨 Creating vector space visualization...\\n\n", " β€’ 200 candidates\n", " β€’ 500 companies\n", " β€’ From ℝ^384 β†’ ℝ² (t-SNE projection)\\n\n", "πŸ”„ Running t-SNE (takes 2-5 minutes)...\n" ] }, { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "hovertemplate": "%{text}", "marker": { "color": "#ff6b6b", "opacity": 0.6, "size": 6 }, "mode": "markers", "name": "Companies", "text": [ "Company: IBM", "Company: GE HealthCare", "Company: Hewlett Packard Enterprise", "Company: Oracle", "Company: Accenture", "Company: Microsoft", "Company: Deloitte", "Company: Siemens", "Company: PwC", "Company: AT&T", "Company: Intel Corporation", "Company: Ericsson", "Company: Cisco", "Company: Motorola Mobility (a Lenovo Co", "Company: JPMorgan Chase & Co.", "Company: Nokia", "Company: EY", "Company: KPMG US", "Company: NXP Semiconductors", "Company: Philips", "Company: Verizon", "Company: SAP", "Company: Procter & Gamble", "Company: Bank of America", "Company: Elite Technology", "Company: BT Group", "Company: Pfizer", "Company: Johnson & Johnson", "Company: UBS", "Company: US Army Corps of Engineers", "Company: Wells Fargo", "Company: Unilever", "Company: Sony", "Company: Sony Electronics", "Company: Sony Pictures Entertainment", "Company: Atos", "Company: Deutsche Bank", "Company: DWS Group", "Company: Chubb", "Company: Shell", "Company: American Express", "Company: Unisys", "Company: Infosys", "Company: Yahoo", "Company: The Walt Disney Company", "Company: Fidelity Investments", "Company: Wipro", "Company: LinkedIn", "Company: Air Force Research Laboratory", "Company: Honeywell", "Company: Tata Consultancy Services", "Company: National Security Agency", "Company: National Computer Systems", "Company: McKinsey & Company", "Company: Xerox", "Company: Fujitsu Network Communications", "Company: Goldman Sachs", "Company: Boeing", "Company: bp", "Company: T-Mobile", "Company: NestlΓ©", "Company: GSK", "Company: Thomson Reuters", "Company: Booz Allen Hamilton", "Company: Novartis", "Company: Northrop Grumman", "Company: CGI", "Company: Capital One", "Company: Barclays", "Company: PepsiCo", "Company: Google", "Company: Electronic Arts (EA)", "Company: SUSE", "Company: ADP", "Company: CDK Global", "Company: Teradata", "Company: SLB", "Company: General Motors", "Company: Ally", "Company: Adobe", "Company: eBay", "Company: PayPal", "Company: Ford Motor Company", "Company: Merck", "Company: SAS", "Company: Avaya", "Company: AMD", "Company: MIT Lincoln Laboratory", "Company: Raytheon", "Company: BNP Paribas", "Company: MondelΔ“z International", "Company: Eastman Kodak Company", "Company: Carestream", "Company: UPS", "Company: Agilent Technologies", "Company: The Home Depot", "Company: Amdocs", "Company: Mars", "Company: Kaiser Permanente", "Company: Amazon", "Company: BMC Software", "Company: Roche", "Company: AstraZeneca", "Company: Abbott", "Company: SAIC", "Company: Dignity Health", "Company: Owens & Minor", "Company: Stanford Children's Health | L", "Company: Boston Scientific", "Company: Sanofi", "Company: Harvard Medical School", "Company: Harvard University", "Company: Harvard Law School", "Company: Dana-Farber Cancer Institute", "Company: Boston Children's Hospital", "Company: Beth Israel Deaconess Medical ", "Company: L'OrΓ©al", "Company: Eli Lilly and Company", "Company: Intuit", "Company: FedEx Ground", "Company: FedEx Services", "Company: Ogilvy", "Company: Gap Inc.", "Company: Banana Republic", "Company: Cognizant", "Company: Robert Half", "Company: ExxonMobil", "Company: Societe Generale", "Company: The Coca-Cola Company", "Company: Comcast", "Company: Nielsen", "Company: HCLTech", "Company: AIG", "Company: BBC", "Company: State Street", "Company: Bristol Myers Squibb", "Company: Boston Consulting Group (BCG)", "Company: SLAC National Accelerator Labo", "Company: Stanford University School of ", "Company: Stanford University", "Company: ManpowerGroup", "Company: RBC", "Company: TotalEnergies", "Company: NBC News", "Company: NBCUniversal", "Company: CNBC", "Company: Allstate", "Company: Medtronic", "Company: Prudential Financial", "Company: Charles Schwab", "Company: 3M", "Company: Capco Energy Solutions", "Company: Marsh", "Company: Autodesk", "Company: BAE Systems, Inc.", "Company: Nickelodeon", "Company: Bayer", "Company: McKesson", "Company: General Dynamics Information T", "Company: General Dynamics Land Systems", "Company: General Dynamics Mission Syste", "Company: Philip Morris International", "Company: McCann Worldgroup", "Company: MRM", "Company: UM Worldwide", "Company: The Adecco Group", "Company: PTC", "Company: Thales", "Company: Sogeti", "Company: Rabobank", "Company: Mavenir", "Company: NASA - National Aeronautics an", "Company: Qualcomm", "Company: Applied Materials", "Company: Western Union", "Company: Nike", "Company: Spectrum Enterprise", "Company: Coldwell Banker Realty", "Company: Aon", "Company: CNN", "Company: TE Connectivity", "Company: Amgen", "Company: Gartner", "Company: Volvo Group", "Company: Volvo Penta", "Company: Volvo Buses", "Company: Mack Trucks", "Company: Volvo Construction Equipment", "Company: NetApp", "Company: Toyota North America", "Company: Bain & Company", "Company: Avis Budget Group", "Company: Best Buy", "Company: Pearson", "Company: Infineon Technologies", "Company: TEKsystems", "Company: Allegis Group", "Company: DuPont", "Company: Cadence Design Systems", "Company: Cardinal Health", "Company: Department for Transport (DfT)", "Company: Visa", "Company: Chevron", "Company: Canon Solutions America", "Company: Bosch Security and Safety Syst", "Company: LexisNexis", "Company: MetLife", "Company: Halliburton", "Company: KBR, Inc.", "Company: Keller Williams Realty, Inc.", "Company: Novo Nordisk", "Company: Hanesbrands Inc.", "Company: Danone", "Company: Juniper Networks", "Company: Johnson Controls", "Company: Victoria’s Secret & Co.", "Company: Bath & Body Works", "Company: Spherion", "Company: Starbucks", "Company: Delta Air Lines", "Company: Genentech", "Company: Flex", "Company: The Wall Street Journal", "Company: Dow Jones", "Company: Macy's", "Company: Insight", "Company: Kelly", "Company: Marriott International", "Company: CBRE", "Company: Randstad", "Company: Schneider Electric", "Company: Nationwide", "Company: Baxter International Inc.", "Company: United Airlines", "Company: State Farm", "Company: Dun & Bradstreet", "Company: Mercer", "Company: Pratt & Whitney", "Company: Carrier HVAC", "Company: Grant Thornton LLP (US)", "Company: Alstom", "Company: Northwestern Mutual", "Company: Hilton", "Company: Oliver Wyman", "Company: Synopsys Inc", "Company: Zurich North America", "Company: Digitas North America", "Company: The Hartford", "Company: UCLA Health", "Company: Children's Hospital Los Angele", "Company: UCLA", "Company: Wolters Kluwer", "Company: Cigna Healthcare", "Company: Bloomberg", "Company: Diageo", "Company: Rockwell Automation", "Company: Michigan Medicine", "Company: University of Michigan", "Company: U.S. Bank", "Company: Experian", "Company: iHeartMedia", "Company: Clear Channel Outdoor", "Company: Whirlpool Corporation", "Company: Dow", "Company: Ingram Micro", "Company: CrΓ©dit Agricole CIB", "Company: University of Washington", "Company: Momentum Worldwide", "Company: Eaton", "Company: Tetra Pak", "Company: Panasonic Automotive North Ame", "Company: Panasonic North America", "Company: Panasonic Avionics Corporation", "Company: Caterpillar Inc.", "Company: Columbia University Irving Med", "Company: Columbia University", "Company: BASF", "Company: American Airlines", "Company: Citrix", "Company: Walmart", "Company: University of Illinois Chicago", "Company: University of Illinois Urbana-", "Company: Caltrans", "Company: County of San Diego", "Company: CalPERS", "Company: California Department of Justi", "Company: Valeo", "Company: McDonald's", "Company: Cargill", "Company: John Hancock", "Company: Manulife", "Company: Liberty Mutual Insurance", "Company: OpenText", "Company: KLA", "Company: BOMBARDIER", "Company: RR Donnelley", "Company: Acxiom", "Company: IKEA", "Company: Colgate-Palmolive", "Company: Expedia Group", "Company: Emerson", "Company: TD", "Company: Andersen Corporation", "Company: Federal Reserve Board", "Company: Federal Reserve Bank of San Fr", "Company: Federal Reserve Bank of Boston", "Company: Sage", "Company: Publicis", "Company: General Mills", "Company: BlackBerry", "Company: Mary Kay Global", "Company: University of California, Sant", "Company: University of California, Davi", "Company: UC Davis Health", "Company: Commonwealth Bank", "Company: BDO USA", "Company: Visteon Corporation", "Company: Seagate Technology", "Company: Canon Business Process Service", "Company: ITT Inc.", "Company: Aerotek", "Company: Brigham and Women's Hospital", "Company: Massachusetts General Hospital", "Company: Newton-Wellesley Hospital", "Company: NYC Department of Education", "Company: Albertsons Companies", "Company: Shaw's Supermarkets", "Company: Acme Markets", "Company: The Save Mart Companies", "Company: Teradyne", "Company: S&P Global", "Company: Teacher Retirement System of T", "Company: Texas Health and Human Service", "Company: Texas Workforce Commission", "Company: Texas Attorney General", "Company: Allianz Life", "Company: Lexmark", "Company: Saint-Gobain", "Company: CSAA Insurance Group, a AAA In", "Company: CertainTeed", "Company: VMware", "Company: Transportation Security Admini", "Company: FEMA", "Company: U.S. Customs and Border Protec", "Company: Universal Music Group", "Company: Fifth Third Bank", "Company: Mastercard", "Company: Staples", "Company: Elsevier", "Company: University of California, San ", "Company: UCSF Health", "Company: Ameriprise Financial Services,", "Company: Sony Music Entertainment", "Company: Alcoa", "Company: University of Phoenix", "Company: Accor", "Company: Tech Mahindra", "Company: Broadcom", "Company: Kforce Inc", "Company: Thermo Fisher Scientific", "Company: University of Southern Califor", "Company: Travelers", "Company: Check Point Software Technolog", "Company: Reckitt", "Company: U.S. Department of State", "Company: BD", "Company: Office Depot", "Company: Lionbridge", "Company: Edwards Vacuum", "Company: FIS", "Company: The HEINEKEN Company", "Company: Hyatt Regency", "Company: Levi Strauss & Co.", "Company: Scotiabank", "Company: Freddie Mac", "Company: Stop & Shop", "Company: Software Engineering Institute", "Company: NYU Stern School of Business", "Company: The University of Texas at Aus", "Company: Penn Medicine, University of P", "Company: University of Pennsylvania", "Company: The Ohio State University Wexn", "Company: The Ohio State University", "Company: Ohio Department of Education a", "Company: Ingersoll Rand", "Company: JLL", "Company: University of Minnesota", "Company: Salesforce", "Company: Mallinckrodt Pharmaceuticals", "Company: Northwestern University", "Company: Mattel, Inc.", "Company: AkzoNobel", "Company: Agfa", "Company: Boehringer Ingelheim", "Company: Farmers Insurance", "Company: International Paper", "Company: CNA Insurance", "Company: KeyBank", "Company: Aegon", "Company: Danfoss", "Company: Progressive Insurance", "Company: DHL Supply Chain", "Company: Stryker", "Company: Physio", "Company: Bechtel Corporation", "Company: Ricoh USA, Inc.", "Company: Avery Dennison", "Company: Cox Communications", "Company: CDW", "Company: Textron", "Company: Textron Systems", "Company: Kaplan", "Company: Fiserv", "Company: Nordstrom", "Company: UC San Diego", "Company: UC San Diego Health", "Company: IDC", "Company: Celestica", "Company: FICO", "Company: Sodexo", "Company: Pizza Hut", "Company: Taco Bell", "Company: Yum! Brands", "Company: Georgia-Pacific LLC", "Company: New York Life Insurance Compan", "Company: Kimberly-Clark", "Company: Peace Corps", "Company: Analog Devices", "Company: UPMC", "Company: UPMC Health Plan", "Company: Electrolux Group", "Company: Holcim", "Company: Michael Page", "Company: Hays", "Company: IDEMIA", "Company: Conagra Brands", "Company: Progress", "Company: Safeway", "Company: Weill Cornell Medicine", "Company: Cornell University", "Company: Johns Hopkins Hospital", "Company: The Johns Hopkins University", "Company: Continental", "Company: Edelman", "Company: Macquarie Group", "Company: Red Hat", "Company: IHG Hotels & Resorts", "Company: Boston University", "Company: Georgia Tech Research Institut", "Company: Georgia Institute of Technolog", "Company: Hughes", "Company: Arrow Electronics", "Company: Computacenter", "Company: Mphasis", "Company: The Princeton Group", "Company: Walgreens", "Company: ESPN", "Company: NVIDIA", "Company: Cummins Inc.", "Company: HCA Healthcare", "Company: HCA Healthcare Physician Servi", "Company: MassMutual", "Company: Compucom", "Company: University of Maryland", "Company: Lenovo", "Company: Penn State University", "Company: Penn State Health", "Company: H&R Block", "Company: CACI International Inc", "Company: Franklin Templeton", "Company: Edward Jones", "Company: Corning Incorporated", "Company: Fluor Corporation", "Company: Mastech Digital", "Company: JCPenney", "Company: Micron Technology", "Company: United States Postal Service", "Company: Equifax", "Company: Lear Corporation", "Company: The Reynolds and Reynolds Comp", "Company: the LEGO Group", "Company: ArcelorMittal", "Company: Korn Ferry", "Company: RSM US LLP", "Company: ZF Group", "Company: adidas", "Company: University of North Carolina a", "Company: Discover Financial Services", "Company: GroupM", "Company: University of Colorado", "Company: University of Colorado Boulder", "Company: Marvell Technology", "Company: Epsilon", "Company: Iron Mountain", "Company: John Deere", "Company: AllianceBernstein", "Company: Air Liquide", "Company: Northern Trust", "Company: Swiss Re", "Company: MITRE" ], "type": "scatter", "x": [ -4.24137020111084, -4.3178863525390625, -4.338122844696045, -4.358405113220215, -27.552812576293945, -27.971195220947266, -28.579879760742188, -27.733108520507812, -28.356107711791992, -27.99759292602539, -27.778554916381836, -28.611600875854492, -28.280330657958984, -28.68898582458496, -2.601194381713867, -2.6001484394073486, -2.6000428199768066, -2.596459150314331, -2.056368350982666, -2.089918851852417, -2.015655279159546, -2.0933783054351807, -2.0983059406280518, 2.7976322174072266, 2.779151678085327, 3.0421037673950195, 3.4544646739959717, 3.3139607906341553, 3.316918134689331, 3.0533199310302734, -9.834299087524414, -9.752479553222656, -9.856888771057129, -10.128973007202148, -10.530952453613281, -10.421584129333496, -10.170528411865234, -10.403238296508789, -3.6923563480377197, -3.294551134109497, -3.1231250762939453, -3.145516872406006, -3.5765326023101807, -3.482145071029663, -3.8543713092803955, -23.523513793945312, -23.524551391601562, -23.5240478515625, -7.233014106750488, -8.53653335571289, -8.15380859375, -8.501815795898438, -8.722018241882324, -8.660520553588867, -8.121309280395508, -8.042267799377441, -8.011183738708496, -7.289564609527588, -7.288326263427734, -5.608010292053223, -5.602958679199219, -5.605586051940918, -9.761113166809082, -9.89045238494873, -9.784634590148926, -9.532604217529297, -9.173712730407715, -9.091053009033203, -9.19820499420166, -9.451706886291504, -6.040831089019775, -24.977779388427734, -24.706716537475586, -24.663776397705078, -25.199556350708008, -24.557453155517578, -24.949010848999023, -25.19023895263672, -5.697776794433594, -0.4405054450035095, -0.18014220893383026, -0.004869137890636921, -0.7620863914489746, -0.44087544083595276, -0.8514084815979004, -0.1739729791879654, -0.7683146595954895, -22.410049438476562, -22.40914535522461, -5.824016571044922, -30.17707633972168, -30.216686248779297, -30.341777801513672, -30.41912841796875, -30.592636108398438, -30.57615089416504, -4.672780513763428, -4.726765155792236, -4.5722246170043945, -4.973163604736328, -5.259900093078613, -5.413698196411133, -4.990335941314697, -5.303680419921875, -8.88879680633545, -8.885845184326172, -8.894865036010742, -8.89278507232666, -26.322372436523438, -26.325456619262695, -21.837074279785156, -21.5459041595459, -22.06316375732422, -21.506153106689453, -21.21651840209961, -21.187904357910156, -21.276187896728516, -22.032827377319336, -21.915313720703125, -2.3115286827087402, -5.518636703491211, -35.518463134765625, -35.48280715942383, -35.522178649902344, -35.4670524597168, -35.4361572265625, -35.087913513183594, -35.58370590209961, -34.87578582763672, -35.62587356567383, -35.408935546875, -34.85454177856445, -35.43284606933594, -35.05355453491211, -26.468137741088867, -26.27060317993164, -26.68292236328125, -26.451948165893555, -26.68276023864746, -26.23354148864746, -3.4139246940612793, -20.083295822143555, -20.059537887573242, -20.660409927368164, -20.270421981811523, -20.864688873291016, -20.567720413208008, -20.829566955566406, -20.35312271118164, -22.19036865234375, -22.189289093017578, -13.587738990783691, -13.454716682434082, -13.456597328186035, -20.332414627075195, -20.33207893371582, -20.333778381347656, -0.34378382563591003, -0.34770047664642334, -16.530988693237305, -16.526899337768555, -15.783917427062988, -8.769662857055664, -8.769761085510254, -16.2064208984375, -19.413846969604492, -19.126148223876953, -19.75751304626465, -19.158021926879883, -19.251195907592773, -20.007959365844727, -20.029024124145508, -19.548065185546875, -19.89056396484375, -1.5309442281723022, -1.6597559452056885, -1.7276135683059692, -1.6025630235671997, -1.5736761093139648, 0.4048156142234802, 0.6006110310554504, 0.9187921285629272, 1.1730999946594238, 0.9947662353515625, 0.4126272201538086, 1.2184549570083618, 0.7334967851638794, -11.91291332244873, -11.904091835021973, -11.916181564331055, -11.918109893798828, -19.39845085144043, -19.40043067932129, -19.40030288696289, -26.239173889160156, -26.281490325927734, -26.282222747802734, -26.232807159423828, -26.337642669677734, 5.531064510345459, 4.404710292816162, 5.369546413421631, 4.496846675872803, 5.254345893859863, 5.030145168304443, 4.872509956359863, 4.568388938903809, 4.716418266296387, 5.319346904754639, -5.565598487854004, -5.55322790145874, -5.564345359802246, -5.574850082397461, -5.55647087097168, -2.3943564891815186, -2.399383068084717, -2.4008166790008545, 0.8313601613044739, 1.1715900897979736, 1.5407663583755493, 1.4464492797851562, 0.8034867644309998, 1.4693716764450073, 1.1846123933792114, 0.6507624387741089, 0.6145052909851074, 6.8431525230407715, 7.125302314758301, 7.004112720489502, 7.861507892608643, 7.328383922576904, 7.72862434387207, 7.314584732055664, 8.016460418701172, 6.759486675262451, 7.544021129608154, 7.956840991973877, 30.05211067199707, -3.2194082736968994, 4.527701377868652, -10.134698867797852, -10.135124206542969, -10.135838508605957, 2.57720947265625, -18.288490295410156, -18.347190856933594, -19.085346221923828, -18.61731719970703, -18.49294090270996, -19.02305793762207, -18.917436599731445, -18.791851043701172, -4.433652877807617, -4.847480297088623, -4.625294208526611, -4.933119773864746, -4.34064245223999, -4.285317420959473, -4.767528533935547, -17.053302764892578, -17.347265243530273, -16.8806209564209, -17.140029907226562, -17.224576950073242, -16.69387435913086, -16.672204971313477, 8.030542373657227, 8.05367374420166, 8.08086109161377, 8.048445701599121, 8.075176239013672, -27.294570922851562, -27.289358139038086, -37.83115005493164, -37.837154388427734, -37.82405090332031, -37.83470916748047, 10.589198112487793, 10.554102897644043, 10.535621643066406, 10.60053825378418, 10.531112670898438, 0.7591871023178101, 0.9147530198097229, 1.1832143068313599, 1.0623406171798706, 0.85174560546875, 1.2330970764160156, -32.5739860534668, -32.574092864990234, -32.57891082763672, -6.601039409637451, -6.387275695800781, -6.647823333740234, -5.952861785888672, -6.304680824279785, -5.840428352355957, -5.810103416442871, -6.034609317779541, -6.727883338928223, 3.618821144104004, 3.640995979309082, 3.6421854496002197, 3.580061912536621, 3.614780902862549, -22.446414947509766, -22.752214431762695, -22.77307891845703, -22.079938888549805, -22.872146606445312, -22.158283233642578, -22.5179443359375, -22.20547866821289, -18.756563186645508, -18.7479248046875, -24.424867630004883, -24.61821746826172, -24.877859115600586, -24.614521026611328, -25.284893035888672, -24.373289108276367, -25.21095848083496, -25.284015655517578, -24.969507217407227, -12.157753944396973, -12.224197387695312, -12.223766326904297, -12.203413963317871, -12.18458366394043, -12.996539115905762, -12.994865417480469, -12.99761962890625, 0.3239681124687195, 0.3248487710952759, -31.465486526489258, -31.803741455078125, -31.914264678955078, -30.88895034790039, -31.16046714782715, -31.31542205810547, -30.97418212890625, -30.882476806640625, -31.606773376464844, -31.844955444335938, 4.484798431396484, 4.485192775726318, 4.4865498542785645, 4.48664665222168, 0.41323330998420715, -4.3023858070373535, -4.248412609100342, -4.23777437210083, -4.276479721069336, -4.237058162689209, -11.794960975646973, -11.81525993347168, -11.35061264038086, -11.487104415893555, -11.490395545959473, -11.140819549560547, -16.529550552368164, -16.547252655029297, -16.521183013916016, -16.506324768066406, -16.491849899291992, -16.039363861083984, -16.02261734008789, -16.0550537109375, -16.050703048706055, -16.051929473876953, -14.05414867401123, -14.051904678344727, -14.067402839660645, -14.015253067016602, -14.01409912109375, -14.016681671142578, -14.022357940673828, -14.093828201293945, -13.38281536102295, -14.206522941589355, -14.083795547485352, -13.500131607055664, -13.430131912231445, -13.776322364807129, -13.78488540649414, -39.2267951965332, -38.98285675048828, -39.06846618652344, -38.686614990234375, -38.6190299987793, -39.24813461303711, -38.731048583984375, 1.570813536643982, 1.5975366830825806, 1.6024622917175293, -5.285861015319824, -6.57602596282959, -6.575562477111816, -6.61060094833374, -6.581151008605957, 3.052504539489746, 3.0525617599487305, -0.7571971416473389, -0.8235540390014648, -0.7309589982032776, -0.7760552763938904, -0.7842875123023987, -17.472673416137695, -42.78755187988281, -42.97315979003906, -43.15855026245117, -43.258296966552734, -43.46388626098633, -43.405059814453125, -42.86821365356445, -23.704710006713867, -23.70399284362793, -23.704513549804688, -2.168099880218506, -18.172693252563477, -18.16845703125, -18.17005729675293, -18.179351806640625, -32.71333694458008, -32.71073913574219, -20.501413345336914, -20.502592086791992, -6.841009616851807, -16.153671264648438, -15.839752197265625, -15.694329261779785, -15.711568832397461, -15.97099781036377, -16.095924377441406, -32.55427932739258, -32.58639144897461, -32.65240478515625, -32.572959899902344, -32.550636291503906, -15.16662883758545, -15.8662691116333, -15.893783569335938, -15.618935585021973, -16.193870544433594, -15.25831127166748, -16.056880950927734, -16.276260375976562, -15.264616966247559, -15.518315315246582, -2.886726140975952, -34.83712387084961, -34.83542251586914, -34.83583068847656, -34.83544921875, -35.27114486694336, -35.27745819091797, -35.270973205566406, -35.26945877075195, -39.382606506347656, -39.228389739990234, -39.30790328979492, -39.53595733642578, -39.921627044677734, -39.67981719970703, -40.1592903137207, -39.994022369384766, -40.1513786315918, 3.3169963359832764, 3.3239989280700684, 3.3144748210906982, -33.61820983886719, -25.569618225097656, -25.569780349731445, -40.24689483642578, -40.24599075317383, -40.2469596862793, -40.247703552246094, -33.37824249267578, -33.37559509277344, -31.154693603515625, -31.156253814697266, -31.169017791748047, -31.171953201293945, -31.141639709472656, -37.82860565185547, -37.810882568359375, -38.01321029663086, -38.013099670410156, -38.03891372680664, -39.04941177368164, -39.03096008300781, -39.175907135009766, -39.105003356933594, -39.190799713134766, -38.79081344604492, -33.54961013793945, -42.781307220458984, -42.78522872924805, -42.788475036621094, -42.78927993774414 ], "y": [ -2.8635096549987793, -2.851444721221924, -2.8526740074157715, -2.891873598098755, 9.676633834838867, 9.163490295410156, 9.357840538024902, 9.356112480163574, 10.191489219665527, 10.188936233520508, 10.013290405273438, 9.63862419128418, 9.135161399841309, 9.979710578918457, 3.866619825363159, 3.86598801612854, 3.86405873298645, 3.865321397781372, 0.2072354257106781, 0.1947670429944992, 0.19730053842067719, 0.2643047273159027, 0.2776872217655182, -17.91525650024414, -18.19550132751465, -17.73995590209961, -18.072856903076172, -17.804174423217773, -18.3338623046875, -18.403289794921875, 3.2420477867126465, 3.5444841384887695, 3.8682923316955566, 3.120398759841919, 3.505552291870117, 3.864614486694336, 3.9434475898742676, 3.2381575107574463, -17.292564392089844, -16.768104553222656, -16.985414505004883, -17.278827667236328, -16.746150970458984, -17.365148544311523, -16.968900680541992, 13.548473358154297, 13.548452377319336, 13.547490119934082, -2.8659262657165527, -1.1874114274978638, -0.43213924765586853, -0.3569674789905548, -0.620972216129303, -0.8811846971511841, -1.07805597782135, -0.9966306686401367, -0.5227974057197571, 6.890247821807861, 6.891134738922119, 1.5050960779190063, 1.4645648002624512, 1.48892343044281, -12.933213233947754, -13.23643970489502, -13.506190299987793, -13.694775581359863, -13.585308074951172, -13.290281295776367, -12.954646110534668, -12.850640296936035, -1.7425410747528076, -24.518571853637695, -24.54020118713379, -25.09482192993164, -24.696258544921875, -24.8679141998291, -25.19023895263672, -25.008039474487305, -0.32651349902153015, -12.812731742858887, -12.67914867401123, -12.373779296875, -12.042174339294434, -11.963238716125488, -12.362959861755371, -12.108453750610352, -12.635993003845215, -10.422962188720703, -10.42253303527832, 3.297173261642456, 2.4817357063293457, 2.7240238189697266, 2.7934422492980957, 2.351879358291626, 2.6585285663604736, 2.412130832672119, -6.960209846496582, -6.4048075675964355, -6.676794528961182, -7.094333171844482, -6.9895172119140625, -6.63876485824585, -6.2799506187438965, -6.432016372680664, -4.654464244842529, -4.665650367736816, -4.659033298492432, -4.645820617675781, 1.0705355405807495, 1.071446418762207, -23.062652587890625, -22.14866065979004, -22.50562286376953, -23.12274169921875, -22.932706832885742, -22.60494041442871, -22.3409481048584, -22.793088912963867, -22.219709396362305, -2.232858657836914, -0.01768593303859234, 5.294897556304932, 5.230971336364746, 5.253664016723633, 5.182202339172363, 5.2354936599731445, 1.578709363937378, 2.1196985244750977, 1.8467777967453003, 1.8548271656036377, 1.5909082889556885, 2.0760676860809326, 2.3193910121917725, 2.3728325366973877, -15.005640983581543, -14.64710521697998, -14.884615898132324, -14.535579681396484, -14.672675132751465, -14.888736724853516, 9.35511302947998, -27.966501235961914, -27.65034294128418, -28.125, -27.415122985839844, -27.873794555664062, -27.355358123779297, -27.58417510986328, -28.16705322265625, -0.6841879487037659, -0.6824927926063538, 3.928492307662964, 4.142395496368408, 4.145726203918457, 4.961991786956787, 4.961982727050781, 4.962209701538086, -5.344331741333008, -5.339994430541992, -21.942907333374023, -21.941394805908203, -21.796871185302734, -8.814276695251465, -8.813909530639648, -4.700927734375, -13.800084114074707, -13.153971672058105, -13.596528053283691, -13.484760284423828, -12.925291061401367, -13.4747953414917, -13.143994331359863, -12.715150833129883, -12.862981796264648, -3.504392147064209, -3.59232759475708, -3.6051034927368164, -3.622194528579712, -3.5909695625305176, -8.582396507263184, -8.351691246032715, -8.296175003051758, -8.480493545532227, -9.06246566772461, -8.879883766174316, -8.806264877319336, -9.079319953918457, -6.058230400085449, -6.0522990226745605, -6.054074287414551, -6.052179336547852, 0.7040247917175293, 0.7011294364929199, 0.7014017105102539, -20.31622314453125, -20.32339859008789, -20.32008171081543, -20.23169708251953, -20.202661514282227, -8.434019088745117, -8.271801948547363, -8.13978385925293, -8.552013397216797, -7.875633239746094, -8.854232788085938, -7.788851737976074, -7.936968803405762, -8.818839073181152, -8.758784294128418, -11.599879264831543, -11.619361877441406, -11.513934135437012, -11.521453857421875, -11.596078872680664, 11.4599609375, 11.456490516662598, 11.454118728637695, 19.166093826293945, 19.224716186523438, 18.743772506713867, 19.03645896911621, 18.31978416442871, 18.418956756591797, 18.246110916137695, 18.595888137817383, 18.89915657043457, -14.69782829284668, -14.967608451843262, -13.9224271774292, -14.824625015258789, -13.746655464172363, -13.832200050354004, -14.389856338500977, -14.475306510925293, -14.277765274047852, -15.017560958862305, -14.116381645202637, 9.290190696716309, -3.9915294647216797, -13.969433784484863, 8.824982643127441, 8.825672149658203, 8.823226928710938, -4.306271076202393, -19.66788673400879, -19.380882263183594, -19.527189254760742, -19.189594268798828, -19.9368953704834, -19.856462478637695, -19.259349822998047, -19.982276916503906, 17.632030487060547, 17.104320526123047, 16.97700309753418, 17.39596176147461, 17.115596771240234, 17.427907943725586, 17.63515853881836, -4.040163516998291, -3.6010231971740723, -3.375798225402832, -3.9835801124572754, -3.4138877391815186, -3.7529590129852295, -3.5599730014801025, -0.8229596614837646, -0.901198148727417, -0.8195258975028992, -0.9116978049278259, -0.8035401105880737, -1.5844634771347046, -1.585983395576477, 8.00202465057373, 8.009504318237305, 7.994474411010742, 8.004878044128418, -7.194502830505371, -7.217381477355957, -7.214822769165039, -7.174301624298096, -7.216263294219971, 8.367505073547363, 8.172839164733887, 8.268211364746094, 8.665701866149902, 8.600160598754883, 8.488556861877441, 9.292511940002441, 9.293477058410645, 9.294468879699707, 11.810197830200195, 11.044251441955566, 11.18382740020752, 11.8704195022583, 11.944243431091309, 11.283493041992188, 11.55453109741211, 10.99128246307373, 11.504642486572266, -12.262207984924316, -12.336201667785645, -12.330450057983398, -12.146444320678711, -12.268226623535156, -18.056203842163086, -18.162012100219727, -18.751752853393555, -18.485776901245117, -18.44823455810547, -18.195762634277344, -18.92741584777832, -18.77659034729004, -23.425479888916016, -23.413225173950195, -3.383716344833374, -3.629373550415039, -2.723747730255127, -2.778796434402466, -3.166016101837158, -3.0593788623809814, -2.8438422679901123, -3.476107120513916, -3.6853597164154053, -1.918258786201477, -1.7840306758880615, -1.8329840898513794, -1.7936840057373047, -1.8367940187454224, 1.3931066989898682, 1.3899331092834473, 1.3904708623886108, 2.583644151687622, 2.585787773132324, -8.28970718383789, -8.497215270996094, -8.751309394836426, -8.636907577514648, -8.426375389099121, -9.480332374572754, -9.296429634094238, -8.940195083618164, -9.286066055297852, -9.220185279846191, 3.1867992877960205, 3.1907033920288086, 3.1873137950897217, 3.1879634857177734, -0.24788422882556915, 7.193393707275391, 7.300694465637207, 7.415017604827881, 7.193040370941162, 7.313724040985107, 16.242849349975586, 16.268781661987305, 16.50730323791504, 16.281816482543945, 16.5628662109375, 16.15988540649414, -26.02884864807129, -26.016828536987305, -26.06463050842285, -26.076313018798828, -26.069124221801758, 2.287733793258667, 2.188706636428833, 2.2217302322387695, 2.292985677719116, 2.221309185028076, -9.614127159118652, -9.608946800231934, -9.591719627380371, -12.699295997619629, -12.694757461547852, -12.703083992004395, -12.698982238769531, 18.106502532958984, 18.47689437866211, 18.422508239746094, 18.744274139404297, 18.193050384521484, 18.747440338134766, 18.885299682617188, 18.014726638793945, 4.983603000640869, 5.4140520095825195, 4.820490837097168, 4.7830891609191895, 5.033219814300537, 5.321137428283691, 5.362527370452881, -0.41249576210975647, -0.41785669326782227, -0.4150391221046448, -4.1052680015563965, 4.70894718170166, 4.690982818603516, 4.7313337326049805, 4.698004722595215, 12.699437141418457, 12.699381828308105, 14.174883842468262, 14.159200668334961, 14.173906326293945, 14.138921737670898, 14.139976501464844, -21.975845336914062, 9.466828346252441, 9.22204303741455, 9.872834205627441, 9.203035354614258, 9.43144702911377, 9.731632232666016, 9.7525634765625, 4.5093464851379395, 4.509256362915039, 4.5092668533325195, 14.386061668395996, -9.425559997558594, -9.427104949951172, -9.418917655944824, -9.422863006591797, 4.063521862030029, 4.063606262207031, -6.47519063949585, -6.475346565246582, -1.155508279800415, 12.358561515808105, 12.074325561523438, 12.233854293823242, 12.406996726989746, 12.513025283813477, 12.085257530212402, -1.4133363962173462, -1.4077106714248657, -1.428531527519226, -1.3645904064178467, -1.4195390939712524, 7.425373077392578, 7.247035026550293, 7.933019638061523, 6.813719272613525, 7.766871452331543, 7.719539642333984, 6.9207282066345215, 7.35595703125, 7.049497127532959, 7.931153774261475, -0.8106504082679749, 11.70649528503418, 11.700149536132812, 11.69976806640625, 11.711755752563477, 8.148687362670898, 8.155036926269531, 8.14598560333252, 8.14989185333252, 13.27013111114502, 13.568933486938477, 13.886879920959473, 14.099528312683105, 14.082669258117676, 13.152230262756348, 13.500066757202148, 13.229683876037598, 13.83609390258789, -3.6567511558532715, -3.651035785675049, -3.655130624771118, -1.9168152809143066, -8.37717056274414, -8.377163887023926, -0.26680970191955566, -0.26984649896621704, -0.2692858874797821, -0.2666560113430023, 6.477514266967773, 6.476682186126709, 6.057377815246582, 6.0332159996032715, 6.0709075927734375, 6.022860527038574, 6.0798821449279785, -2.687235116958618, -2.6788489818573, -2.804076910018921, -2.8038747310638428, -2.8429200649261475, -6.270541667938232, -6.328247547149658, -6.356196880340576, -6.438570976257324, -6.243380069732666, -5.039488792419434, 3.726886034011841, -0.5097017288208008, -0.503799557685852, -0.4971468448638916, -0.49476006627082825 ] }, { "hovertemplate": "%{text}", "marker": { "color": "#00ff00", "line": { "color": "white", "width": 1 }, "opacity": 0.8, "size": 10 }, "mode": "markers", "name": "Candidates", "text": [ "Candidate 0", "Candidate 1", "Candidate 2", "Candidate 3", "Candidate 4", "Candidate 5", "Candidate 6", "Candidate 7", "Candidate 8", "Candidate 9", "Candidate 10", "Candidate 11", "Candidate 12", "Candidate 13", "Candidate 14", "Candidate 15", "Candidate 16", "Candidate 17", "Candidate 18", "Candidate 19", "Candidate 20", "Candidate 21", "Candidate 22", "Candidate 23", "Candidate 24", "Candidate 25", "Candidate 26", "Candidate 27", "Candidate 28", "Candidate 29", "Candidate 30", "Candidate 31", "Candidate 32", "Candidate 33", "Candidate 34", "Candidate 35", "Candidate 36", "Candidate 37", "Candidate 38", "Candidate 39", "Candidate 40", "Candidate 41", "Candidate 42", "Candidate 43", "Candidate 44", "Candidate 45", "Candidate 46", "Candidate 47", "Candidate 48", "Candidate 49", "Candidate 50", "Candidate 51", "Candidate 52", "Candidate 53", "Candidate 54", "Candidate 55", "Candidate 56", "Candidate 57", "Candidate 58", "Candidate 59", "Candidate 60", "Candidate 61", "Candidate 62", "Candidate 63", "Candidate 64", "Candidate 65", "Candidate 66", "Candidate 67", "Candidate 68", "Candidate 69", "Candidate 70", "Candidate 71", "Candidate 72", "Candidate 73", "Candidate 74", "Candidate 75", "Candidate 76", "Candidate 77", "Candidate 78", "Candidate 79", "Candidate 80", "Candidate 81", "Candidate 82", "Candidate 83", "Candidate 84", "Candidate 85", "Candidate 86", "Candidate 87", "Candidate 88", "Candidate 89", "Candidate 90", "Candidate 91", "Candidate 92", "Candidate 93", "Candidate 94", "Candidate 95", "Candidate 96", "Candidate 97", "Candidate 98", "Candidate 99", "Candidate 100", "Candidate 101", "Candidate 102", "Candidate 103", "Candidate 104", "Candidate 105", "Candidate 106", "Candidate 107", "Candidate 108", "Candidate 109", "Candidate 110", "Candidate 111", "Candidate 112", "Candidate 113", "Candidate 114", "Candidate 115", "Candidate 116", "Candidate 117", "Candidate 118", "Candidate 119", "Candidate 120", "Candidate 121", "Candidate 122", "Candidate 123", "Candidate 124", "Candidate 125", "Candidate 126", "Candidate 127", "Candidate 128", "Candidate 129", "Candidate 130", "Candidate 131", "Candidate 132", "Candidate 133", "Candidate 134", "Candidate 135", "Candidate 136", "Candidate 137", "Candidate 138", "Candidate 139", "Candidate 140", "Candidate 141", "Candidate 142", "Candidate 143", "Candidate 144", "Candidate 145", "Candidate 146", "Candidate 147", "Candidate 148", "Candidate 149", "Candidate 150", "Candidate 151", "Candidate 152", "Candidate 153", "Candidate 154", "Candidate 155", "Candidate 156", "Candidate 157", "Candidate 158", "Candidate 159", "Candidate 160", "Candidate 161", "Candidate 162", "Candidate 163", "Candidate 164", "Candidate 165", "Candidate 166", "Candidate 167", "Candidate 168", "Candidate 169", "Candidate 170", "Candidate 171", "Candidate 172", "Candidate 173", "Candidate 174", "Candidate 175", "Candidate 176", "Candidate 177", "Candidate 178", "Candidate 179", "Candidate 180", "Candidate 181", "Candidate 182", "Candidate 183", "Candidate 184", "Candidate 185", "Candidate 186", "Candidate 187", "Candidate 188", "Candidate 189", "Candidate 190", "Candidate 191", "Candidate 192", "Candidate 193", "Candidate 194", "Candidate 195", "Candidate 196", "Candidate 197", "Candidate 198", "Candidate 199" ], "type": "scatter", "x": [ 44.881019592285156, 49.14700698852539, 40.504051208496094, 39.40999221801758, 30.718713760375977, 36.64801025390625, 32.5521125793457, 35.28868103027344, 45.434329986572266, 50.60261917114258, 38.832096099853516, 38.85292053222656, 49.82123947143555, 45.39486312866211, 38.043521881103516, 53.40532302856445, 35.410377502441406, 40.982635498046875, 38.04661178588867, 40.288719177246094, 36.7198486328125, 35.380943298339844, 41.56990432739258, 41.96720504760742, 49.4117317199707, 46.56151580810547, 50.25037384033203, 39.630271911621094, 44.788490295410156, 39.73720169067383, 43.0688591003418, 48.22175598144531, 42.726810455322266, 32.287872314453125, 48.532318115234375, 42.786434173583984, 46.8601188659668, 47.60112762451172, 42.10430145263672, 38.424888610839844, 36.5667610168457, 45.7365837097168, 42.89715576171875, 41.307945251464844, 36.126243591308594, 42.42646408081055, 42.762428283691406, 46.56116485595703, 36.66171646118164, 44.41059875488281, 48.40363311767578, 35.23382568359375, 38.52609634399414, 30.991235733032227, 48.32511901855469, 40.19198226928711, 46.087432861328125, 32.41224670410156, 33.118003845214844, 41.96720504760742, 46.866153717041016, 43.615379333496094, 42.067264556884766, 43.938682556152344, 35.51115798950195, 31.895605087280273, 47.21119689941406, 36.30514144897461, 46.71591567993164, 38.418800354003906, 47.81039810180664, 39.87274932861328, 50.93589401245117, 45.50498962402344, 37.302059173583984, 35.707603454589844, 48.477787017822266, 34.53951644897461, 43.84562683105469, 46.50700759887695, 40.18986511230469, 47.02585983276367, 34.31013870239258, 43.59941482543945, 36.723697662353516, 40.61833953857422, 32.82719802856445, 48.3380241394043, 45.86796569824219, 47.860107421875, 43.23384475708008, 45.142860412597656, 43.444278717041016, 50.92949676513672, 51.021575927734375, 36.42940139770508, 40.14645767211914, 35.85551071166992, 37.21002197265625, 51.95323181152344, 41.888423919677734, 39.05851364135742, 40.32387161254883, 38.16963195800781, 34.29155349731445, 38.832096099853516, 49.742855072021484, 39.57854461669922, 39.18831253051758, 37.30287551879883, 36.51692581176758, 43.61349868774414, 32.299705505371094, 35.34605026245117, 39.11907958984375, 42.62443542480469, 43.019989013671875, 49.261837005615234, 49.80301284790039, 49.182090759277344, 48.82513427734375, 53.42035675048828, 31.051219940185547, 43.805137634277344, 32.94839096069336, 33.32707595825195, 50.51560974121094, 44.92549514770508, 31.399808883666992, 37.10387420654297, 31.303312301635742, 35.574554443359375, 45.25200653076172, 44.7913703918457, 36.51569366455078, 44.74193572998047, 33.983848571777344, 47.161354064941406, 41.23354721069336, 42.75897979736328, 45.23393249511719, 31.742740631103516, 37.52686309814453, 34.7752799987793, 49.5012321472168, 42.75912094116211, 40.134037017822266, 46.993289947509766, 38.534908294677734, 34.12739562988281, 39.96201705932617, 37.16326141357422, 35.922874450683594, 44.20255661010742, 38.034358978271484, 40.190757751464844, 46.43439483642578, 44.90678024291992, 38.95993423461914, 41.4968147277832, 39.49539566040039, 39.600765228271484, 50.402931213378906, 31.825075149536133, 40.950782775878906, 41.6561164855957, 44.39360427856445, 38.95592498779297, 39.648902893066406, 43.564231872558594, 39.15479278564453, 45.63834762573242, 39.29732131958008, 42.98911666870117, 45.66842269897461, 43.81102752685547, 36.32315444946289, 43.17835235595703, 43.51537322998047, 44.62496566772461, 45.06987380981445, 42.248477935791016, 36.618831634521484, 46.178916931152344, 40.18998336791992, 42.347103118896484, 37.82682800292969, 50.73632049560547, 44.37343215942383, 46.77196502685547, 36.842933654785156, 36.61891174316406, 33.37831497192383, 52.00126266479492, 42.71004867553711, 45.20596694946289, 46.221336364746094, 36.389747619628906, 38.178470611572266, 47.437992095947266 ], "y": [ 11.56125259399414, 5.178883075714111, 7.803081035614014, -8.386466979980469, 11.326899528503418, 4.924493312835693, 11.27585220336914, 1.3990848064422607, 5.04889440536499, 10.625184059143066, -6.188225746154785, 6.535639762878418, 5.468353271484375, 8.918660163879395, 14.8682279586792, 8.136441230773926, 3.0052449703216553, 8.377143859863281, 14.863316535949707, 5.89628267288208, -4.706168174743652, 5.8719964027404785, 7.138311386108398, -3.9246628284454346, 3.191899299621582, 15.077778816223145, -0.16757884621620178, 4.656816005706787, -4.7286858558654785, 6.360645294189453, 7.858059406280518, 13.68551254272461, -5.707596302032471, 10.52425765991211, 10.05073070526123, 6.302595615386963, 6.444956302642822, 1.4667487144470215, 12.962985038757324, -8.735273361206055, 0.9264240860939026, 7.236879825592041, 1.3928148746490479, 2.288439989089966, 0.5233746767044067, 12.454290390014648, 13.511958122253418, 15.062203407287598, -6.576770782470703, 6.1063337326049805, 13.71780776977539, -7.0803422927856445, 4.94042444229126, 10.60351848602295, 13.700973510742188, 3.508012056350708, 3.924899101257324, 10.571757316589355, -1.9894105195999146, -3.9246628284454346, 2.659722328186035, 6.0124077796936035, 10.980657577514648, 7.090834617614746, 6.204251289367676, 10.969051361083984, 10.080301284790039, -3.965700149536133, 3.142866611480713, -0.5675038695335388, 4.170748233795166, 5.317327499389648, 11.825203895568848, 6.806036472320557, 3.3164777755737305, 2.0374982357025146, 6.2389373779296875, -7.024060249328613, 3.615601062774658, 5.455191612243652, -5.098424434661865, 10.081814765930176, -1.0847008228302002, 12.26482105255127, -7.892942428588867, 2.8376333713531494, -2.8204996585845947, 13.214852333068848, 1.0116311311721802, 14.144298553466797, -9.191490173339844, 6.685647010803223, 12.103961944580078, 11.8748140335083, 11.8717041015625, 0.7219507098197937, -3.7953598499298096, 6.861129283905029, 0.10303826630115509, 12.594937324523926, 4.835472106933594, 3.400824785232544, 6.038657188415527, -3.814763307571411, -1.0687628984451294, -6.188225746154785, 3.5755062103271484, 10.395934104919434, -1.470668077468872, -6.938816070556641, -8.200026512145996, 8.462796211242676, 9.552630424499512, 3.1913468837738037, -8.605483055114746, -5.624361991882324, 7.926066875457764, 7.00724458694458, -0.2951894998550415, 8.183613777160645, 6.414566993713379, 8.098626136779785, 11.479122161865234, 3.5937209129333496, -1.258918285369873, 10.460214614868164, -0.019254282116889954, -0.5646641254425049, -0.632266640663147, -0.4123762249946594, -0.6286211013793945, -1.8933672904968262, 1.7209094762802124, -0.7729472517967224, -8.201231002807617, -4.736190319061279, -2.8047497272491455, 7.550336837768555, 0.9299692511558533, 5.232337951660156, 8.268961906433105, 10.453574180603027, -5.231142520904541, 4.517542839050293, 3.871443510055542, 12.147530555725098, -1.632186770439148, 1.211039423942566, 1.5974758863449097, -6.875067234039307, -2.4311416149139404, -0.9586828947067261, -4.992953300476074, 12.410727500915527, 14.86377239227295, 8.213384628295898, 4.357536792755127, 4.7480549812316895, 0.9730406999588013, 0.3461496829986572, -1.6516852378845215, -8.32040786743164, 5.219015598297119, 9.9949369430542, 1.9615178108215332, 3.5464396476745605, -5.21997594833374, 0.7549038529396057, 3.907456398010254, 10.411642074584961, 3.162490129470825, 5.652448654174805, 1.801606297492981, 12.70177936553955, 5.5790815353393555, 3.6215970516204834, 5.249258518218994, -9.200860977172852, -0.2554374039173126, 7.27818489074707, -4.12667179107666, -0.25698956847190857, 9.808212280273438, 7.17213249206543, -5.098593711853027, 6.148163795471191, 1.9480384588241577, 12.453739166259766, 11.086930274963379, 2.975510835647583, -5.858706474304199, 9.808074951171875, 3.2854363918304443, 12.44294261932373, 5.408707618713379, 1.8827999830245972, 8.006770133972168, -4.128926753997803, -3.8843834400177, 5.439088821411133 ] } ], "layout": { "annotations": [ { "bgcolor": "rgba(0,0,0,0.8)", "bordercolor": "#00ff00", "borderwidth": 2, "font": { "color": "#00ff00", "size": 14 }, "showarrow": false, "text": "πŸ’‘ Overlap = Postings successfully bridge the gap!", "x": 0.02, "xref": "paper", "y": 0.02, "yref": "paper" } ], "font": { "color": "white" }, "height": 800, "legend": { "x": 0.02, "y": 0.98 }, "paper_bgcolor": "#0d0d0d", "plot_bgcolor": "#1a1a1a", "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "fillpattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "title": { "text": "🎯 HRHUB Vector Space: Bridging Candidates ↔ Companies" }, "width": 1200, "xaxis": { "title": { "text": "TSNE Dimension 1" } }, "yaxis": { "title": { "text": "TSNE Dimension 2" } } } } }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "βœ… Vector space visualization created!\n" ] }, { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "hovertemplate": "%{text}", "marker": { "color": "#ff6b6b", "opacity": 0.6, "size": 6 }, "mode": "markers", "name": "Companies", "text": [ "Company: IBM", "Company: GE HealthCare", "Company: Hewlett Packard Enterprise", "Company: Oracle", "Company: Accenture", "Company: Microsoft", "Company: Deloitte", "Company: Siemens", "Company: PwC", "Company: AT&T", "Company: Intel Corporation", "Company: Ericsson", "Company: Cisco", "Company: Motorola Mobility (a Lenovo Co", "Company: JPMorgan Chase & Co.", "Company: Nokia", "Company: EY", "Company: KPMG US", "Company: NXP Semiconductors", "Company: Philips", "Company: Verizon", "Company: SAP", "Company: Procter & Gamble", "Company: Bank of America", "Company: Elite Technology", "Company: BT Group", "Company: Pfizer", "Company: Johnson & Johnson", "Company: UBS", "Company: US Army Corps of Engineers", "Company: Wells Fargo", "Company: Unilever", "Company: Sony", "Company: Sony Electronics", "Company: Sony Pictures Entertainment", "Company: Atos", "Company: Deutsche Bank", "Company: DWS Group", "Company: Chubb", "Company: Shell", "Company: American Express", "Company: Unisys", "Company: Infosys", "Company: Yahoo", "Company: The Walt Disney Company", "Company: Fidelity Investments", "Company: Wipro", "Company: LinkedIn", "Company: Air Force Research Laboratory", "Company: Honeywell", "Company: Tata Consultancy Services", "Company: National Security Agency", "Company: National Computer Systems", "Company: McKinsey & Company", "Company: Xerox", "Company: Fujitsu Network Communications", "Company: Goldman Sachs", "Company: Boeing", "Company: bp", "Company: T-Mobile", "Company: NestlΓ©", "Company: GSK", "Company: Thomson Reuters", "Company: Booz Allen Hamilton", "Company: Novartis", "Company: Northrop Grumman", "Company: CGI", "Company: Capital One", "Company: Barclays", "Company: PepsiCo", "Company: Google", "Company: Electronic Arts (EA)", "Company: SUSE", "Company: ADP", "Company: CDK Global", "Company: Teradata", "Company: SLB", "Company: General Motors", "Company: Ally", "Company: Adobe", "Company: eBay", "Company: PayPal", "Company: Ford Motor Company", "Company: Merck", "Company: SAS", "Company: Avaya", "Company: AMD", "Company: MIT Lincoln Laboratory", "Company: Raytheon", "Company: BNP Paribas", "Company: MondelΔ“z International", "Company: Eastman Kodak Company", "Company: Carestream", "Company: UPS", "Company: Agilent Technologies", "Company: The Home Depot", "Company: Amdocs", "Company: Mars", "Company: Kaiser Permanente", "Company: Amazon", "Company: BMC Software", "Company: Roche", "Company: AstraZeneca", "Company: Abbott", "Company: SAIC", "Company: Dignity Health", "Company: Owens & Minor", "Company: Stanford Children's Health | L", "Company: Boston Scientific", "Company: Sanofi", "Company: Harvard Medical School", "Company: Harvard University", "Company: Harvard Law School", "Company: Dana-Farber Cancer Institute", "Company: Boston Children's Hospital", "Company: Beth Israel Deaconess Medical ", "Company: L'OrΓ©al", "Company: Eli Lilly and Company", "Company: Intuit", "Company: FedEx Ground", "Company: FedEx Services", "Company: Ogilvy", "Company: Gap Inc.", "Company: Banana Republic", "Company: Cognizant", "Company: Robert Half", "Company: ExxonMobil", "Company: Societe Generale", "Company: The Coca-Cola Company", "Company: Comcast", "Company: Nielsen", "Company: HCLTech", "Company: AIG", "Company: BBC", "Company: State Street", "Company: Bristol Myers Squibb", "Company: Boston Consulting Group (BCG)", "Company: SLAC National Accelerator Labo", "Company: Stanford University School of ", "Company: Stanford University", "Company: ManpowerGroup", "Company: RBC", "Company: TotalEnergies", "Company: NBC News", "Company: NBCUniversal", "Company: CNBC", "Company: Allstate", "Company: Medtronic", "Company: Prudential Financial", "Company: Charles Schwab", "Company: 3M", "Company: Capco Energy Solutions", "Company: Marsh", "Company: Autodesk", "Company: BAE Systems, Inc.", "Company: Nickelodeon", "Company: Bayer", "Company: McKesson", "Company: General Dynamics Information T", "Company: General Dynamics Land Systems", "Company: General Dynamics Mission Syste", "Company: Philip Morris International", "Company: McCann Worldgroup", "Company: MRM", "Company: UM Worldwide", "Company: The Adecco Group", "Company: PTC", "Company: Thales", "Company: Sogeti", "Company: Rabobank", "Company: Mavenir", "Company: NASA - National Aeronautics an", "Company: Qualcomm", "Company: Applied Materials", "Company: Western Union", "Company: Nike", "Company: Spectrum Enterprise", "Company: Coldwell Banker Realty", "Company: Aon", "Company: CNN", "Company: TE Connectivity", "Company: Amgen", "Company: Gartner", "Company: Volvo Group", "Company: Volvo Penta", "Company: Volvo Buses", "Company: Mack Trucks", "Company: Volvo Construction Equipment", "Company: NetApp", "Company: Toyota North America", "Company: Bain & Company", "Company: Avis Budget Group", "Company: Best Buy", "Company: Pearson", "Company: Infineon Technologies", "Company: TEKsystems", "Company: Allegis Group", "Company: DuPont", "Company: Cadence Design Systems", "Company: Cardinal Health", "Company: Department for Transport (DfT)", "Company: Visa", "Company: Chevron", "Company: Canon Solutions America", "Company: Bosch Security and Safety Syst", "Company: LexisNexis", "Company: MetLife", "Company: Halliburton", "Company: KBR, Inc.", "Company: Keller Williams Realty, Inc.", "Company: Novo Nordisk", "Company: Hanesbrands Inc.", "Company: Danone", "Company: Juniper Networks", "Company: Johnson Controls", "Company: Victoria’s Secret & Co.", "Company: Bath & Body Works", "Company: Spherion", "Company: Starbucks", "Company: Delta Air Lines", "Company: Genentech", "Company: Flex", "Company: The Wall Street Journal", "Company: Dow Jones", "Company: Macy's", "Company: Insight", "Company: Kelly", "Company: Marriott International", "Company: CBRE", "Company: Randstad", "Company: Schneider Electric", "Company: Nationwide", "Company: Baxter International Inc.", "Company: United Airlines", "Company: State Farm", "Company: Dun & Bradstreet", "Company: Mercer", "Company: Pratt & Whitney", "Company: Carrier HVAC", "Company: Grant Thornton LLP (US)", "Company: Alstom", "Company: Northwestern Mutual", "Company: Hilton", "Company: Oliver Wyman", "Company: Synopsys Inc", "Company: Zurich North America", "Company: Digitas North America", "Company: The Hartford", "Company: UCLA Health", "Company: Children's Hospital Los Angele", "Company: UCLA", "Company: Wolters Kluwer", "Company: Cigna Healthcare", "Company: Bloomberg", "Company: Diageo", "Company: Rockwell Automation", "Company: Michigan Medicine", "Company: University of Michigan", "Company: U.S. Bank", "Company: Experian", "Company: iHeartMedia", "Company: Clear Channel Outdoor", "Company: Whirlpool Corporation", "Company: Dow", "Company: Ingram Micro", "Company: CrΓ©dit Agricole CIB", "Company: University of Washington", "Company: Momentum Worldwide", "Company: Eaton", "Company: Tetra Pak", "Company: Panasonic Automotive North Ame", "Company: Panasonic North America", "Company: Panasonic Avionics Corporation", "Company: Caterpillar Inc.", "Company: Columbia University Irving Med", "Company: Columbia University", "Company: BASF", "Company: American Airlines", "Company: Citrix", "Company: Walmart", "Company: University of Illinois Chicago", "Company: University of Illinois Urbana-", "Company: Caltrans", "Company: County of San Diego", "Company: CalPERS", "Company: California Department of Justi", "Company: Valeo", "Company: McDonald's", "Company: Cargill", "Company: John Hancock", "Company: Manulife", "Company: Liberty Mutual Insurance", "Company: OpenText", "Company: KLA", "Company: BOMBARDIER", "Company: RR Donnelley", "Company: Acxiom", "Company: IKEA", "Company: Colgate-Palmolive", "Company: Expedia Group", "Company: Emerson", "Company: TD", "Company: Andersen Corporation", "Company: Federal Reserve Board", "Company: Federal Reserve Bank of San Fr", "Company: Federal Reserve Bank of Boston", "Company: Sage", "Company: Publicis", "Company: General Mills", "Company: BlackBerry", "Company: Mary Kay Global", "Company: University of California, Sant", "Company: University of California, Davi", "Company: UC Davis Health", "Company: Commonwealth Bank", "Company: BDO USA", "Company: Visteon Corporation", "Company: Seagate Technology", "Company: Canon Business Process Service", "Company: ITT Inc.", "Company: Aerotek", "Company: Brigham and Women's Hospital", "Company: Massachusetts General Hospital", "Company: Newton-Wellesley Hospital", "Company: NYC Department of Education", "Company: Albertsons Companies", "Company: Shaw's Supermarkets", "Company: Acme Markets", "Company: The Save Mart Companies", "Company: Teradyne", "Company: S&P Global", "Company: Teacher Retirement System of T", "Company: Texas Health and Human Service", "Company: Texas Workforce Commission", "Company: Texas Attorney General", "Company: Allianz Life", "Company: Lexmark", "Company: Saint-Gobain", "Company: CSAA Insurance Group, a AAA In", "Company: CertainTeed", "Company: VMware", "Company: Transportation Security Admini", "Company: FEMA", "Company: U.S. Customs and Border Protec", "Company: Universal Music Group", "Company: Fifth Third Bank", "Company: Mastercard", "Company: Staples", "Company: Elsevier", "Company: University of California, San ", "Company: UCSF Health", "Company: Ameriprise Financial Services,", "Company: Sony Music Entertainment", "Company: Alcoa", "Company: University of Phoenix", "Company: Accor", "Company: Tech Mahindra", "Company: Broadcom", "Company: Kforce Inc", "Company: Thermo Fisher Scientific", "Company: University of Southern Califor", "Company: Travelers", "Company: Check Point Software Technolog", "Company: Reckitt", "Company: U.S. Department of State", "Company: BD", "Company: Office Depot", "Company: Lionbridge", "Company: Edwards Vacuum", "Company: FIS", "Company: The HEINEKEN Company", "Company: Hyatt Regency", "Company: Levi Strauss & Co.", "Company: Scotiabank", "Company: Freddie Mac", "Company: Stop & Shop", "Company: Software Engineering Institute", "Company: NYU Stern School of Business", "Company: The University of Texas at Aus", "Company: Penn Medicine, University of P", "Company: University of Pennsylvania", "Company: The Ohio State University Wexn", "Company: The Ohio State University", "Company: Ohio Department of Education a", "Company: Ingersoll Rand", "Company: JLL", "Company: University of Minnesota", "Company: Salesforce", "Company: Mallinckrodt Pharmaceuticals", "Company: Northwestern University", "Company: Mattel, Inc.", "Company: AkzoNobel", "Company: Agfa", "Company: Boehringer Ingelheim", "Company: Farmers Insurance", "Company: International Paper", "Company: CNA Insurance", "Company: KeyBank", "Company: Aegon", "Company: Danfoss", "Company: Progressive Insurance", "Company: DHL Supply Chain", "Company: Stryker", "Company: Physio", "Company: Bechtel Corporation", "Company: Ricoh USA, Inc.", "Company: Avery Dennison", "Company: Cox Communications", "Company: CDW", "Company: Textron", "Company: Textron Systems", "Company: Kaplan", "Company: Fiserv", "Company: Nordstrom", "Company: UC San Diego", "Company: UC San Diego Health", "Company: IDC", "Company: Celestica", "Company: FICO", "Company: Sodexo", "Company: Pizza Hut", "Company: Taco Bell", "Company: Yum! Brands", "Company: Georgia-Pacific LLC", "Company: New York Life Insurance Compan", "Company: Kimberly-Clark", "Company: Peace Corps", "Company: Analog Devices", "Company: UPMC", "Company: UPMC Health Plan", "Company: Electrolux Group", "Company: Holcim", "Company: Michael Page", "Company: Hays", "Company: IDEMIA", "Company: Conagra Brands", "Company: Progress", "Company: Safeway", "Company: Weill Cornell Medicine", "Company: Cornell University", "Company: Johns Hopkins Hospital", "Company: The Johns Hopkins University", "Company: Continental", "Company: Edelman", "Company: Macquarie Group", "Company: Red Hat", "Company: IHG Hotels & Resorts", "Company: Boston University", "Company: Georgia Tech Research Institut", "Company: Georgia Institute of Technolog", "Company: Hughes", "Company: Arrow Electronics", "Company: Computacenter", "Company: Mphasis", "Company: The Princeton Group", "Company: Walgreens", "Company: ESPN", "Company: NVIDIA", "Company: Cummins Inc.", "Company: HCA Healthcare", "Company: HCA Healthcare Physician Servi", "Company: MassMutual", "Company: Compucom", "Company: University of Maryland", "Company: Lenovo", "Company: Penn State University", "Company: Penn State Health", "Company: H&R Block", "Company: CACI International Inc", "Company: Franklin Templeton", "Company: Edward Jones", "Company: Corning Incorporated", "Company: Fluor Corporation", "Company: Mastech Digital", "Company: JCPenney", "Company: Micron Technology", "Company: United States Postal Service", "Company: Equifax", "Company: Lear Corporation", "Company: The Reynolds and Reynolds Comp", "Company: the LEGO Group", "Company: ArcelorMittal", "Company: Korn Ferry", "Company: RSM US LLP", "Company: ZF Group", "Company: adidas", "Company: University of North Carolina a", "Company: Discover Financial Services", "Company: GroupM", "Company: University of Colorado", "Company: University of Colorado Boulder", "Company: Marvell Technology", "Company: Epsilon", "Company: Iron Mountain", "Company: John Deere", "Company: AllianceBernstein", "Company: Air Liquide", "Company: Northern Trust", "Company: Swiss Re", "Company: MITRE" ], "type": "scatter", "x": [ -4.24137020111084, -4.3178863525390625, -4.338122844696045, -4.358405113220215, -27.552812576293945, -27.971195220947266, -28.579879760742188, -27.733108520507812, -28.356107711791992, -27.99759292602539, -27.778554916381836, -28.611600875854492, -28.280330657958984, -28.68898582458496, -2.601194381713867, -2.6001484394073486, -2.6000428199768066, -2.596459150314331, -2.056368350982666, -2.089918851852417, -2.015655279159546, -2.0933783054351807, -2.0983059406280518, 2.7976322174072266, 2.779151678085327, 3.0421037673950195, 3.4544646739959717, 3.3139607906341553, 3.316918134689331, 3.0533199310302734, -9.834299087524414, -9.752479553222656, -9.856888771057129, -10.128973007202148, -10.530952453613281, -10.421584129333496, -10.170528411865234, -10.403238296508789, -3.6923563480377197, -3.294551134109497, -3.1231250762939453, -3.145516872406006, -3.5765326023101807, -3.482145071029663, -3.8543713092803955, -23.523513793945312, -23.524551391601562, -23.5240478515625, -7.233014106750488, -8.53653335571289, -8.15380859375, -8.501815795898438, -8.722018241882324, -8.660520553588867, -8.121309280395508, -8.042267799377441, -8.011183738708496, -7.289564609527588, -7.288326263427734, -5.608010292053223, -5.602958679199219, -5.605586051940918, -9.761113166809082, -9.89045238494873, -9.784634590148926, -9.532604217529297, -9.173712730407715, -9.091053009033203, -9.19820499420166, -9.451706886291504, -6.040831089019775, -24.977779388427734, -24.706716537475586, -24.663776397705078, -25.199556350708008, -24.557453155517578, -24.949010848999023, -25.19023895263672, -5.697776794433594, -0.4405054450035095, -0.18014220893383026, -0.004869137890636921, -0.7620863914489746, -0.44087544083595276, -0.8514084815979004, -0.1739729791879654, -0.7683146595954895, -22.410049438476562, -22.40914535522461, -5.824016571044922, -30.17707633972168, -30.216686248779297, -30.341777801513672, -30.41912841796875, -30.592636108398438, -30.57615089416504, -4.672780513763428, -4.726765155792236, -4.5722246170043945, -4.973163604736328, -5.259900093078613, -5.413698196411133, -4.990335941314697, -5.303680419921875, -8.88879680633545, -8.885845184326172, -8.894865036010742, -8.89278507232666, -26.322372436523438, -26.325456619262695, -21.837074279785156, -21.5459041595459, -22.06316375732422, -21.506153106689453, -21.21651840209961, -21.187904357910156, -21.276187896728516, -22.032827377319336, -21.915313720703125, -2.3115286827087402, -5.518636703491211, -35.518463134765625, -35.48280715942383, -35.522178649902344, -35.4670524597168, -35.4361572265625, -35.087913513183594, -35.58370590209961, -34.87578582763672, -35.62587356567383, -35.408935546875, -34.85454177856445, -35.43284606933594, -35.05355453491211, -26.468137741088867, -26.27060317993164, -26.68292236328125, -26.451948165893555, -26.68276023864746, -26.23354148864746, -3.4139246940612793, -20.083295822143555, -20.059537887573242, -20.660409927368164, -20.270421981811523, -20.864688873291016, -20.567720413208008, -20.829566955566406, -20.35312271118164, -22.19036865234375, -22.189289093017578, -13.587738990783691, -13.454716682434082, -13.456597328186035, -20.332414627075195, -20.33207893371582, -20.333778381347656, -0.34378382563591003, -0.34770047664642334, -16.530988693237305, -16.526899337768555, -15.783917427062988, -8.769662857055664, -8.769761085510254, -16.2064208984375, -19.413846969604492, -19.126148223876953, -19.75751304626465, -19.158021926879883, -19.251195907592773, -20.007959365844727, -20.029024124145508, -19.548065185546875, -19.89056396484375, -1.5309442281723022, -1.6597559452056885, -1.7276135683059692, -1.6025630235671997, -1.5736761093139648, 0.4048156142234802, 0.6006110310554504, 0.9187921285629272, 1.1730999946594238, 0.9947662353515625, 0.4126272201538086, 1.2184549570083618, 0.7334967851638794, -11.91291332244873, -11.904091835021973, -11.916181564331055, -11.918109893798828, -19.39845085144043, -19.40043067932129, -19.40030288696289, -26.239173889160156, -26.281490325927734, -26.282222747802734, -26.232807159423828, -26.337642669677734, 5.531064510345459, 4.404710292816162, 5.369546413421631, 4.496846675872803, 5.254345893859863, 5.030145168304443, 4.872509956359863, 4.568388938903809, 4.716418266296387, 5.319346904754639, -5.565598487854004, -5.55322790145874, -5.564345359802246, -5.574850082397461, -5.55647087097168, -2.3943564891815186, -2.399383068084717, -2.4008166790008545, 0.8313601613044739, 1.1715900897979736, 1.5407663583755493, 1.4464492797851562, 0.8034867644309998, 1.4693716764450073, 1.1846123933792114, 0.6507624387741089, 0.6145052909851074, 6.8431525230407715, 7.125302314758301, 7.004112720489502, 7.861507892608643, 7.328383922576904, 7.72862434387207, 7.314584732055664, 8.016460418701172, 6.759486675262451, 7.544021129608154, 7.956840991973877, 30.05211067199707, -3.2194082736968994, 4.527701377868652, -10.134698867797852, -10.135124206542969, -10.135838508605957, 2.57720947265625, -18.288490295410156, -18.347190856933594, -19.085346221923828, -18.61731719970703, -18.49294090270996, -19.02305793762207, -18.917436599731445, -18.791851043701172, -4.433652877807617, -4.847480297088623, -4.625294208526611, -4.933119773864746, -4.34064245223999, -4.285317420959473, -4.767528533935547, -17.053302764892578, -17.347265243530273, -16.8806209564209, -17.140029907226562, -17.224576950073242, -16.69387435913086, -16.672204971313477, 8.030542373657227, 8.05367374420166, 8.08086109161377, 8.048445701599121, 8.075176239013672, -27.294570922851562, -27.289358139038086, -37.83115005493164, -37.837154388427734, -37.82405090332031, -37.83470916748047, 10.589198112487793, 10.554102897644043, 10.535621643066406, 10.60053825378418, 10.531112670898438, 0.7591871023178101, 0.9147530198097229, 1.1832143068313599, 1.0623406171798706, 0.85174560546875, 1.2330970764160156, -32.5739860534668, -32.574092864990234, -32.57891082763672, -6.601039409637451, -6.387275695800781, -6.647823333740234, -5.952861785888672, -6.304680824279785, -5.840428352355957, -5.810103416442871, -6.034609317779541, -6.727883338928223, 3.618821144104004, 3.640995979309082, 3.6421854496002197, 3.580061912536621, 3.614780902862549, -22.446414947509766, -22.752214431762695, -22.77307891845703, -22.079938888549805, -22.872146606445312, -22.158283233642578, -22.5179443359375, -22.20547866821289, -18.756563186645508, -18.7479248046875, -24.424867630004883, -24.61821746826172, -24.877859115600586, -24.614521026611328, -25.284893035888672, -24.373289108276367, -25.21095848083496, -25.284015655517578, -24.969507217407227, -12.157753944396973, -12.224197387695312, -12.223766326904297, -12.203413963317871, -12.18458366394043, -12.996539115905762, -12.994865417480469, -12.99761962890625, 0.3239681124687195, 0.3248487710952759, -31.465486526489258, -31.803741455078125, -31.914264678955078, -30.88895034790039, -31.16046714782715, -31.31542205810547, -30.97418212890625, -30.882476806640625, -31.606773376464844, -31.844955444335938, 4.484798431396484, 4.485192775726318, 4.4865498542785645, 4.48664665222168, 0.41323330998420715, -4.3023858070373535, -4.248412609100342, -4.23777437210083, -4.276479721069336, -4.237058162689209, -11.794960975646973, -11.81525993347168, -11.35061264038086, -11.487104415893555, -11.490395545959473, -11.140819549560547, -16.529550552368164, -16.547252655029297, -16.521183013916016, -16.506324768066406, -16.491849899291992, -16.039363861083984, -16.02261734008789, -16.0550537109375, -16.050703048706055, -16.051929473876953, -14.05414867401123, -14.051904678344727, -14.067402839660645, -14.015253067016602, -14.01409912109375, -14.016681671142578, -14.022357940673828, -14.093828201293945, -13.38281536102295, -14.206522941589355, -14.083795547485352, -13.500131607055664, -13.430131912231445, -13.776322364807129, -13.78488540649414, -39.2267951965332, -38.98285675048828, -39.06846618652344, -38.686614990234375, -38.6190299987793, -39.24813461303711, -38.731048583984375, 1.570813536643982, 1.5975366830825806, 1.6024622917175293, -5.285861015319824, -6.57602596282959, -6.575562477111816, -6.61060094833374, -6.581151008605957, 3.052504539489746, 3.0525617599487305, -0.7571971416473389, -0.8235540390014648, -0.7309589982032776, -0.7760552763938904, -0.7842875123023987, -17.472673416137695, -42.78755187988281, -42.97315979003906, -43.15855026245117, -43.258296966552734, -43.46388626098633, -43.405059814453125, -42.86821365356445, -23.704710006713867, -23.70399284362793, -23.704513549804688, -2.168099880218506, -18.172693252563477, -18.16845703125, -18.17005729675293, -18.179351806640625, -32.71333694458008, -32.71073913574219, -20.501413345336914, -20.502592086791992, -6.841009616851807, -16.153671264648438, -15.839752197265625, -15.694329261779785, -15.711568832397461, -15.97099781036377, -16.095924377441406, -32.55427932739258, -32.58639144897461, -32.65240478515625, -32.572959899902344, -32.550636291503906, -15.16662883758545, -15.8662691116333, -15.893783569335938, -15.618935585021973, -16.193870544433594, -15.25831127166748, -16.056880950927734, -16.276260375976562, -15.264616966247559, -15.518315315246582, -2.886726140975952, -34.83712387084961, -34.83542251586914, -34.83583068847656, -34.83544921875, -35.27114486694336, -35.27745819091797, -35.270973205566406, -35.26945877075195, -39.382606506347656, -39.228389739990234, -39.30790328979492, -39.53595733642578, -39.921627044677734, -39.67981719970703, -40.1592903137207, -39.994022369384766, -40.1513786315918, 3.3169963359832764, 3.3239989280700684, 3.3144748210906982, -33.61820983886719, -25.569618225097656, -25.569780349731445, -40.24689483642578, -40.24599075317383, -40.2469596862793, -40.247703552246094, -33.37824249267578, -33.37559509277344, -31.154693603515625, -31.156253814697266, -31.169017791748047, -31.171953201293945, -31.141639709472656, -37.82860565185547, -37.810882568359375, -38.01321029663086, -38.013099670410156, -38.03891372680664, -39.04941177368164, -39.03096008300781, -39.175907135009766, -39.105003356933594, -39.190799713134766, -38.79081344604492, -33.54961013793945, -42.781307220458984, -42.78522872924805, -42.788475036621094, -42.78927993774414 ], "y": [ -2.8635096549987793, -2.851444721221924, -2.8526740074157715, -2.891873598098755, 9.676633834838867, 9.163490295410156, 9.357840538024902, 9.356112480163574, 10.191489219665527, 10.188936233520508, 10.013290405273438, 9.63862419128418, 9.135161399841309, 9.979710578918457, 3.866619825363159, 3.86598801612854, 3.86405873298645, 3.865321397781372, 0.2072354257106781, 0.1947670429944992, 0.19730053842067719, 0.2643047273159027, 0.2776872217655182, -17.91525650024414, -18.19550132751465, -17.73995590209961, -18.072856903076172, -17.804174423217773, -18.3338623046875, -18.403289794921875, 3.2420477867126465, 3.5444841384887695, 3.8682923316955566, 3.120398759841919, 3.505552291870117, 3.864614486694336, 3.9434475898742676, 3.2381575107574463, -17.292564392089844, -16.768104553222656, -16.985414505004883, -17.278827667236328, -16.746150970458984, -17.365148544311523, -16.968900680541992, 13.548473358154297, 13.548452377319336, 13.547490119934082, -2.8659262657165527, -1.1874114274978638, -0.43213924765586853, -0.3569674789905548, -0.620972216129303, -0.8811846971511841, -1.07805597782135, -0.9966306686401367, -0.5227974057197571, 6.890247821807861, 6.891134738922119, 1.5050960779190063, 1.4645648002624512, 1.48892343044281, -12.933213233947754, -13.23643970489502, -13.506190299987793, -13.694775581359863, -13.585308074951172, -13.290281295776367, -12.954646110534668, -12.850640296936035, -1.7425410747528076, -24.518571853637695, -24.54020118713379, -25.09482192993164, -24.696258544921875, -24.8679141998291, -25.19023895263672, -25.008039474487305, -0.32651349902153015, -12.812731742858887, -12.67914867401123, -12.373779296875, -12.042174339294434, -11.963238716125488, -12.362959861755371, -12.108453750610352, -12.635993003845215, -10.422962188720703, -10.42253303527832, 3.297173261642456, 2.4817357063293457, 2.7240238189697266, 2.7934422492980957, 2.351879358291626, 2.6585285663604736, 2.412130832672119, -6.960209846496582, -6.4048075675964355, -6.676794528961182, -7.094333171844482, -6.9895172119140625, -6.63876485824585, -6.2799506187438965, -6.432016372680664, -4.654464244842529, -4.665650367736816, -4.659033298492432, -4.645820617675781, 1.0705355405807495, 1.071446418762207, -23.062652587890625, -22.14866065979004, -22.50562286376953, -23.12274169921875, -22.932706832885742, -22.60494041442871, -22.3409481048584, -22.793088912963867, -22.219709396362305, -2.232858657836914, -0.01768593303859234, 5.294897556304932, 5.230971336364746, 5.253664016723633, 5.182202339172363, 5.2354936599731445, 1.578709363937378, 2.1196985244750977, 1.8467777967453003, 1.8548271656036377, 1.5909082889556885, 2.0760676860809326, 2.3193910121917725, 2.3728325366973877, -15.005640983581543, -14.64710521697998, -14.884615898132324, -14.535579681396484, -14.672675132751465, -14.888736724853516, 9.35511302947998, -27.966501235961914, -27.65034294128418, -28.125, -27.415122985839844, -27.873794555664062, -27.355358123779297, -27.58417510986328, -28.16705322265625, -0.6841879487037659, -0.6824927926063538, 3.928492307662964, 4.142395496368408, 4.145726203918457, 4.961991786956787, 4.961982727050781, 4.962209701538086, -5.344331741333008, -5.339994430541992, -21.942907333374023, -21.941394805908203, -21.796871185302734, -8.814276695251465, -8.813909530639648, -4.700927734375, -13.800084114074707, -13.153971672058105, -13.596528053283691, -13.484760284423828, -12.925291061401367, -13.4747953414917, -13.143994331359863, -12.715150833129883, -12.862981796264648, -3.504392147064209, -3.59232759475708, -3.6051034927368164, -3.622194528579712, -3.5909695625305176, -8.582396507263184, -8.351691246032715, -8.296175003051758, -8.480493545532227, -9.06246566772461, -8.879883766174316, -8.806264877319336, -9.079319953918457, -6.058230400085449, -6.0522990226745605, -6.054074287414551, -6.052179336547852, 0.7040247917175293, 0.7011294364929199, 0.7014017105102539, -20.31622314453125, -20.32339859008789, -20.32008171081543, -20.23169708251953, -20.202661514282227, -8.434019088745117, -8.271801948547363, -8.13978385925293, -8.552013397216797, -7.875633239746094, -8.854232788085938, -7.788851737976074, -7.936968803405762, -8.818839073181152, -8.758784294128418, -11.599879264831543, -11.619361877441406, -11.513934135437012, -11.521453857421875, -11.596078872680664, 11.4599609375, 11.456490516662598, 11.454118728637695, 19.166093826293945, 19.224716186523438, 18.743772506713867, 19.03645896911621, 18.31978416442871, 18.418956756591797, 18.246110916137695, 18.595888137817383, 18.89915657043457, -14.69782829284668, -14.967608451843262, -13.9224271774292, -14.824625015258789, -13.746655464172363, -13.832200050354004, -14.389856338500977, -14.475306510925293, -14.277765274047852, -15.017560958862305, -14.116381645202637, 9.290190696716309, -3.9915294647216797, -13.969433784484863, 8.824982643127441, 8.825672149658203, 8.823226928710938, -4.306271076202393, -19.66788673400879, -19.380882263183594, -19.527189254760742, -19.189594268798828, -19.9368953704834, -19.856462478637695, -19.259349822998047, -19.982276916503906, 17.632030487060547, 17.104320526123047, 16.97700309753418, 17.39596176147461, 17.115596771240234, 17.427907943725586, 17.63515853881836, -4.040163516998291, -3.6010231971740723, -3.375798225402832, -3.9835801124572754, -3.4138877391815186, -3.7529590129852295, -3.5599730014801025, -0.8229596614837646, -0.901198148727417, -0.8195258975028992, -0.9116978049278259, -0.8035401105880737, -1.5844634771347046, -1.585983395576477, 8.00202465057373, 8.009504318237305, 7.994474411010742, 8.004878044128418, -7.194502830505371, -7.217381477355957, -7.214822769165039, -7.174301624298096, -7.216263294219971, 8.367505073547363, 8.172839164733887, 8.268211364746094, 8.665701866149902, 8.600160598754883, 8.488556861877441, 9.292511940002441, 9.293477058410645, 9.294468879699707, 11.810197830200195, 11.044251441955566, 11.18382740020752, 11.8704195022583, 11.944243431091309, 11.283493041992188, 11.55453109741211, 10.99128246307373, 11.504642486572266, -12.262207984924316, -12.336201667785645, -12.330450057983398, -12.146444320678711, -12.268226623535156, -18.056203842163086, -18.162012100219727, -18.751752853393555, -18.485776901245117, -18.44823455810547, -18.195762634277344, -18.92741584777832, -18.77659034729004, -23.425479888916016, -23.413225173950195, -3.383716344833374, -3.629373550415039, -2.723747730255127, -2.778796434402466, -3.166016101837158, -3.0593788623809814, -2.8438422679901123, -3.476107120513916, -3.6853597164154053, -1.918258786201477, -1.7840306758880615, -1.8329840898513794, -1.7936840057373047, -1.8367940187454224, 1.3931066989898682, 1.3899331092834473, 1.3904708623886108, 2.583644151687622, 2.585787773132324, -8.28970718383789, -8.497215270996094, -8.751309394836426, -8.636907577514648, -8.426375389099121, -9.480332374572754, -9.296429634094238, -8.940195083618164, -9.286066055297852, -9.220185279846191, 3.1867992877960205, 3.1907033920288086, 3.1873137950897217, 3.1879634857177734, -0.24788422882556915, 7.193393707275391, 7.300694465637207, 7.415017604827881, 7.193040370941162, 7.313724040985107, 16.242849349975586, 16.268781661987305, 16.50730323791504, 16.281816482543945, 16.5628662109375, 16.15988540649414, -26.02884864807129, -26.016828536987305, -26.06463050842285, -26.076313018798828, -26.069124221801758, 2.287733793258667, 2.188706636428833, 2.2217302322387695, 2.292985677719116, 2.221309185028076, -9.614127159118652, -9.608946800231934, -9.591719627380371, -12.699295997619629, -12.694757461547852, -12.703083992004395, -12.698982238769531, 18.106502532958984, 18.47689437866211, 18.422508239746094, 18.744274139404297, 18.193050384521484, 18.747440338134766, 18.885299682617188, 18.014726638793945, 4.983603000640869, 5.4140520095825195, 4.820490837097168, 4.7830891609191895, 5.033219814300537, 5.321137428283691, 5.362527370452881, -0.41249576210975647, -0.41785669326782227, -0.4150391221046448, -4.1052680015563965, 4.70894718170166, 4.690982818603516, 4.7313337326049805, 4.698004722595215, 12.699437141418457, 12.699381828308105, 14.174883842468262, 14.159200668334961, 14.173906326293945, 14.138921737670898, 14.139976501464844, -21.975845336914062, 9.466828346252441, 9.22204303741455, 9.872834205627441, 9.203035354614258, 9.43144702911377, 9.731632232666016, 9.7525634765625, 4.5093464851379395, 4.509256362915039, 4.5092668533325195, 14.386061668395996, -9.425559997558594, -9.427104949951172, -9.418917655944824, -9.422863006591797, 4.063521862030029, 4.063606262207031, -6.47519063949585, -6.475346565246582, -1.155508279800415, 12.358561515808105, 12.074325561523438, 12.233854293823242, 12.406996726989746, 12.513025283813477, 12.085257530212402, -1.4133363962173462, -1.4077106714248657, -1.428531527519226, -1.3645904064178467, -1.4195390939712524, 7.425373077392578, 7.247035026550293, 7.933019638061523, 6.813719272613525, 7.766871452331543, 7.719539642333984, 6.9207282066345215, 7.35595703125, 7.049497127532959, 7.931153774261475, -0.8106504082679749, 11.70649528503418, 11.700149536132812, 11.69976806640625, 11.711755752563477, 8.148687362670898, 8.155036926269531, 8.14598560333252, 8.14989185333252, 13.27013111114502, 13.568933486938477, 13.886879920959473, 14.099528312683105, 14.082669258117676, 13.152230262756348, 13.500066757202148, 13.229683876037598, 13.83609390258789, -3.6567511558532715, -3.651035785675049, -3.655130624771118, -1.9168152809143066, -8.37717056274414, -8.377163887023926, -0.26680970191955566, -0.26984649896621704, -0.2692858874797821, -0.2666560113430023, 6.477514266967773, 6.476682186126709, 6.057377815246582, 6.0332159996032715, 6.0709075927734375, 6.022860527038574, 6.0798821449279785, -2.687235116958618, -2.6788489818573, -2.804076910018921, -2.8038747310638428, -2.8429200649261475, -6.270541667938232, -6.328247547149658, -6.356196880340576, -6.438570976257324, -6.243380069732666, -5.039488792419434, 3.726886034011841, -0.5097017288208008, -0.503799557685852, -0.4971468448638916, -0.49476006627082825 ] }, { "hovertemplate": "%{text}", "marker": { "color": "#00ff00", "line": { "color": "white", "width": 1 }, "opacity": 0.8, "size": 10 }, "mode": "markers", "name": "Candidates", "text": [ "Candidate 0", "Candidate 1", "Candidate 2", "Candidate 3", "Candidate 4", "Candidate 5", "Candidate 6", "Candidate 7", "Candidate 8", "Candidate 9", "Candidate 10", "Candidate 11", "Candidate 12", "Candidate 13", "Candidate 14", "Candidate 15", "Candidate 16", "Candidate 17", "Candidate 18", "Candidate 19", "Candidate 20", "Candidate 21", "Candidate 22", "Candidate 23", "Candidate 24", "Candidate 25", "Candidate 26", "Candidate 27", "Candidate 28", "Candidate 29", "Candidate 30", "Candidate 31", "Candidate 32", "Candidate 33", "Candidate 34", "Candidate 35", "Candidate 36", "Candidate 37", "Candidate 38", "Candidate 39", "Candidate 40", "Candidate 41", "Candidate 42", "Candidate 43", "Candidate 44", "Candidate 45", "Candidate 46", "Candidate 47", "Candidate 48", "Candidate 49", "Candidate 50", "Candidate 51", "Candidate 52", "Candidate 53", "Candidate 54", "Candidate 55", "Candidate 56", "Candidate 57", "Candidate 58", "Candidate 59", "Candidate 60", "Candidate 61", "Candidate 62", "Candidate 63", "Candidate 64", "Candidate 65", "Candidate 66", "Candidate 67", "Candidate 68", "Candidate 69", "Candidate 70", "Candidate 71", "Candidate 72", "Candidate 73", "Candidate 74", "Candidate 75", "Candidate 76", "Candidate 77", "Candidate 78", "Candidate 79", "Candidate 80", "Candidate 81", "Candidate 82", "Candidate 83", "Candidate 84", "Candidate 85", "Candidate 86", "Candidate 87", "Candidate 88", "Candidate 89", "Candidate 90", "Candidate 91", "Candidate 92", "Candidate 93", "Candidate 94", "Candidate 95", "Candidate 96", "Candidate 97", "Candidate 98", "Candidate 99", "Candidate 100", "Candidate 101", "Candidate 102", "Candidate 103", "Candidate 104", "Candidate 105", "Candidate 106", "Candidate 107", "Candidate 108", "Candidate 109", "Candidate 110", "Candidate 111", "Candidate 112", "Candidate 113", "Candidate 114", "Candidate 115", "Candidate 116", "Candidate 117", "Candidate 118", "Candidate 119", "Candidate 120", "Candidate 121", "Candidate 122", "Candidate 123", "Candidate 124", "Candidate 125", "Candidate 126", "Candidate 127", "Candidate 128", "Candidate 129", "Candidate 130", "Candidate 131", "Candidate 132", "Candidate 133", "Candidate 134", "Candidate 135", "Candidate 136", "Candidate 137", "Candidate 138", "Candidate 139", "Candidate 140", "Candidate 141", "Candidate 142", "Candidate 143", "Candidate 144", "Candidate 145", "Candidate 146", "Candidate 147", "Candidate 148", "Candidate 149", "Candidate 150", "Candidate 151", "Candidate 152", "Candidate 153", "Candidate 154", "Candidate 155", "Candidate 156", "Candidate 157", "Candidate 158", "Candidate 159", "Candidate 160", "Candidate 161", "Candidate 162", "Candidate 163", "Candidate 164", "Candidate 165", "Candidate 166", "Candidate 167", "Candidate 168", "Candidate 169", "Candidate 170", "Candidate 171", "Candidate 172", "Candidate 173", "Candidate 174", "Candidate 175", "Candidate 176", "Candidate 177", "Candidate 178", "Candidate 179", "Candidate 180", "Candidate 181", "Candidate 182", "Candidate 183", "Candidate 184", "Candidate 185", "Candidate 186", "Candidate 187", "Candidate 188", "Candidate 189", "Candidate 190", "Candidate 191", "Candidate 192", "Candidate 193", "Candidate 194", "Candidate 195", "Candidate 196", "Candidate 197", "Candidate 198", "Candidate 199" ], "type": "scatter", "x": [ 44.881019592285156, 49.14700698852539, 40.504051208496094, 39.40999221801758, 30.718713760375977, 36.64801025390625, 32.5521125793457, 35.28868103027344, 45.434329986572266, 50.60261917114258, 38.832096099853516, 38.85292053222656, 49.82123947143555, 45.39486312866211, 38.043521881103516, 53.40532302856445, 35.410377502441406, 40.982635498046875, 38.04661178588867, 40.288719177246094, 36.7198486328125, 35.380943298339844, 41.56990432739258, 41.96720504760742, 49.4117317199707, 46.56151580810547, 50.25037384033203, 39.630271911621094, 44.788490295410156, 39.73720169067383, 43.0688591003418, 48.22175598144531, 42.726810455322266, 32.287872314453125, 48.532318115234375, 42.786434173583984, 46.8601188659668, 47.60112762451172, 42.10430145263672, 38.424888610839844, 36.5667610168457, 45.7365837097168, 42.89715576171875, 41.307945251464844, 36.126243591308594, 42.42646408081055, 42.762428283691406, 46.56116485595703, 36.66171646118164, 44.41059875488281, 48.40363311767578, 35.23382568359375, 38.52609634399414, 30.991235733032227, 48.32511901855469, 40.19198226928711, 46.087432861328125, 32.41224670410156, 33.118003845214844, 41.96720504760742, 46.866153717041016, 43.615379333496094, 42.067264556884766, 43.938682556152344, 35.51115798950195, 31.895605087280273, 47.21119689941406, 36.30514144897461, 46.71591567993164, 38.418800354003906, 47.81039810180664, 39.87274932861328, 50.93589401245117, 45.50498962402344, 37.302059173583984, 35.707603454589844, 48.477787017822266, 34.53951644897461, 43.84562683105469, 46.50700759887695, 40.18986511230469, 47.02585983276367, 34.31013870239258, 43.59941482543945, 36.723697662353516, 40.61833953857422, 32.82719802856445, 48.3380241394043, 45.86796569824219, 47.860107421875, 43.23384475708008, 45.142860412597656, 43.444278717041016, 50.92949676513672, 51.021575927734375, 36.42940139770508, 40.14645767211914, 35.85551071166992, 37.21002197265625, 51.95323181152344, 41.888423919677734, 39.05851364135742, 40.32387161254883, 38.16963195800781, 34.29155349731445, 38.832096099853516, 49.742855072021484, 39.57854461669922, 39.18831253051758, 37.30287551879883, 36.51692581176758, 43.61349868774414, 32.299705505371094, 35.34605026245117, 39.11907958984375, 42.62443542480469, 43.019989013671875, 49.261837005615234, 49.80301284790039, 49.182090759277344, 48.82513427734375, 53.42035675048828, 31.051219940185547, 43.805137634277344, 32.94839096069336, 33.32707595825195, 50.51560974121094, 44.92549514770508, 31.399808883666992, 37.10387420654297, 31.303312301635742, 35.574554443359375, 45.25200653076172, 44.7913703918457, 36.51569366455078, 44.74193572998047, 33.983848571777344, 47.161354064941406, 41.23354721069336, 42.75897979736328, 45.23393249511719, 31.742740631103516, 37.52686309814453, 34.7752799987793, 49.5012321472168, 42.75912094116211, 40.134037017822266, 46.993289947509766, 38.534908294677734, 34.12739562988281, 39.96201705932617, 37.16326141357422, 35.922874450683594, 44.20255661010742, 38.034358978271484, 40.190757751464844, 46.43439483642578, 44.90678024291992, 38.95993423461914, 41.4968147277832, 39.49539566040039, 39.600765228271484, 50.402931213378906, 31.825075149536133, 40.950782775878906, 41.6561164855957, 44.39360427856445, 38.95592498779297, 39.648902893066406, 43.564231872558594, 39.15479278564453, 45.63834762573242, 39.29732131958008, 42.98911666870117, 45.66842269897461, 43.81102752685547, 36.32315444946289, 43.17835235595703, 43.51537322998047, 44.62496566772461, 45.06987380981445, 42.248477935791016, 36.618831634521484, 46.178916931152344, 40.18998336791992, 42.347103118896484, 37.82682800292969, 50.73632049560547, 44.37343215942383, 46.77196502685547, 36.842933654785156, 36.61891174316406, 33.37831497192383, 52.00126266479492, 42.71004867553711, 45.20596694946289, 46.221336364746094, 36.389747619628906, 38.178470611572266, 47.437992095947266 ], "y": [ 11.56125259399414, 5.178883075714111, 7.803081035614014, -8.386466979980469, 11.326899528503418, 4.924493312835693, 11.27585220336914, 1.3990848064422607, 5.04889440536499, 10.625184059143066, -6.188225746154785, 6.535639762878418, 5.468353271484375, 8.918660163879395, 14.8682279586792, 8.136441230773926, 3.0052449703216553, 8.377143859863281, 14.863316535949707, 5.89628267288208, -4.706168174743652, 5.8719964027404785, 7.138311386108398, -3.9246628284454346, 3.191899299621582, 15.077778816223145, -0.16757884621620178, 4.656816005706787, -4.7286858558654785, 6.360645294189453, 7.858059406280518, 13.68551254272461, -5.707596302032471, 10.52425765991211, 10.05073070526123, 6.302595615386963, 6.444956302642822, 1.4667487144470215, 12.962985038757324, -8.735273361206055, 0.9264240860939026, 7.236879825592041, 1.3928148746490479, 2.288439989089966, 0.5233746767044067, 12.454290390014648, 13.511958122253418, 15.062203407287598, -6.576770782470703, 6.1063337326049805, 13.71780776977539, -7.0803422927856445, 4.94042444229126, 10.60351848602295, 13.700973510742188, 3.508012056350708, 3.924899101257324, 10.571757316589355, -1.9894105195999146, -3.9246628284454346, 2.659722328186035, 6.0124077796936035, 10.980657577514648, 7.090834617614746, 6.204251289367676, 10.969051361083984, 10.080301284790039, -3.965700149536133, 3.142866611480713, -0.5675038695335388, 4.170748233795166, 5.317327499389648, 11.825203895568848, 6.806036472320557, 3.3164777755737305, 2.0374982357025146, 6.2389373779296875, -7.024060249328613, 3.615601062774658, 5.455191612243652, -5.098424434661865, 10.081814765930176, -1.0847008228302002, 12.26482105255127, -7.892942428588867, 2.8376333713531494, -2.8204996585845947, 13.214852333068848, 1.0116311311721802, 14.144298553466797, -9.191490173339844, 6.685647010803223, 12.103961944580078, 11.8748140335083, 11.8717041015625, 0.7219507098197937, -3.7953598499298096, 6.861129283905029, 0.10303826630115509, 12.594937324523926, 4.835472106933594, 3.400824785232544, 6.038657188415527, -3.814763307571411, -1.0687628984451294, -6.188225746154785, 3.5755062103271484, 10.395934104919434, -1.470668077468872, -6.938816070556641, -8.200026512145996, 8.462796211242676, 9.552630424499512, 3.1913468837738037, -8.605483055114746, -5.624361991882324, 7.926066875457764, 7.00724458694458, -0.2951894998550415, 8.183613777160645, 6.414566993713379, 8.098626136779785, 11.479122161865234, 3.5937209129333496, -1.258918285369873, 10.460214614868164, -0.019254282116889954, -0.5646641254425049, -0.632266640663147, -0.4123762249946594, -0.6286211013793945, -1.8933672904968262, 1.7209094762802124, -0.7729472517967224, -8.201231002807617, -4.736190319061279, -2.8047497272491455, 7.550336837768555, 0.9299692511558533, 5.232337951660156, 8.268961906433105, 10.453574180603027, -5.231142520904541, 4.517542839050293, 3.871443510055542, 12.147530555725098, -1.632186770439148, 1.211039423942566, 1.5974758863449097, -6.875067234039307, -2.4311416149139404, -0.9586828947067261, -4.992953300476074, 12.410727500915527, 14.86377239227295, 8.213384628295898, 4.357536792755127, 4.7480549812316895, 0.9730406999588013, 0.3461496829986572, -1.6516852378845215, -8.32040786743164, 5.219015598297119, 9.9949369430542, 1.9615178108215332, 3.5464396476745605, -5.21997594833374, 0.7549038529396057, 3.907456398010254, 10.411642074584961, 3.162490129470825, 5.652448654174805, 1.801606297492981, 12.70177936553955, 5.5790815353393555, 3.6215970516204834, 5.249258518218994, -9.200860977172852, -0.2554374039173126, 7.27818489074707, -4.12667179107666, -0.25698956847190857, 9.808212280273438, 7.17213249206543, -5.098593711853027, 6.148163795471191, 1.9480384588241577, 12.453739166259766, 11.086930274963379, 2.975510835647583, -5.858706474304199, 9.808074951171875, 3.2854363918304443, 12.44294261932373, 5.408707618713379, 1.8827999830245972, 8.006770133972168, -4.128926753997803, -3.8843834400177, 5.439088821411133 ] } ], "layout": { "annotations": [ { "bgcolor": "rgba(0,0,0,0.8)", "bordercolor": "#00ff00", "borderwidth": 2, "font": { "color": "#00ff00", "size": 14 }, "showarrow": false, "text": "πŸ’‘ Overlap = Postings successfully bridge the gap!", "x": 0.02, "xref": "paper", "y": 0.02, "yref": "paper" } ], "font": { "color": "white" }, "height": 800, "legend": { "x": 0.02, "y": 0.98 }, "paper_bgcolor": "#0d0d0d", "plot_bgcolor": "#1a1a1a", "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "fillpattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "title": { "text": "🎯 HRHUB Vector Space: Bridging Candidates ↔ Companies" }, "width": 1200, "xaxis": { "title": { "text": "TSNE Dimension 1" } }, "yaxis": { "title": { "text": "TSNE Dimension 2" } } } } }, "metadata": {}, "output_type": "display_data" } ], "source": [ "visualize_vector_space(n_candidates=200, n_companies=500)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "πŸ’Ύ Exporting matches for 100 candidates (top 10 each)...\n", "\n", " Processing candidate 1/100...\n", " Processing candidate 51/100...\n", "\n", "βœ… Exported 1,000 matches\n", "πŸ“„ Saved: ../results/hrhub_matches.csv\n", "\n" ] } ], "source": [ "# ============================================================================\n", "# πŸ’Ύ EXPORT MATCHES TO CSV\n", "# ============================================================================\n", "\n", "def export_matches_to_csv(num_candidates=100, top_k=10):\n", " \"\"\"\n", " Export match results to CSV - simple and clean\n", " \"\"\"\n", " print(f\"πŸ’Ύ Exporting matches for {num_candidates} candidates (top {top_k} each)...\\n\")\n", " \n", " results = []\n", " \n", " for i in range(min(num_candidates, len(candidates))):\n", " if i % 50 == 0:\n", " print(f\" Processing candidate {i+1}/{num_candidates}...\")\n", " \n", " # Get matches\n", " matches = find_top_matches(i, top_k=top_k)\n", " \n", " # Get candidate info\n", " cand = candidates.iloc[i]\n", " \n", " for rank, (comp_idx, score) in enumerate(matches, 1):\n", " # Skip invalid indices\n", " if comp_idx >= len(companies_full):\n", " continue\n", " \n", " company = companies_full.iloc[comp_idx]\n", " \n", " results.append({\n", " 'candidate_id': i,\n", " 'candidate_category': cand.get('Category', 'N/A'),\n", " 'candidate_skills': str(cand.get('skills', 'N/A'))[:100],\n", " 'company_id': company.get('company_id', 'N/A'),\n", " 'company_name': company.get('name', 'N/A'),\n", " 'company_industries': str(company.get('industries_list', 'N/A'))[:80],\n", " 'match_rank': rank,\n", " 'similarity_score': round(float(score), 4)\n", " })\n", " \n", " # Create DataFrame\n", " results_df = pd.DataFrame(results)\n", " \n", " # Save to results folder\n", " output_file = f'{Config.RESULTS_PATH}hrhub_matches.csv'\n", " results_df.to_csv(output_file, index=False)\n", " \n", " print(f\"\\nβœ… Exported {len(results_df):,} matches\")\n", " print(f\"πŸ“„ Saved: {output_file}\\n\")\n", " \n", " return results_df\n", "\n", "# Export matches\n", "matches_df = export_matches_to_csv(num_candidates=100, top_k=10)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "βœ… Safe matching function activated\n" ] } ], "source": [ "# Limita matching ao tamanho do companies_full\n", "def find_top_matches_safe(candidate_idx: int, top_k: int = 10) -> List[tuple]:\n", " \"\"\"\n", " Safe version that handles size mismatch\n", " \"\"\"\n", " if cand_vectors is None or comp_vectors is None:\n", " raise ValueError(\"Embeddings not loaded!\")\n", " \n", " cand_vec = cand_vectors[candidate_idx].reshape(1, -1)\n", " similarities = cosine_similarity(cand_vec, comp_vectors)[0]\n", " \n", " # βœ… FILTER: Only indices within companies_full range\n", " valid_indices = np.arange(min(len(companies_full), len(similarities)))\n", " valid_similarities = similarities[:len(companies_full)]\n", " \n", " top_indices = np.argsort(valid_similarities)[::-1][:top_k]\n", " \n", " return [(int(idx), float(valid_similarities[idx])) for idx in top_indices]\n", "\n", "# Replace function\n", "find_top_matches = find_top_matches_safe\n", "\n", "print(\"βœ… Safe matching function activated\")" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(9454, 0.5521203875541687),\n", " (6991, 0.5261219143867493),\n", " (6990, 0.5261219143867493),\n", " (23293, 0.5228525400161743),\n", " (9778, 0.5218214988708496)]" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "find_top_matches_safe(20, top_k=5)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "πŸ§ͺ Testing detailed match example...\n", "\n", "πŸ” DETAILED MATCH ANALYSIS\n", "====================================================================================================\n", "\n", "🎯 CANDIDATE #0\n", "──────────────────────────────────────────────────\n", "Resume ID: N/A\n", "Category: N/A\n", "Skills: ['Big Data', 'Hadoop', 'Hive', 'Python', 'Mapreduce', 'Spark', 'Java', 'Machine Learning', 'Cloud', 'Hdfs', 'YARN', 'Core Java', 'Data Science', 'C++'...\n", "Experience: ['Big Data Analyst']...\n", "\n", "πŸ”— TOP 3 COMPANY MATCHES\n", "──────────────────────────────────────────────────\n", "\n", "πŸ† MATCH #1 (Score: 0.7028)\n", "Company: TeachTown\n", "Company ID: 1052946\n", "Size: 2.0\n", "Location: Woburn, MA\n", "Industries: E-Learning Providers...\n", "Required Skills: ...\n", "Matching Skills: None detected (semantic match)\n", "Posted Jobs: ...\n", "\n", "πŸ’‘ LLM EXPLANATION:\n", "Summary: One sentence summary\n", "Strengths: Top 3-5 matching factors\n", "Gaps: Missing skills\n", "\n", "πŸ† MATCH #2 (Score: 0.7026)\n", "Company: Wolverine Power Systems\n", "Company ID: 1052686\n", "Size: 2.0\n", "Location: Zeeland, MI\n", "Industries: Renewable Energy Semiconductor Manufacturing...\n", "Required Skills: ...\n", "Matching Skills: None detected (semantic match)\n", "Posted Jobs: ...\n", "\n", "πŸ’‘ LLM EXPLANATION:\n", "Summary: Match score: 0.70\n", "Strengths: Unable to generate\n", "\n", "πŸ† MATCH #3 (Score: 0.7010)\n", "Company: Mariner\n", "Company ID: 1052664\n", "Size: 5.0\n", "Location: Overland Park, KS\n", "Industries: Financial Services...\n", "Required Skills: ...\n", "Matching Skills: None detected (semantic match)\n", "Posted Jobs: ...\n", "\n", "πŸ’‘ LLM EXPLANATION:\n", "Summary: Match score: 0.70\n", "Strengths: Unable to generate\n", "\n", "====================================================================================================\n", "πŸ’‘ KEY INSIGHTS:\n", " 1. Scores > 0.5 = Strong match\n", " 2. Scores 0.3-0.5 = Moderate match\n", " 3. Semantic matching works even without exact skill overlap\n", " 4. Job postings bridge the language gap between candidates & companies\n" ] } ], "source": [ "# ============================================================================\n", "# πŸ” DETAILED MATCH EXAMPLE (FIXED - Safe Version)\n", "# ============================================================================\n", "\n", "def show_detailed_match_example(candidate_idx=0, top_k=5):\n", " \"\"\"\n", " Show detailed match analysis for a candidate with safety checks\n", " \"\"\"\n", " print(\"πŸ” DETAILED MATCH ANALYSIS\")\n", " print(\"=\" * 100)\n", " \n", " # Safety check: candidate exists\n", " if candidate_idx >= len(candidates):\n", " print(f\"❌ ERROR: Candidate index {candidate_idx} out of range (max: {len(candidates)-1})\")\n", " return None\n", " \n", " # Get candidate info\n", " cand = candidates.iloc[candidate_idx]\n", " \n", " print(f\"\\n🎯 CANDIDATE #{candidate_idx}\")\n", " print(\"─\" * 50)\n", " print(f\"Resume ID: {cand.get('Resume_ID', 'N/A')}\")\n", " print(f\"Category: {cand.get('Category', 'N/A')}\") # βœ… CORRIGIDO\n", " print(f\"Skills: {str(cand.get('skills', 'N/A'))[:150]}...\")\n", " print(f\"Experience: {str(cand.get('positions', 'N/A'))[:150]}...\")\n", " \n", " # Get matches with safety check\n", " try:\n", " matches = find_top_matches(candidate_idx, top_k=top_k)\n", " except Exception as e:\n", " print(f\"\\n❌ ERROR getting matches: {e}\")\n", " print(\"\\nπŸ’‘ TIP: Run the embedding regeneration cell first!\")\n", " return None\n", " \n", " print(f\"\\nπŸ”— TOP {len(matches)} COMPANY MATCHES\")\n", " print(\"─\" * 50)\n", " \n", " for rank, (comp_idx, score) in enumerate(matches, 1):\n", " # βœ… SAFETY CHECK: Verify index is valid\n", " if comp_idx >= len(companies_full):\n", " print(f\"\\n⚠️ MATCH #{rank}: Index {comp_idx} out of range (skipping)\")\n", " print(f\" companies_full has only {len(companies_full):,} rows\")\n", " print(f\" comp_vectors has {comp_vectors.shape[0]:,} rows\")\n", " print(f\"\\n πŸ’‘ SOLUTION: Regenerate embeddings after deduplication!\")\n", " continue\n", " \n", " company = companies_full.iloc[comp_idx]\n", " \n", " print(f\"\\nπŸ† MATCH #{rank} (Score: {score:.4f})\")\n", " print(f\"Company: {company.get('name', 'N/A')}\")\n", " print(f\"Company ID: {company.get('company_id', 'N/A')}\")\n", " print(f\"Size: {company.get('company_size', 'N/A')}\")\n", " print(f\"Location: {company.get('city', 'N/A')}, {company.get('state', 'N/A')}\")\n", " print(f\"Industries: {str(company.get('industries_list', 'N/A'))[:80]}...\")\n", " \n", " # Skills matching analysis\n", " req_skills = str(company.get('required_skills', 'N/A'))\n", " cand_skills = str(cand.get('skills', ''))\n", " \n", " # Find overlapping skills (simple)\n", " common_skills = []\n", " if req_skills != 'N/A' and cand_skills:\n", " req_list = [s.strip().lower() for s in req_skills.split('|') if s.strip()]\n", " cand_list = [s.strip().lower() for s in cand_skills.split(',') if s.strip()]\n", " common_skills = set(req_list) & set(cand_list)\n", " \n", " print(f\"Required Skills: {req_skills[:100]}...\")\n", " print(f\"Matching Skills: {', '.join(list(common_skills)[:5]) if common_skills else 'None detected (semantic match)'}\")\n", " print(f\"Posted Jobs: {str(company.get('posted_job_titles', 'N/A'))[:80]}...\")\n", " \n", " # LLM Explanation if available (only for top 3)\n", " if LLM_AVAILABLE and rank <= 3:\n", " print(f\"\\nπŸ’‘ LLM EXPLANATION:\")\n", " try:\n", " explanation = explain_match(candidate_idx, comp_idx, score)\n", " print(f\"Summary: {explanation.get('fit_summary', 'No explanation')}\")\n", " if explanation.get('match_strengths'):\n", " print(f\"Strengths: {', '.join(explanation['match_strengths'][:3])}\")\n", " if explanation.get('skill_gaps'):\n", " print(f\"Gaps: {', '.join(explanation['skill_gaps'][:2])}\")\n", " except Exception as e:\n", " print(f\"(LLM explanation failed: {str(e)[:50]})\")\n", " \n", " print(\"\\n\" + \"=\" * 100)\n", " print(\"πŸ’‘ KEY INSIGHTS:\")\n", " print(\" 1. Scores > 0.5 = Strong match\")\n", " print(\" 2. Scores 0.3-0.5 = Moderate match\")\n", " print(\" 3. Semantic matching works even without exact skill overlap\")\n", " print(\" 4. Job postings bridge the language gap between candidates & companies\")\n", " \n", " return matches\n", "\n", "# Test with safety\n", "print(\"πŸ§ͺ Testing detailed match example...\\n\")\n", "try:\n", " show_detailed_match_example(candidate_idx=0, top_k=3)\n", "except Exception as e:\n", " print(f\"❌ ERROR: {e}\")\n", " print(\"\\nπŸ”§ DIAGNOSIS:\")\n", " print(f\" companies_full size: {len(companies_full):,}\")\n", " print(f\" comp_vectors size: {comp_vectors.shape[0]:,}\")\n", " print(f\" Mismatch: {abs(len(companies_full) - comp_vectors.shape[0]):,} rows\")\n", " print(\"\\nπŸ’‘ SOLUTION: Regenerate embeddings after cleaning duplicates!\")" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "πŸ§ͺ Testing bridging concept analysis...\n", "\n", "πŸŒ‰ THE BRIDGING CONCEPT: How Postings Connect Candidates ↔ Companies\n", "==========================================================================================\n", "\n", "πŸ“Š DATA REALITY CHECK:\n", " β€’ Total companies: 24,473\n", " β€’ Companies WITH postings: 0 (0.0%)\n", " β€’ Companies WITHOUT postings: 24,473 (100.0%)\n", " β€’ Total candidates: 9,544\n", " β€’ Total postings analyzed: 123,849\n", "\n", "🎯 THE PROBLEM:\n", " Companies say: 'We are in TECH INDUSTRY'\n", " Candidates say: 'I know PYTHON, AWS, REACT'\n", " β†’ Different languages! β†’ No match! 🚫\n", "\n", "πŸŒ‰ THE SOLUTION (BRIDGING):\n", " Step 1: Look at company POSTINGS\n", " Step 2: Extract: 'We need PYTHON developers'\n", " Step 3: Enrich company profile with: 'Needs: PYTHON, AWS'\n", " Step 4: Now companies speak SKILLS LANGUAGE! βœ…\n", "\n", "πŸ”¬ EMPIRICAL EVIDENCE:\n", " β€’ Average match score WITH postings: 0.0000\n", " β€’ Average match score WITHOUT postings: 0.3280\n", " β€’ Improvement: Cannot calculate (insufficient data)\n", "\n", "πŸ“ˆ VISUAL METAPHOR:\n", " Before bridging: 🏒---πŸ—£οΈ---πŸ‘€ (different languages)\n", " After bridging: 🏒===πŸ’¬===πŸ‘€ (same skills language)\n", "\n", "πŸŽ“ ACADEMIC SIGNIFICANCE:\n", " β€’ Novel use of postings as 'translation layer'\n", " β€’ Solves vocabulary mismatch problem in HR\n", " β€’ Enables mathematical matching (cosine similarity)\n", " β€’ Grounds LLM explanations in real requirements\n", "\n", "==========================================================================================\n", "βœ… BRIDGING CONCEPT VALIDATED!\n" ] }, { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "marker": { "color": [ "blue", "red", "green" ], "size": 40 }, "mode": "markers+text", "name": "Before", "showlegend": false, "text": [ "🏒", "πŸ—£οΈ", "πŸ‘€" ], "textfont": { "size": 30 }, "type": "scatter", "x": [ 1, 2, 3 ], "y": [ 2, 2, 2 ] }, { "marker": { "color": [ "blue", "yellow", "green" ], "size": 40 }, "mode": "markers+text", "name": "After", "showlegend": false, "text": [ "🏒", "πŸ’¬", "πŸ‘€" ], "textfont": { "size": 30 }, "type": "scatter", "x": [ 1, 2, 3 ], "y": [ 1, 1, 1 ] } ], "layout": { "annotations": [ { "showarrow": false, "text": "No connection", "x": 1.5, "y": 1.9 }, { "font": { "color": "green", "size": 14 }, "showarrow": false, "text": "Bridged via postings!", "x": 2, "y": 0.9 } ], "height": 400, "plot_bgcolor": "white", "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "fillpattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "title": { "text": "πŸŒ‰ The Bridging Concept Visualization" }, "width": 800, "xaxis": { "showgrid": false, "visible": false, "zeroline": false }, "yaxis": { "showgrid": false, "visible": false, "zeroline": false } } } }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "(Empty DataFrame\n", " Columns: [company_id, name, description, company_size, state, country, city, zip_code, address, url, industries_list, specialties_list, employee_count, follower_count, time_recorded, posted_job_titles, posted_descriptions, required_skills, experience_levels]\n", " Index: [],\n", " company_id name \\\n", " 0 1009 IBM \n", " 4 1016 GE HealthCare \n", " 14 1025 Hewlett Packard Enterprise \n", " 18 1028 Oracle \n", " 23 1033 Accenture \n", " ... ... ... \n", " 35782 103463217 JRC Services \n", " 35783 103466352 Centent Consulting LLC \n", " 35784 103467540 Kings and Queens Productions, LLC \n", " 35785 103468936 WebUnite \n", " 35786 103472979 BlackVe \n", " \n", " description company_size \\\n", " 0 At IBM, we do more than work. We create. We cr... 7.0 \n", " 4 Every day millions of people feel the impact o... 7.0 \n", " 14 Official LinkedIn of Hewlett Packard Enterpris... 7.0 \n", " 18 We’re a cloud technology company that provides... 7.0 \n", " 23 Accenture is a leading global professional ser... 7.0 \n", " ... ... ... \n", " 35782 2.0 \n", " 35783 Centent Consulting LLC is a reputable human re... \n", " 35784 We are a small but mighty collection of thinke... \n", " 35785 Our mission at WebUnite is to offer experience... \n", " 35786 1.0 \n", " \n", " state country city zip_code \\\n", " 0 NY US Armonk, New York 10504 \n", " 4 0 US Chicago 0 \n", " 14 Texas US Houston 77389 \n", " 18 Texas US Austin 78741 \n", " 23 0 IE Dublin 2 0 \n", " ... ... ... ... ... \n", " 35782 0 0 0 0 \n", " 35783 0 0 0 0 \n", " 35784 0 0 0 0 \n", " 35785 Pennsylvania US Southampton 18966 \n", " 35786 0 0 0 0 \n", " \n", " address \\\n", " 0 International Business Machines Corp. \n", " 4 - \n", " 14 1701 E Mossy Oaks Rd Spring \n", " 18 2300 Oracle Way \n", " 23 Grand Canal Harbour \n", " ... ... \n", " 35782 0 \n", " 35783 0 \n", " 35784 0 \n", " 35785 720 2nd Street Pike \n", " 35786 0 \n", " \n", " url \\\n", " 0 https://www.linkedin.com/company/ibm \n", " 4 https://www.linkedin.com/company/gehealthcare \n", " 14 https://www.linkedin.com/company/hewlett-packa... \n", " 18 https://www.linkedin.com/company/oracle \n", " 23 https://www.linkedin.com/company/accenture \n", " ... ... \n", " 35782 https://www.linkedin.com/company/jrcservices \n", " 35783 https://www.linkedin.com/company/centent-consu... \n", " 35784 https://www.linkedin.com/company/kings-and-que... \n", " 35785 https://www.linkedin.com/company/webunite \n", " 35786 https://www.linkedin.com/company/blackve \n", " \n", " industries_list \\\n", " 0 IT Services and IT Consulting \n", " 4 Hospitals and Health Care \n", " 14 IT Services and IT Consulting \n", " 18 IT Services and IT Consulting \n", " 23 Business Consulting and Services \n", " ... ... \n", " 35782 Facilities Services \n", " 35783 Business Consulting and Services \n", " 35784 Broadcast Media Production and Distribution \n", " 35785 Business Consulting and Services \n", " 35786 Defense and Space Manufacturing \n", " \n", " specialties_list employee_count \\\n", " 0 Cloud | Mobile | Cognitive | Security | Resear... 314102 \n", " 4 Healthcare | Biotechnology 56873 \n", " 14 79528 \n", " 18 enterprise | software | applications | databas... 192099 \n", " 23 Management Consulting | Systems Integration an... 574664 \n", " ... ... ... \n", " 35782 0 \n", " 35783 0 \n", " 35784 0 \n", " 35785 0 \n", " 35786 0 \n", " \n", " follower_count time_recorded posted_job_titles posted_descriptions \\\n", " 0 16253625 1712378162 \n", " 4 2185368 1712382540 \n", " 14 3586194 1712870106 \n", " 18 9465968 1712642952 \n", " 23 11864908 1712641699 \n", " ... ... ... ... ... \n", " 35782 21 1713552037 \n", " 35783 0 1713550651 \n", " 35784 12 1713554225 \n", " 35785 1 1713535939 \n", " 35786 0 1713539379 \n", " \n", " required_skills experience_levels \n", " 0 \n", " 4 \n", " 14 \n", " 18 \n", " 23 \n", " ... ... ... \n", " 35782 \n", " 35783 \n", " 35784 \n", " 35785 \n", " 35786 \n", " \n", " [24473 rows x 19 columns])" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# ============================================================================\n", "# πŸŒ‰ BRIDGING CONCEPT NARRATIVE (FIXED)\n", "# ============================================================================\n", "\n", "def show_bridging_concept_analysis():\n", " \"\"\"\n", " Visual and narrative explanation of the bridging concept\n", " \"\"\"\n", " print(\"πŸŒ‰ THE BRIDGING CONCEPT: How Postings Connect Candidates ↔ Companies\")\n", " print(\"=\" * 90)\n", " \n", " # Find companies with/without postings\n", " companies_with_postings = companies_full[companies_full['required_skills'] != '']\n", " companies_without_postings = companies_full[companies_full['required_skills'] == '']\n", " \n", " print(f\"\\nπŸ“Š DATA REALITY CHECK:\")\n", " print(f\" β€’ Total companies: {len(companies_full):,}\")\n", " print(f\" β€’ Companies WITH postings: {len(companies_with_postings):,} ({len(companies_with_postings)/len(companies_full)*100:.1f}%)\")\n", " print(f\" β€’ Companies WITHOUT postings: {len(companies_without_postings):,} ({len(companies_without_postings)/len(companies_full)*100:.1f}%)\")\n", " print(f\" β€’ Total candidates: {len(candidates):,}\")\n", " print(f\" β€’ Total postings analyzed: {len(postings):,}\")\n", " \n", " print(f\"\\n🎯 THE PROBLEM:\")\n", " print(\" Companies say: 'We are in TECH INDUSTRY'\")\n", " print(\" Candidates say: 'I know PYTHON, AWS, REACT'\")\n", " print(\" β†’ Different languages! β†’ No match! 🚫\")\n", " \n", " print(f\"\\nπŸŒ‰ THE SOLUTION (BRIDGING):\")\n", " print(\" Step 1: Look at company POSTINGS\")\n", " print(\" Step 2: Extract: 'We need PYTHON developers'\")\n", " print(\" Step 3: Enrich company profile with: 'Needs: PYTHON, AWS'\")\n", " print(\" Step 4: Now companies speak SKILLS LANGUAGE! βœ…\")\n", " \n", " print(f\"\\nπŸ”¬ EMPIRICAL EVIDENCE:\")\n", " \n", " # βœ… INITIALIZE VARIABLES\n", " avg_with = 0.0\n", " avg_without = 0.0\n", " \n", " # Calculate average match scores for companies with/without postings\n", " if cand_vectors is not None and comp_vectors is not None:\n", " try:\n", " # Sample test\n", " test_candidate = 0\n", " cand_vec = cand_vectors[test_candidate].reshape(1, -1)\n", " \n", " # βœ… Companies with postings (safe indexing)\n", " with_postings_idx = companies_with_postings.index.tolist()[:100]\n", " if with_postings_idx and max(with_postings_idx) < len(comp_vectors):\n", " # Filter valid indices\n", " valid_with_idx = [i for i in with_postings_idx if i < len(comp_vectors)]\n", " if valid_with_idx:\n", " with_vecs = comp_vectors[valid_with_idx]\n", " with_scores = cosine_similarity(cand_vec, with_vecs)[0]\n", " avg_with = with_scores.mean()\n", " \n", " # βœ… Companies without postings (safe indexing)\n", " without_postings_idx = companies_without_postings.index.tolist()[:100]\n", " if without_postings_idx and max(without_postings_idx) < len(comp_vectors):\n", " # Filter valid indices\n", " valid_without_idx = [i for i in without_postings_idx if i < len(comp_vectors)]\n", " if valid_without_idx:\n", " without_vecs = comp_vectors[valid_without_idx]\n", " without_scores = cosine_similarity(cand_vec, without_vecs)[0]\n", " avg_without = without_scores.mean()\n", " \n", " # βœ… PRINT RESULTS (variables now always defined)\n", " print(f\" β€’ Average match score WITH postings: {avg_with:.4f}\")\n", " print(f\" β€’ Average match score WITHOUT postings: {avg_without:.4f}\")\n", " \n", " if avg_with > 0 and avg_without > 0:\n", " improvement = ((avg_with - avg_without) / avg_without) * 100\n", " print(f\" β€’ Improvement: {improvement:.1f}% better!\")\n", " else:\n", " print(f\" β€’ Improvement: Cannot calculate (insufficient data)\")\n", " \n", " except Exception as e:\n", " print(f\" ⚠️ Could not calculate scores: {str(e)[:50]}\")\n", " print(f\" πŸ’‘ Tip: Regenerate embeddings if you cleaned duplicates\")\n", " else:\n", " print(\" ⚠️ Embeddings not loaded - skipping empirical analysis\")\n", " \n", " print(f\"\\nπŸ“ˆ VISUAL METAPHOR:\")\n", " print(\" Before bridging: 🏒---πŸ—£οΈ---πŸ‘€ (different languages)\")\n", " print(\" After bridging: 🏒===πŸ’¬===πŸ‘€ (same skills language)\")\n", " \n", " print(f\"\\nπŸŽ“ ACADEMIC SIGNIFICANCE:\")\n", " print(\" β€’ Novel use of postings as 'translation layer'\")\n", " print(\" β€’ Solves vocabulary mismatch problem in HR\")\n", " print(\" β€’ Enables mathematical matching (cosine similarity)\")\n", " print(\" β€’ Grounds LLM explanations in real requirements\")\n", " \n", " print(\"\\n\" + \"=\" * 90)\n", " print(\"βœ… BRIDGING CONCEPT VALIDATED!\")\n", " \n", " # Create simple visualization\n", " try:\n", " import plotly.graph_objects as go\n", " \n", " fig = go.Figure()\n", " \n", " # Before bridging\n", " fig.add_trace(go.Scatter(\n", " x=[1, 2, 3], y=[2, 2, 2],\n", " mode='markers+text',\n", " marker=dict(size=40, color=['blue', 'red', 'green']),\n", " text=['🏒', 'πŸ—£οΈ', 'πŸ‘€'],\n", " textfont=dict(size=30),\n", " showlegend=False,\n", " name='Before'\n", " ))\n", " fig.add_annotation(x=1.5, y=1.9, text=\"No connection\", showarrow=False)\n", " \n", " # After bridging\n", " fig.add_trace(go.Scatter(\n", " x=[1, 2, 3], y=[1, 1, 1],\n", " mode='markers+text',\n", " marker=dict(size=40, color=['blue', 'yellow', 'green']),\n", " text=['🏒', 'πŸ’¬', 'πŸ‘€'],\n", " textfont=dict(size=30),\n", " showlegend=False,\n", " name='After'\n", " ))\n", " fig.add_annotation(x=2, y=0.9, text=\"Bridged via postings!\", \n", " showarrow=False, font=dict(color=\"green\", size=14))\n", " \n", " fig.update_layout(\n", " title='πŸŒ‰ The Bridging Concept Visualization',\n", " xaxis=dict(showgrid=False, zeroline=False, visible=False),\n", " yaxis=dict(showgrid=False, zeroline=False, visible=False),\n", " width=800, height=400,\n", " plot_bgcolor='white'\n", " )\n", " \n", " fig.show()\n", " except Exception as e:\n", " print(f\"\\n⚠️ Visualization skipped: {str(e)[:50]}\")\n", " \n", " return companies_with_postings, companies_without_postings\n", "\n", "# Test the function\n", "print(\"πŸ§ͺ Testing bridging concept analysis...\\n\")\n", "show_bridging_concept_analysis()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "venv", "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.12.3" } }, "nbformat": 4, "nbformat_minor": 2 }