Giới thiệu dự án

Thị trường tuyển dụng ngành Công nghệ Thông tin (IT) chứng kiến tốc độ tăng trưởng vượt bậc với hàng trăm nghìn vị trí tuyển dụng mới mỗi năm. Tuy nhiên, theo các khảo sát ngành nhân sự quốc tế, trung bình một chuyên viên tuyển dụng (HR Recruiter) chỉ dành từ 6 đến 20 giây để quét qua một bản sơ yếu lý lịch (Curriculum Vitae - CV). Quá trình sàng lọc thủ công này vừa gây áp lực lớn cho nhà tuyển dụng, vừa khiến nhiều ứng viên tiềm năng bị loại bỏ oan uổng do các hạn chế về mặt thời gian hoặc do nhà tuyển dụng phi kỹ thuật không nắm rõ hệ thống thuật ngữ chuyên ngành IT phức tạp (ví dụ: không phân biệt được mối liên hệ giữa PyTorchDeep Learning, hoặc ReactFrontend Development). Về phía ứng viên, việc phải tự đọc hàng trăm bản mô tả công việc (Job Description - JD) không phù hợp để tìm việc làm gây lãng phí tài nguyên và thời gian đáng kể.

Đề tài khóa luận tốt nghiệp "Một phương pháp thiết kế Hệ thống tìm kiếm công việc phù hợp với lý lịch ứng viên trong lĩnh vực CNTT" (Automated Resume Screening System) được thực hiện bởi nhóm tác giả Lê Nguyễn Hoàng VũTrần Hữu Lộc dưới sự hướng dẫn của TS. Nguyễn Đình HiểnThS. Huỳnh Tuấn Anh tại Khoa Công nghệ Phần mềm, Trường Đại học Công nghệ Thông tin – ĐHQG-HCM. Đề tài tập trung giải quyết bài toán cốt lõi: Tự động hóa quá trình trích xuất thông tin, nhận diện kỹ năng ngữ nghĩa và đánh giá mức độ tương thích hai chiều giữa hồ sơ ứng viên (CV) và mô tả công việc (JD) dựa trên mô hình Ontology và Xử lý Ngôn ngữ Tự nhiên (Natural Language Processing - NLP).

+-----------------------------------------------------------------------------------+
|                           VẤN ĐỀ VÀ MỤC TIÊU CỐT LÕI                              |
+-----------------------------------------------------------------------------------+
|  Thực trạng:                                                                      |
|  - HR tốn 20s/CV -> Tỷ lệ bỏ sót kỹ năng chuyên sâu cao                           |
|  - Ứng viên mất nhiều giờ đọc các JD không phù hợp                                |
|  - Keyword Matching truyền thống thất bại trước từ đồng nghĩa/kỹ năng ẩn          |
+-----------------------------------------+-----------------------------------------+
                                          |
                                          v
+-----------------------------------------------------------------------------------+
|  Giải pháp đề xuất: Hệ thống Tự động sàng lọc & Khuyến nghị việc làm IT           |
|  - Tiền xử lý & OCR: OpenCV + Pytesseract chuyển đổi PDF/Word đa cột              |
|  - Khai phá ngữ nghĩa: Computer Science Ontology (CSO) + Word2Vec (Skip-Gram)     |
|  - Đo lường tương đồng: Graph Edit Distance (GED) + Phép so khớp Affinity Score   |
+-----------------------------------------------------------------------------------+

Mục tiêu cụ thể của dự án

  1. Thu thập và xây dựng tập ngữ liệu IT quy mô lớn: Thu thập tự động hơn 600.000 JD từ các cổng tuyển dụng quốc tế và trong nước (Indeed, Seek, CareerBuilder, Naukri, TopCV) cùng hơn 4.000 CV thực tế.
  2. Xây dựng bộ từ điển và mô hình Ontology IT: Chuẩn hóa hơn 30.000 thuật ngữ kỹ năng chuyên ngành CNTT dựa trên Computer Science Ontology (CSO), ESCO và StackShare.
  3. Phát triển pipeline trích xuất kỹ năng đa tầng: Kết hợp mô-đun cú pháp (Syntactic Module với khoảng cách Levenshtein) và mô-đun ngữ nghĩa (Semantic Module với Word2Vec) để nhận diện chính xác kỹ năng tường minh (explicit) lẫn ẩn định (implicit).
  4. Hiện thực thuật toán chấm điểm và xếp hạng tương đồng: Xây dựng đồ thị kỹ năng và tính toán điểm tương thích (Affinity Score) thông qua Graph Edit Distance (GED) và Maximum Matching.
  5. Triển khai ứng dụng Web hoàn chỉnh: Xây dựng nền tảng hướng dịch vụ (Service-Oriented Architecture) với giao diện người dùng trực quan trên ReactJS và backend API trên nền tảng Flask.

Phạm vi và giới hạn

  • Phạm vi nghiệp vụ: Hỗ trợ 11 nhóm vị trí chuyên sâu trong ngành phần mềm: Frontend, Backend, Fullstack, DevOps, Data Engineer, AI Engineer, Mobile (iOS, Android), Game Developer, Business Analyst, Project Manager.
  • Phạm vi kỹ thuật: Trích xuất dữ liệu từ các định dạng hồ sơ phổ biến (PDF, DOCX, ảnh scan) bằng Tiếng Anh và Tiếng Việt.
  • Giới hạn: Hệ thống tập trung vào đánh giá mức độ tương thích kỹ năng cứng (hard skills), kiến thức nền tảng và kinh nghiệm; các yếu tố văn hóa doanh nghiệp và tính cách được hỗ trợ qua các trường thông tin mềm mà không can thiệp sâu vào điểm số thuật toán cốt lõi.

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Tại thị trường Việt Nam và quốc tế, các giải pháp tuyển dụng trực tuyến đang tồn tại nhiều rào cản kỹ thuật:

Tiêu chí ITViec TopCV VietnamWorks Hệ thống đề xuất (Thesis Project)
Mô hình trích xuất CV Nhập form thủ công Template chuẩn hóa Parser từ khóa cơ bản OCR thông minh + CSO Classifier đa tầng
Khả năng hiểu ngữ nghĩa Không (Exact Keyword) Khá (Rule-based) Thấp (Regex Matching) Cao (Word2Vec + Domain Ontology)
Nhận diện kỹ năng ẩn Không hỗ trợ Không hỗ trợ Không hỗ trợ Hỗ trợ qua đồ thị tri thức kỹ năng
Xếp hạng độ tương thích Danh sách tuần tự Gợi ý điểm số cơ bản Bộ lọc thuộc tính cứng Affinity Score dựa trên GED & Cosine
Độ phủ dữ liệu ngành Chuyên IT Đa ngành Đa ngành Chuyên sâu 11 nhóm chuyên môn IT
Chi phí doanh nghiệp Cao Trung bình / Cao Rất cao Tối ưu mã nguồn mở, chi phí vận hành thấp

Bảng yêu cầu chức năng hệ thống theo chuẩn MoSCoW:

  • Must Have: Trích xuất văn bản từ tệp PDF/Word/Ảnh qua OCR; Phân loại phân đoạn CV theo BIO Tagging; Trích xuất kỹ năng bằng CSO Syntactic & Semantic; Chấm điểm Affinity Score; Gợi ý JD cho ứng viên và gợi ý CV cho nhà tuyển dụng.
  • Should Have: Biểu diễn đồ thị kỹ năng trực quan hóa (Skill Graph Visualization); Bộ lọc nâng cao theo vai trò và địa điểm; Đăng ký nhận thông báo email việc làm mới; Cảnh báo kỹ năng còn thiếu (Skill Gap Analysis).
  • Could Have: Khuyến nghị lộ trình học tập để bù đắp kỹ năng còn thiếu; Tích hợp công cụ chỉnh sửa trực tiếp nội dung CV sau trích xuất.
  • Won't Have (Giai đoạn này): Phỏng vấn tự động bằng Voice AI; Đánh giá video phỏng vấn biểu cảm khuôn mặt.

Thiết kế hệ thống

Kiến trúc hệ thống được thiết kế theo mô hình phân tầng phân tán (Distributed Multi-tier Architecture) nhằm tách biệt giữa giao diện tương tác, tầng logic xử lý nghiệp vụ AI/NLP và tầng lưu trữ dữ liệu.

+-----------------------------------------------------------------------------+
|                           CLIENT LAYER (ReactJS SPA)                        |
|  - Redux Saga State Management          - Candidate Portal & Resume Builder |
|  - Axios HTTP Client / JWT Interceptor  - Recruiter Dashboard & Filter Hub  |
+--------------------------------------+--------------------------------------+
                                       | HTTPS RESTful API (JSON)
                                       v
+-----------------------------------------------------------------------------+
|                           SERVER LAYER (Flask API)                          |
|  - Blueprint Routing / CORS          - Security & Token-based Auth (JWT)    |
|  - Business Logic Services           - Document Preprocessor Orchestrator   |
+-------------------+-------------------------------------+-------------------+
                    |                                     |
                    v                                     v
+------------------------------------+  +-------------------------------------+
|         AI / NLP ENGINE            |  |          DATA STORAGE LAYER         |
|  - OCR Engine (OpenCV + Tesseract) |  |  - MySQL 8.0 Relational Database    |
|  - Section Segmenter (BIO Tagging) |  |    (Candidates, Recruiters, Jobs,   |
|  - CSO Skill Classifier            |  |     Skills, Applications, History)  |
|  - Word2Vec Embedding Model        |  |  - Binary Store / File System       |
|  - Graph Edit Distance Matcher     |  |    (Raw CVs, Exported Visual Graphs)|
+------------------------------------+  +-------------------------------------+

Ngăn xếp công nghệ chi tiết (Technology Stack)

  • Frontend: ReactJS v17.0.2, Redux Saga v1.1.3, React Router v5.2.0, Axios v0.21.1, Ant Design / Bootstrap UI.
  • Backend: Python v3.8.10, Flask v2.0.1, Flask-CORS v3.0.10, PyJWT v2.1.0.
  • Thư viện AI/Data Processing: Gensim v4.0.1 (Word2Vec), PyTesseract v0.3.8, OpenCV-Python v4.5.2, NLTK v3.6.2, NetworkX v2.5.1 (xử lý đồ thị), BeautifulStoneSoup / Selenium v3.141.0, Puppeteer v10.0.0.
  • Hệ quản trị CSDL: MySQL v8.0.25 với cơ chế InnoDB Engine hỗ trợ Transaction toàn vẹn.

Thiết kế cơ sở dữ liệu quan hệ (Relational Database Schema)

Hệ thống quản lý dữ liệu thông qua 8 bảng quan hệ chuẩn hóa:

  1. tbl_candidate (candidate_id [PK], fullname, email, phone, avatar, created_at)
  2. tbl_recruiter (recruiter_id [PK], company_name, company_email, website, address, description)
  3. tbl_curriculum_vitae (cv_id [PK], candidate_id [FK], file_url, education_text, experience_text, raw_text, uploaded_at)
  4. tbl_job_posting (job_id [PK], recruiter_id [FK], title, domain_id [FK], salary_range, location, raw_jd_text, expired_at)
  5. tbl_domain (domain_id [PK], domain_name, description)
  6. tbl_skill (skill_id [PK], skill_name, domain_id [FK], is_cso_concept, synonyms_list)
  7. tbl_cv_skill_map (cv_id [FK], skill_id [FK], explicit_flag, frequency_score, PRIMARY KEY (cv_id, skill_id))
  8. tbl_matching_result (match_id [PK], cv_id [FK], job_id [FK], affinity_score, graph_distance, matched_at)

Thiết kế API RESTful chính

  • POST /api/v1/cv/upload: Nhận file đa phương tiện (multipart/form-data), trả về cv_id và danh sách kỹ năng trích xuất được dạng JSON.
  • POST /api/v1/cv/match-jobs: Nhận cv_id, danh sách domain_ids lọc; trả về danh sách các JD được xếp hạng theo affinity_score giảm dần.
  • POST /api/v1/recruiter/job-postings: Đăng tải mô tả công việc mới, kích hoạt pipeline trích xuất kỹ năng JD tự động.
  • GET /api/v1/recruiter/rank-candidates/<job_id>: Trả về danh sách ứng viên đã nộp hồ sơ, kèm điểm số tương thích và cây đồ thị kỹ năng đối chiếu.

Phương pháp luận (Methodology)

Dự án áp dụng mô hình phát triển Agile/Scrum kết hợp quy trình phát triển phần mềm lặp từng bước (Iterative Development Process) trong thời gian 16 tuần:

[Tuần 1 - 4]: Thu thập & Tiền xử lý Ngữ liệu (Puppeteer, Selenium, OCR)
[Tuần 5 - 8]: Xây dựng Mô hình Trích xuất (CSO Ontology + Word2Vec Training)
[Tuần 9 - 12]: Thuật toán Khớp nối Đồ thị (GED & Affinity Score Engine)
[Tuần 13 - 16]: Hiện thực Nền tảng Web (ReactJS + Flask) & Kiểm thử Đánh giá

Đánh giá và Giảm thiểu Rủi ro (Risk Assessment & Mitigation)

  • Rủi ro OCR Layout: CV có thiết kế đa cột hoặc bảng biểu làm vỡ thứ tự câu khi quét text. Giải pháp: Sử dụng OpenCV thực hiện phân đoạn hình ảnh (Contour Detection, Bounding Boxes) trước khi đưa từng khối chữ vào Pytesseract.
  • Rủi ro Overfitting / OOV (Out-Of-Vocabulary) trong NLP: Các công nghệ mới xuất hiện không có trong từ điển. Giải pháp: Huấn luyện mô hình Word2Vec trên tập dữ liệu 600K JD cập nhật mới nhất kết hợp phương pháp tính khoảng cách ký tự Levenshtein để bắt các biến thể gõ sai hoặc từ viết tắt.

Implementation và kết quả

Quy trình phát triển và Thuật toán cốt lõi

1. Pipeline trích xuất văn bản từ CV đa định dạng

CV dạng file ảnh hoặc PDF scan được xử lý qua pipeline chuẩn hóa: $$\text{Ảnh gốc} \xrightarrow{\text{Grayscale}} \text{OpenCV (Otsu Thresholding)} \xrightarrow{\text{Denoising}} \text{Pytesseract OCR} \xrightarrow{} \text{Văn bản thô (Raw Text)}$$

Sau đó, văn bản thô được gán nhãn chuỗi với định dạng BIO Tagging (Begin, Inside, Outside) kết hợp POS-Tagger để phân tách chính xác 4 khối nội dung chính: Thông tin cá nhân, Học vấn, Kinh nghiệm làm việc, Kỹ năng.

2. Kiến trúc CSO Classifier trích xuất kỹ năng

Hệ thống kết hợp 2 mô-đun:

  • Syntactic Module (Mô-đun cú pháp): Loại bỏ stopwords, tạo các cụm $n$-gram ($n \in {1, 2, 3}$). Với mỗi $n$-gram $s$, tính khoảng cách Levenshtein normalized $L(s, c)$ với các nhãn $c$ trong ontology: $$Sim_{Lev}(s, c) = 1 - \frac{\text{Levenshtein}(s, c)}{\max(|s|, |c|)}$$ Nếu $Sim_{Lev}(s, c) \ge \text{Threshold}_{\text{syn}}$ (mặc định $0.85$), khái niệm $c$ được công nhận là kỹ năng tường minh ($E_3 = 1.0$).
  • Semantic Module (Mô-đun ngữ nghĩa): Sử dụng mô hình Word2Vec (Skip-Gram, vector dimension $D = 128$, window size $= 5$, min count $= 3$) được huấn luyện trên 600.000 JD ngành CNTT. Các vector từ vựng được đối chiếu với Computer Science Ontology để mở rộng sang các kỹ năng liên quan gián tiếp ($E_3 = 0.5$).
                      +-----------------------------+
                      |   Input Text từ CV hoặc JD  |
                      +--------------+--------------+
                                     |
             +-----------------------+-----------------------+
             |                                               |
             v                                               v
+---------------------------+                 +---------------------------+
|      Syntactic Module     |                 |      Semantic Module      |
|  - Tokenize n-grams (1,2,3)|                |  - POS Tagging / Filtering|
|  - Loại bỏ Stopwords      |                 |  - Word2Vec Embeddings    |
|  - Khớp nhãn Levenshtein  |                 |  - CSO Concept Similarity |
+-------------+-------------+                 +-------------+-------------+
             |                                               |
             +-----------------------+-----------------------+
                                     |
                                     v
                      +-----------------------------+
                      |   Postprocessing & Filter   |
                      |   - Hợp nhất kỹ năng trùng  |
                      |   - Gán trọng số tường minh |
                      +--------------+--------------+
                                     |
                                     v
                      +-----------------------------+
                      |   Danh sách Kỹ năng chuẩn   |
                      +-----------------------------+

3. Thuật toán Ghép nối và Tính điểm Tương thích (Affinity Score Engine)

Để đo lường mức độ phù hợp giữa tập kỹ năng của ứng viên $S_{CV}$ và yêu cầu công việc $S_{JD}$, hệ thống xây dựng đồ thị hai phía $G = (S_{CV}, S_{JD}, E)$. Trọng số của mỗi cạnh liên kết giữa kỹ năng $u \in S_{CV}$ và $v \in S_{JD}$ được tính theo công thức:

$$Y(u, v) = \frac{w_1 \cdot E_1(u, v) + w_2 \cdot E_2(u) + w_3 \cdot E_3(u)}{w_1 + w_2 + w_3}$$

Trong đó:

  • $E_1(u, v) = \cos(\vec{V}_u, \vec{V}_v) = \frac{\vec{V}_u \cdot \vec{V}_v}{|\vec{V}_u| |\vec{V}_v|}$: Độ tương đồng Cosine giữa 2 vector Word2Vec của 2 kỹ năng.
  • $E_2(u) = \frac{\text{Freq}(u)}{\text{Total Words}}$: Điểm tần suất xuất hiện của kỹ năng trong tài liệu.
  • $E_3(u) \in {0.5, 1.0}$: Trọng số xác thực (1.0 nếu là kỹ năng tường minh trích xuất từ phần Skills, 0.5 nếu là kỹ năng gián tiếp).
  • Các hệ số thực nghiệm tối ưu: $w_1 = 0.5$, $w_2 = 0.2$, $w_3 = 0.3$.

Điểm tương thích tổng quát giữa CV và JD ($Affinity(CV, JD)$) là trung bình cộng trọng số các cạnh ghép nối tối đại (Maximum Weight Bipartite Matching), kết hợp chuẩn hóa qua Graph Edit Distance (GED):

$$GED(G_{CV}, G_{JD}) = \sum_{e_i \in \mathcal{P}(G_{CV} \to G_{JD})} c(e_i)$$

import numpy as np
from gensim.models import Word2Vec

class ResumeScreeningMatcher:
    def __init__(self, w2v_model_path: str, ontology_skills: set):
        self.w2v = Word2Vec.load(w2v_model_path)
        self.ontology_skills = ontology_skills
        self.w1, self.w2, self.w3 = 0.5, 0.2, 0.3

    def compute_edge_weight(self, skill_cv: str, skill_jd: str, 
                            freq_cv: float, is_explicit: bool) -> float:
        # E1: Cosine similarity via Word2Vec embeddings
        try:
            vec_cv = self.w2v.wv[skill_cv.lower()]
            vec_jd = self.w2v.wv[skill_jd.lower()]
            e1 = np.dot(vec_cv, vec_jd) / (np.linalg.norm(vec_cv) * np.linalg.norm(vec_jd))
            e1 = max(0.0, float(e1))
        except KeyError:
            e1 = 1.0 if skill_cv.lower() == skill_jd.lower() else 0.0
            
        # E2: Frequency Score
        e2 = min(1.0, freq_cv)
        
        # E3: Explicit / Implicit boosting
        e3 = 1.0 if is_explicit else 0.5
        
        # Weighted affinity calculation
        gamma = (self.w1 * e1 + self.w2 * e2 + self.w3 * e3) / (self.w1 + self.w2 + self.w3)
        return float(gamma)

    def calculate_cv_jd_affinity(self, cv_skills: dict, jd_skills: list) -> float:
        """
        Calculates normalized affinity score between extracted CV skills and JD skills.
        cv_skills format: { 'skill_name': {'freq': float, 'explicit': bool} }
        """
        if not cv_skills or not jd_skills:
            return 0.0
        
        total_score = 0.0
        for jd_skill in jd_skills:
            best_match_score = 0.0
            for cv_skill, meta in cv_skills.items():
                score = self.compute_edge_weight(
                    cv_skill, jd_skill, meta['freq'], meta['explicit']
                )
                if score > best_match_score:
                    best_match_score = score
            total_score += best_match_score
            
        normalized_score = total_score / len(jd_skills)
        return round(normalized_score * 100, 2)

Kiểm thử và Đánh giá hiệu năng

Quá trình thử nghiệm được tiến hành trên tập kiểm thử gồm 500 CV thực tế1.000 JD thuộc nhiều chuyên ngành khác nhau.

                  KẾT QUẢ ĐÁNH GIÁ ĐỘ CHÍNH XÁC (F1-SCORE)
               Keyword Matching       CSO Syntactic    Đề xuất kết hợp
                 Truyền thống            Đơn lẻ          (Full Model)

Bảng đối chiếu kết quả thực nghiệm trích xuất và so khớp:

Phương pháp Precision Recall F1-Score Thời gian xử lý trung bình / CV
Exact Keyword Matching (Regex) 88.2% 47.3% 61.5% 0.05s
TF-IDF + Cosine Distance 72.4% 68.1% 70.2% 0.12s
CSO Syntactic (Levenshtein) 86.5% 83.9% 85.2% 0.28s
Mô hình kết hợp (CSO + Word2Vec + GED) 91.8% 87.2% 89.4% 0.42s

Thực nghiệm xếp hạng hồ sơ Android Developer thực tế:

Khi đối chiếu một CV thực tế của ứng viên vị trí Android Developer (chứa các kỹ năng: Java, Kotlin, Android SDK, Retrofit, Room DB, Git, RxJava) với hai bản mô tả công việc khác nhau:

  • JD_171 (Vị trí Android Engineer): Chứa các kỹ năng yêu cầu (Kotlin, Android Studio, Clean Architecture, RESTful API, SQLite). $\to$ Điểm tương thích đạt 88.6% (Đồ thị kỹ năng tương đồng cao, khoảng cách GED nhỏ).
  • JD_202 (Vị trí Test Automation Engineer): Chứa các kỹ năng yêu cầu (Selenium, JUnit, Postman, CI/CD). $\to$ Điểm tương thích chỉ đạt 31.4% (Bị loại bỏ tự động khỏi danh sách ưu tiên).

Đổi mới và đóng góp

  1. Ứng dụng Computer Science Ontology giải quyết bài toán biểu diễn ngữ nghĩa: Thay vì xem các từ khóa kỹ thuật là các chuỗi văn bản cô lập (flat strings), hệ thống tổ chức tri thức dưới dạng cây phân cấp (Hierarchical Tree) và đồ thị quan hệ. Điều này cho phép hệ thống hiểu được quan hệ ngữ nghĩa (ví dụ: Flutter là tập con của Cross-platform Mobile Development; MySQL liên đới tới Relational Database).
  2. Cơ chế phân loại kép Syntactic-Semantic: Sự kết hợp giữa độ đo hình thức Levenshtein và không gian vector Word2Vec 128 chiều giúp giảm thiểu triệt để hiện tượng đánh lừa hệ thống bằng cách chèn từ khóa ẩn (keyword stuffing) thường gặp trong các hệ thống ATS cổ điển.
  3. Mô hình so khớp đa tiêu chí qua Graph Edit Distance: Đóng góp thuật toán tính toán mức độ biến đổi giữa đồ thị kỹ năng ứng viên và đồ thị kỹ năng công việc, giúp định lượng hóa chính xác khoảng cách năng lực chuyên môn (Competency Gap).
  4. Bộ ngữ liệu IT tiếng Việt - tiếng Anh chuẩn hóa: Tạo lập tập dữ liệu hơn 600.000 bản ghi tuyển dụng và hơn 30.000 từ khóa kỹ năng chuẩn hóa, đóng góp một tài nguyên tham khảo giá trị cho các nghiên cứu ứng dụng khai phá dữ liệu nhân sự tại Việt Nam.

Ứng dụng thực tế và triển khai

Kịch bản sử dụng thực tế (Use Case Scenarios)

  • Dành cho Ứng viên: Người tìm việc chỉ cần tải lên 1 bản CV duy nhất. Hệ thống tự động phân tích toàn bộ quá trình học tập, dự án và kỹ năng, từ đó gợi ý ngay lập tức danh sách các vị trí phù hợp nhất, giảm 85% thời gian tìm kiếm và đọc các bản tin tuyển dụng không tương thích.
  • Dành cho Nhà tuyển dụng: Khi một vị trí công việc được đăng tải, hệ thống tự động quét và xếp hạng toàn bộ ứng viên trong cơ sở dữ liệu theo thang điểm tương thích từ cao xuống thấp, cung cấp biểu đồ trực quan về kỹ năng đạt chuẩn và kỹ năng còn thiếu, hỗ trợ đưa ra quyết định mời phỏng vấn trong vòng vài giây.

Hướng dẫn và Yêu cầu triển khai hạ tầng (Deployment Guide)

Yêu cầu cấu hình máy chủ tối thiểu:

  • CPU: 4 Cores (Intel Xeon hoặc AMD EPYC xung nhịp $\ge 2.5\text{ GHz}$).
  • RAM: 8 GB (Khuyến nghị 16 GB để nạp toàn bộ không gian vector Word2Vec và cây Ontology vào bộ nhớ đệm RAM).
  • Lưu trữ: 50 GB SSD NVMe.
  • Hệ điều hành: Ubuntu Server 20.04 LTS / 22.04 LTS.

Quy trình cài đặt môi trường và vận hành dịch vụ:

# 1. Cài đặt các gói phụ thuộc hệ thống và Tesseract OCR Engine
sudo apt-get update && sudo apt-get install -y \
    tesseract-ocr \
    libtesseract-dev \
    tesseract-ocr-vie \
    libgl1-mesa-glx \
    python3-pip \
    mysql-server

# 2. Thiết lập môi trường Python ảo và cài đặt thư viện
git clone https://github.com/project/automated-resume-screening.git
cd automated-resume-screening
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

# 3. Khởi tạo Cơ sở dữ liệu và tải mô hình Word2Vec
mysql -u root -p < database/schema_init.sql
python scripts/download_pretrained_models.py

# 4. Chạy Backend API Server thông qua Gunicorn Production WSGI
gunicorn --workers 4 --bind 0.0.0.0:5000 app:app --daemon

# 5. Build và phục vụ Frontend ReactJS qua Nginx
cd frontend && npm install && npm run build
sudo cp -r build/* /var/www/html/
sudo systemctl restart nginx

Hạn chế và hướng phát triển

Hạn chế kỹ thuật hiện tại

  • Xử lý đồ họa phức tạp trong CV: Các mẫu CV có thiết kế đồ họa phi truyền thống (ảnh nền phức tạp, bảng biểu lồng ghép nhiều lớp) đôi khi khiến Tesseract OCR nhận diện sai thứ tự ngữ cảnh.
  • Đặc trưng ngôn ngữ học: Mô hình Word2Vec phụ thuộc vào tập từ vựng đóng, khả năng nắm bắt ngữ cảnh câu dài chưa tối ưu bằng các kiến trúc học sâu tiên tiến hơn.
  • Phạm vi kỹ năng mềm: Hệ thống chủ yếu lượng hóa kỹ năng kỹ thuật (hard skills), việc đánh giá kỹ năng mềm và sự phù hợp về tính cách mới chỉ dừng lại ở mức trích xuất từ khóa tường minh.

Hướng phát triển trong tương lai

  • Ứng dụng Transformer & Mô hình ngôn ngữ lớn (LLM): Tích hợp các kiến trúc như RoBERTa, PhoBERT hoặc fine-tune các mô hình Llama-3/Gemini để hiểu sâu sắc ngữ cảnh mô tả kinh nghiệm và thành tích định lượng trong CV.
  • Cơ chế Dynamic Ontology: Xây dựng thuật toán tự động cập nhật ontology từ các bài viết công nghệ mới (GitHub trending, StackOverflow) mà không cần can thiệp thủ công.
  • Mở rộng hỗ trợ đa ngôn ngữ: Hoàn thiện bộ parser cho tiếng Nhật, tiếng Hàn và tiếng Pháp nhằm phục vụ các doanh nghiệp IT đa quốc gia.

Đối tượng hưởng lợi

+-----------------------------------------------------------------------------------+
|                            ĐỐI TƯỢNG HƯỞNG LỢI DỰ ÁN                              |
+-----------------------------------+-----------------------------------------------+
|  👨‍🎓 SINH VIÊN & ỨNG VIÊN         |  💼 DOANH NGHIỆP & HR RECRUITER               |
|  - Giảm 85% thời gian tìm JD      |  - Tự động hóa 90% khâu lọc CV ban đầu        |
|  - Thấy rõ Skill Gap & lộ trình   |  - Đánh giá khách quan, giảm bias tuyển dụng  |
+-----------------------------------+-----------------------------------------------+
|  👨‍💻 LẬP TRÌNH VIÊN                |  🔬 NHÀ NGHIÊN CỨU NLP / EDUTECH              |
|  - Tham khảo mô hình phân tán     |  - Tái sử dụng bộ từ điển 30K IT Skills       |
|  - Mẫu tích hợp ReactJS + Flask   |  - Nền tảng kết hợp Ontology và Machine Learn |
+-----------------------------------+-----------------------------------------------+
  1. Sinh viên và Ứng viên ngành IT:
    • Tiết kiệm hơn 85% thời gian tìm kiếm việc làm; định hướng học tập thông qua việc nhận biết chính xác các kỹ năng thị trường đang yêu cầu đối với từng vị trí chuyên môn.
  2. Nhà tuyển dụng và Doanh nghiệp công nghệ:
    • Tối ưu hóa quy trình sàng lọc hồ sơ, giảm thời gian xử lý từ 20 giây/CV xuống còn dưới 0.5 giây/CV; loại bỏ hoàn toàn các thiên kiến chủ quan (bias) trong khâu sơ tuyển bước đầu.
  3. Kỹ sư phần mềm và Nhà phát triển:
    • Cung cấp mã nguồn tham khảo mẫu về cách tích hợp hệ thống đa dịch vụ giữa ReactJS, Flask, OpenCV và Gensim.
  4. Cộng đồng nghiên cứu Khoa học Dữ liệu:
    • Đóng góp phương pháp luận kết hợp tri thức biểu diễn (Ontology) với học máy thống kê (Word Embedding), mở ra hướng nghiên cứu ứng dụng cho các bài toán phân tích nhân sự tương tự.

Câu hỏi thường gặp

1. Yêu cầu kỹ thuật tối thiểu để triển khai toàn bộ hệ thống là gì?

Hệ thống yêu cầu máy chủ chạy hệ điều hành Linux (khuyến nghị Ubuntu 20.04+), tối thiểu 4 Cores CPU, 8 GB RAM (để nạp mô hình nhúng Word2Vec và cấu trúc cây Ontology), 50 GB ổ cứng SSD, cài đặt sẵn Python 3.8+, MySQL 8.0, NodeJS 14+ và Tesseract OCR Engine cùng gói ngôn ngữ tiếng Việt/tiếng Anh.

2. Hệ thống xử lý thế nào khi lượng dữ liệu CV và JD tăng lên hàng triệu bản ghi?

Hệ thống được thiết kế theo kiến trúc phi trạng thái (Stateless Services). Tầng tính toán NLP có thể mở rộng theo chiều ngang (Horizontal Scaling) bằng cách đặt các worker Flask phía sau bộ cân bằng tải Nginx Load Balancer. Tầng vector nhúng có thể tích hợp thêm các công cụ tìm kiếm vector chuyên dụng như Milvus hoặc FAISS để giảm độ phức tạp tìm kiếm từ $O(N)$ xuống $O(\log N)$.

3. Hệ thống có khả năng tích hợp vào các nền tảng tuyển dụng (ATS/HRM) sẵn có không?

Có. Hệ thống cung cấp đầy đủ giao diện lập trình ứng dụng RESTful API chuẩn hóa dưới dạng JSON payload. Bất kỳ hệ thống quản lý tuyển dụng nào của doanh nghiệp cũng có thể gửi dữ liệu CV/JD thông qua HTTP POST request và nhận lại kết quả phân tích điểm tương thích cùng danh sách kỹ năng chuẩn trong thời gian thực.

4. Chi phí vận hành và bảo trì mô hình NLP định kỳ như thế nào?

Chi phí vận hành rất thấp do hệ thống sử dụng hoàn toàn các công nghệ và thư viện mã nguồn mở (OpenCV, Pytesseract, Gensim, Flask, MySQL, ReactJS), không phụ thuộc vào các API tính phí của bên thứ ba. Việc bảo trì định kỳ bao gồm việc chạy script cập nhật từ khóa ontology và tái huấn luyện mô hình Word2Vec (khoảng 3-6 tháng một lần) trên tập dữ liệu JD mới thu thập.

5. Khả năng bảo mật và quyền riêng tư thông tin cá nhân của ứng viên được xử lý ra sao?

Toàn bộ dữ liệu hồ sơ cá nhân (số điện thoại, email, địa chỉ) được mã hóa trong cơ sở dữ liệu. Hệ thống hỗ trợ cơ chế ẩn danh hóa (Anonymization): khi tiến hành so khớp kỹ thuật, tầng AI chỉ xử lý các thuộc tính liên quan đến học vấn, kinh nghiệm và kỹ năng, giúp ngăn chặn nguy cơ rò rỉ dữ liệu cá nhân nhạy cảm trong quá trình chấm điểm sơ tuyển.


Kết luận

Đề tài "Một phương pháp thiết kế Hệ thống tìm kiếm công việc phù hợp với lý lịch ứng viên trong lĩnh vực CNTT" của nhóm sinh viên Lê Nguyễn Hoàng Vũ và Trần Hữu Lộc đã giải quyết thành công bài toán tự động hóa quy trình tuyển dụng nhân sự IT thông qua việc kết hợp sáng tạo giữa Xử lý ảnh (OCR), Khoa học Bản thể học (Computer Science Ontology)Học máy thống kê (Word2Vec, Graph Edit Distance).

Với độ chính xác trích xuất và so khớp đạt F1-Score 89.4%, cùng khả năng xử lý nhanh chóng dưới 0.5 giây/CV, hệ thống không chỉ giải quyết triệt để bài toán quá tải sàng lọc hồ sơ của doanh nghiệp mà còn mở ra hướng tiếp cận mới hỗ trợ ứng viên tiếp cận cơ hội nghề nghiệp tối ưu. Đây là một công trình nghiên cứu ứng dụng có hàm lượng kỹ thuật cao, đáp ứng toàn diện cả về mặt lý thuyết học thuật lẫn giá trị thực tiễn triển khai trong kỷ nguyên chuyển đổi số ngành nhân sự công nghệ.