CHUONG 3: PHAN TÍCH VÀ THIET KE
2. Nhà tuyển dụng điền form tạo hồ sơ
4. Nhập giới thiệu về công ty
6. Nhà tuyển dụng chọn nút "Hoàn tat" để hoàn tất hồ sơ
3.3.18. Tìm kiếm công việc
Hình 40 - Usecase diagram tìm kiếm công việc dành cho nhà tuyển dụng
Nha tuyén dung
19.Tìm kiếm công
việc
Use Case ID IUC18
Use Case Name Tim kiêm công việc đã đăng Actor Nhà tuyên dụng
Trigger Nhà tuyên dụng chon tim công việc đã đăng
Pre-condition Nhà tuyên dụng đã đăng công việc trước đó
Post-condition Hiền thi công việc cân tim
Step 1. Nhà tuyên dụng chọn mục danh sách công việc 2. Nhà tuyển dụng nhập tên công việc
3. Nhà tuyến dụng chon trạng thái công việc 4. Nhà tuyển dụng chọn nút “Tìm kiếm”
5. Hiên thị công việc cân tìm kiêm
3.3.19. Quản lý nhà tuyển dụng
eo)
1. Quản ly nha tuye dung
Quan tri vién
Hình 41 - Usecase diagram quản lý nhà tuyển dung
Use Case ID IUC19
Use Case Name |Quản lý nhà tuyển dụng Actor Admin
Trigger Admin chon “Quan lý nhà tuyên dụng”
Pre-condition Da dang nhap tai khoan admin
Post-condition Nguoi dùng ứng tuyên vào các công việc mong muôn Step 1. Nhà tuyển dụng chọn “Quan lý nhà tuyển dụng”
2. Hiển thị danh sách các tài khoản nhà tuyên dụng
3. Admin thao tác thêm sửa xóa tài khoản nhà tuyên dụng
3.3.20. Quản lý nhà ứng viên
22. Quản lý ứng viên
Quản trị viên
Hình 42 - Usecase quản lý ứng viên IUse Case ID IUC20
Use Case Name Quan lý ứng viên
43
Actor Admin
‘Trigger Admin chon “Quan lý ứng viên”
Pre-condition |Da đăng nhập tai khoản admin
Post-condition |Người dùng ứng tuyên vào các công việc mong muôn
Step 1. Nhà tuyên dụng chon “Quản lý nhà tuyên dụng”
2. Hiển thị danh sách các tài khoản nhà tuyên dung
3. Admin thao tác thêm sửa xóa tài khoản nhà tuyên dung
3.4. Kiến trúc hệ thống 3.4.1. Kiến trúc sử dụng
Hệ thống sử dụng mô hình 3 lớp (3-layer) đề phát triển ứng dụng web nhằm phân chia các thành phần trong hệ thống, các thành phần cùng chức năng sẽ được nhóm lại với nhau và phân chia công việc cho từng nhóm để dữ liệu không bị chồng chéo và
chạy lộn x6n trong đó:
Tang giao diện (Front-end) sử dụng công nghệ ReactJS dùng dé xử lý việc hiển thi
dữ liệu và tương tác với người dùng thông qua trình duyệt web.
Tang logic ứng dung (Back-end) sử dung framework mã nguồn mở về sàn thương mại điện tử là Shop1zer dé có thé tuy chinh muc dich su dung cho san viéc lam. St
dụng công nghệ chính là Java (Spring Boot)
Tang dữ liệu (Database): sử dung cơ sở dữ liệu MySQL
Tang logic ứng dụng kết nói với tầng dữ liệu thông qua JDBC cụ thé là Hibernate
framework
Giữa tang giao diện va tầng logic giao tiếp với nhau thông qua RESTful API
Các giao tiếp giữa người dùng với hệ thống sẽ được bao mật qua giao thức http/https
Người dùng cuối (Client) Tầng giao diện (Presentation tier) Tầng ứng dụng (Application tier) Tầng dữ liệu (Data tier)
” lo
‡
RESTful API
Htfp/https = F:
4 Front-end : Back-end
a
! Web services api Recommend system : (Shopizer) (Lenskit)
Client Browser Database
Hình 43 - Sơ đô kiến trúc hệ thong
3.4.2. Mở rộng
Người dùng cuối (Client) | Tang giao diện (Presentation tier) | Tầng ứng dung (Application tier) | Tầng dữ liệu (Data tier)
— | E:
Web services api
(Shopizer) System Database RESTful API
_ Internet Server database 1†
de) 27
Gv
Http/httpski đọ Server database 2
Client Browser
Hình 44 - Mô hình kiến trúc mở rộng
Trong mô hình mở rộng hệ thống, hệ thống vẫn sử dụng mô hình 3 lớp (3-layer) nhưng có sự thay đôi về triển khai. Các thành phan trong hệ thong được đặt ở các trên
các server độc lập với nhau.
Trong kiến trúc cũ, tất cả các thành phần được đặt trên cùng một server. Khi server nãy gặp trục trặc về kỹ thuật thì toàn bộ hệ thống sẽ ngừng hoạt động. Khi tách các thành phần và đặc chúng trên các vị trị khác nhau sẽ tránh tính trạng trên cũng như xác định vị trí lỗi dễ dàng hơn.
Hệ thống đề xuất trong kiến trúc cũ sử dụng chung database, nhưng khi lượng người dùng lớn lên đồng nghĩa việc dữ liệu phục vụ cho đề xuất cũng lớn lên. Vì thế việc tách riêng ra một database dành riêng cho hệ thống đề xuất là cần thiết. Từ đó có thê
áp dụng các database phục vụ cho phân tích dữ liệu.
45
3.5. Áp dụng Shopizer
Shopizer được xây dựng theo mô hình bán lẻ, có một hệ thống quản lý cao nhất và bên dưới là các cửa hàng. Từng cửa hang sé có những danh mục và các sản phẩm khác nhau. Các khách hàng đề thực hiện được các giao dịch, khách hàng phải đăng ký tài khoản tại các cửa hàng. Vì vậy khách hàng sẽ phụ thuộc các cửa hàng nhất định.
3.5.1. Những vấn đề khi áp dụng Shopizer
“Framework vẫn còn nhiều lỗi: chang hạn như trong quá trình nhóm tìm hiểu về framework thì gặp lỗi liên quan đến API product,...
“Kho khăn khi custom framework: vì đây là framework được xây dựng cho mô hình
thương mại điện tử nghành bán lẻ nên nó sẽ gây khó khăn trong việc custom đề chuyên sang mô hình hệ thống tuyên dụng việc làm.
s*Xung đột dependency giữa thư viện Lenskit và Shopizer framework: khi nhóm thực
hiện chức năng đề xuất công việc và ứng viên bằng cách thêm module recommender vào trong source code, module này cùng cấp với các module có sẵn của Shopizer. Khi thêm vào thì nhóm đã gặp lỗi thư viện Guava vì xung đột phiên bản của thư viện này.
3.5.2. Xử lý những vấn đề khi áp dụng
sằXử lý khi framework gặp lỗi: thường xuyờn theo dừi cập nhật xử lý lỗi từ cộng đồng Shopizer. Trong quá trình thực hiện đề tai, thì nhóm có gặp van dé lỗi với API Product, rat may lỗi đó vài ngày sau khi nhóm chúng em gặp lỗi thì nó đã được fix.
Shopizer java e-commerce software
eC
circleci
wrapper
odel
sm-core-modules
1...
sm-shop-model
sm-shop
gitignore
Jenkinsfile
LICENSE md
Releases 18 README.md
v3.2.5 RELEASE-NOTES.md
jenkins file
Hình 45 - Hình ảnh bản cập nhật fix lỗi của Shopizer
s*Xử lý việc thực hiện custom framework:
— Trong Shopizer gồm các thực thé khách hàng, quản lý cửa hàng, sản phẩm va quan lý hệ thống. Còn trong bài toán xây dựng hệt thống hỗ trợ việc làm thì gồm các thực thé sinh viên (ứng viên), nhà tuyển dụng, công việc và quan lý hệ thống. Ở đây chúng ta có thể thấy được khá tương đồng giữa hai mô hình đó là khách hàng tương ứng với sinh viên, quản lý cửa hàng tương ứng với nhà tuyển dụng, sản phẩm tương ứng với công việc còn quản lý hệ thống tương tự nhau. Từ đó chúng ta sẽ xác định các class và những tài nguyên liên quan khác của framework có thể áp dụng từ Shopizer.
— Bởi vì Shopizer được chia cau trúc source code theo kiều multi module nên giảm
bớt khó khăn chi custom. Shopizer được chia thành 5 module chính là sm-core nơi
chứa source code liên quan đến Repository và Service, sm-core-model nơi chứa source code liên quan đến các entity trong hệ thống, sm-core-module nơi chứa các module liên quan đến như thanh toán, vận chuyên.. .., sm-core-model nơi chứa source code liên quan đến các entity của ứng dụng ,sm-shop nơi chưa source code liên quan đến API, Mapper, Facade,... và cuối cùng là sm-shop-model nơi chứa source code liên quan đến các DTO. Trong luận văn này ta chủ yếu tập trung vào 4 module chính
đó là sm-core, sm-core-model, sm-shop và sm-shop-model.
— Ta sẽ thực hiện custom theo trình từ Repository layer để đi lên các layer cao hơn:
+ Đầu tiên là cần xác định các entity cần sử dụng và cập nhật lại phù hợp với yêu cầu của hệ thông. Đầu tiên là với entity Product, đây sẽ là entity phục vụ cho thể hiện công việc trong hệ thống, entiy MerchantStore phục vụ cho nhà tuyển dụng, và Entity phục vụ cho nhà quản lý hệ thống. Trong đó entity Produet sẽ là entity cập nhật nhiều nhất.
Trong các entity này sẽ có các relationship với nhau, chúng ta cũng cần xác định những entity nào sẽ cần sử dụng, những entity nào không sử dụng thì chúng ta tạm thời bỏ qua. Tiếp theo ta thêm vào những field và entity khác dé phù hợp với yêu cầu hệ thông.
47
= Product (Job)
- id: Long
- auditSection: AuditSection
- descriptions: Set<ProductDescription>
- availabilities: Set<ProductAvailability>
- merchantStore: MerchantStore
- skillDescriptions: Set<SkillDescription>*
- locationDescriptions: Set<LocationDescription> ô - idPayCycle: String *
- positionDescriptions: Set<PositionDescription> ô - categories: Set<Category>
- dateAvailable: Date - dateExperience: Date - available: boolean - Status: JobStatus
- experience: ExperienceDescription ô - gender: String
- recruitments: List<Recruitment> ô - jobRates: List<JobRate> x
* Những attribute hoặc entity được thêm vào để phù hợp với bài toán hệ thống
Hình 46 - Cập nhật entity Product và các relationship mapping liên quan
+ Tiếp theo là thêm các repository khác, cũng như cập nhật lại các method query cho
phù hợp. Tương tự service ta cũng cập nhật và thêm các service khác. Các source code này thực hiện bên trong module sm-core.
Hình 47 - Cac repository được thêm vào và các method query được thêm vào
icrosoft Windows [Version 10.0.19045.3324]
(c) Microsoft Corporation. All rights reserved.
0: \HKIT-Nam4\KLTN\BE_KLTN>
Hình 48 - Cac service được thêm vào
+ Tiếp theo cập nhật các class và interface của cho API, Mapper, Facade trong module
sm-shop. Bên cạnh đó cập nhật những field và thêm các DTO mới vao ứng dụng ở module sm-shop-model.
% Project Explorer
D: \HKIT-Nam4\KLTN\BE_KLTN>
Hình 49 - Các API được thêm vào và các method được bồ Sung
49
icrosoft Windows [Version 10.0.19045.3324) (c) Microsoft Corporation. All rights reserved.
D:\HKI1-Nam4\KLTN\BE_KLTN>
Hình 50 - Cac mapper được thêm vào
2-2-2 ˆÔ...L...:i.:. ii...
D: \HR beams \KLTN\BE_KLTN>
Hình 51 - Cập nhật DTO và thêm các DTO mới
“Xung đột dependency giữa thư viện Lenskit và Shopizer framework
Khi kết hợp giữa thư viện LensKit và Shopizer đã xảy ra việc xung đột version dependency lẫn nhau, trong số đó có Guava. Dé fix lỗi nay thay thé bằng version 27.1-jre dé phù hợp với Shopizer.
= CAWINDOWS\syste xe #CAWINDOWSAyst
icrosoft Windows [Version 10.@.19045.3324]
(c) Microsoft Corporation. All rights reserved.
10: \HKTT-Nam4\KLTN\BE_KLTN>
Hình 52 - Replace version dependencies Guava
3.6. Xây dựng chức năng đề xuất công việc
Đầu tiên, ta cần thêm một module khác vào bên trong source code Shopier trước đó. Module được thêm vào cùng cấp vào các module sm-shop, sm-core, sm-core-
model, sm-core-module và sm-shop-model.
project
modelVersion>4.@.0</modelVersion parent
groupId>com.shopizer</ groupId artifactId>shopizer</artifactId version>3.2.5</version
parent
artifactId>recommender</artifactId packaging>jar</ packaging
dependencies
groupId>mysql</ sroupTd
artifactId>mysql-connector-java</artifactIid version2s.0.21</version
dependency dependency
groupid>org.grouplens. Lenskit</ sroupTd artifactId>lenskit-all</artifactId version>3.0-T1</version
Hình 53 - Thêm module recommender vào trong source code
51
B pomxml Rpom.xml x
https: //wwi.apache.org/Licenses/LTICENSE-2.0.txt
org.springframework. boot spring-boot-starter-parent 2529-12
sm-core-model sm-core-modules
Sm-core
sm-shop-modeL sm-shop recommender
UTF-8
Hình 54 - Cau hình sau khi thêm module recommender vào source code 6 file pom
parent cua shopizer
A
4
Hồ sơ người dùng
Kỹ năng 1
Công việc n : Công việc 1
< Quận 1 ơ= Quận n >
Kỹ năng n
Hình 55 - Vector space model cho dé xuất công việc
VSM sử dụng cho đề xuất công việc bao gồm các chiều là các đặc trưng của công việc bao gồm các kỹ năng và khu vực làm việc. Các vector của công việc va hồ sơ người dung là những vector nằm trong VSM này.
s*Hiện thực tính toán TF-IDF cho các công việc va hồ sơ người dùng:
Giả sử có công việc 1 với các kỹ năng gồm Java, MySQL, Web, Spring Boot, Hibernate và khu vực làm việc là quan 1, quận 3, quận Tân Binh. Tiếp theo ta có công việc 2 với các kỹ năng gồm Python, MySQL, Data Analysis, PowerBI, ETL và khu
vực làm việc là quận 1, quận 7. Và cuôi cùng hô sơ người dùng X với các kỹ năng
gồm Java, MySQL, Web, Spring Boot, và khu vực làm việc là quận 1, quận 3, quận
Tân Bình.
Áp dụng công thức:
TF = Số lần xuất hiện mot từ xuất hiện trong tài liệu Tổng số từ trong tài liệu
IDF = log log S6 van ban trong kho van ban
TF-IDF-TF*IDF
Số van ban trong Kho van ban chứa từ can tính
Từ TF IDF(*Cac dac IDF
—| trưng người —
CV 1) CV 2 | Người CV 1 | CV2 | Nguoi dùng dùng không
dùng X l x dùng dé tinh
IDF)
Java 1/8 0 1/8 log(2/1)=0,3 0375 l0 0,375
MySQL 1/8 1/7 1/8 log(2/2)=0 0 0 0
Web 1⁄8 0 1/8 log(2/1)=0,3 0375 0 0,375
Spring Boot [1/8 0 1/8 log(2/1)=0,3 0,375 |0 0,375
Hibernate 1/8 0 0 log(2/1)=0,3 0,375 10 0
Python 0 1/7 0 log(2/1)=0,3 l0 0,042 l0
Data Analysis | 1/7 0 log(2/1)=0,3 0 0,042 |0
PowerBI 0 17 0 log(2/1)=0,3 l0 0,042 l0
ETL 0 1/7 0 log(2/1)=0,3 0 0,042 l0
33
Quận 1 1/8 1/7 1/8 log(2/2)=0 0 0 0
Quan 3 1⁄8 0 L8 log(2/1)=0,3—*(0,375 0 0,375
Quận 7 0 17 0 log(2/1)=0,3 0 0,042 |0
Quan Tan 1/8 0 1/8 log(2/1)=0,3 0,375 0 0,375 Binh
Bang 2 - Bang vi dy vé tinh TF-IDF
Sau khi tính ta được các vector như sau:
CV1 [0.375,0,0.375,0.375,0.375,0,0,0,0,0,0.375,0,0.375]
CV2 [0,0,0,0,0,0.042,0.042,0.042,0.042,0,0,0.042,0]
X [0.375,0,0.375,0.375,0,0,0,0,0,0,0.375,0,0.375]
Tinh toán cosine similar giữa vector hồ sơ người dùng và các vector:
Nhân vô hướng giữa vector CV1 và X
CVI*X=(0.375-0.375)+(0-0)+(0.375-0.375)+(0.375-0.375)+(0.375-0)+(0-0)+(0-0)+(
0-0)+(0-0)+(0-0)+(0.375-0.375)+(0-0)+(0.375-0.375)= 0.703125
CV2*X=(0:0.375)+(0-0)+(0-0.375)+(0-0.375)+(0-0)+(0.042-0)+(0.042-0)+(0.042-0) +(0.042-0)+(0-0)+(0-0.375)+(0-0)+(0.042-0)+(0-0.375)=0
CVIIE (0.375)2 + (0)2 + (0.375)2 + (0.375)2 + (0.375)2 + (0)? =0 919
ICYHE [+ (0)? + (0)2 + (0)2 + (0)? + (0.375)? + (0)? + (0.375)2 =0
— (02+ (0)* + (0)? + (0)? + (0)4 +(0)? + (0042021. -
Jewel | (0.042)2 + (0.042)? + (0.042)? + (0.042)? + (0)? + (0)? — CADE
= 0.84 xị- |(0-375)? + (0)? + (0.375)? + (0.375) + (0)? + (0)? + (0)? _
al HOO)? + [072 +-(07° + (0876)* + (0)? + (0.875)
CV1*xX 0703125
Cosine similar(C VI, X)= = = 0.911
|lcv1l|x|lxl| 0:919+0.84
Cosine similar(CV2, X)= — : =0
|Icv1l|*|lxl| 0.084+0.84
Từ đó kết luận công việc 1 có độ tương đồng hơn với hồ sơ người dùng so với công
việc 2.
sằHiện thực code:
Trong class TFIDFBuilderModel có chức năng xây dựng model cho đề xuất công việc. Trong class này xây dựng một phước thức get() và tuần tự các bước được thực
hiện như nhau:
Bước 1: Tạo một map dé lưu trữ các đặc trưng của công việc. Các đặc trưng được load
từ database thong qua ItemDao.
Hinh 56 - Code mau hé théng dé xuat - 1
Bước 2: Tạo một vector dé lưu trữ tần suất xuất hiện, ở đây chúng ta sẽ sử dụng class
MutableSparseVector với phương thức create(Collection<Long> domain) của
LensKit để thực hiện tạo một vector với key các đặc trưng của công việc gồm kỹ năng
và khu vực làm việc và khởi tạo các value của nó là 0.0.
vectorDF.f111(0.0);
Hình 58 - Code mẫu hệ thong dé xuất - 3
55
Bước 3: Tính TF cho mỗi công việc và đồng thời tính luôn IDF. Áp dung IDF cho mỗi vector TF và chuẩn hóa đơn vị vector cho nó. Dé thực hiện ta tạo một map dé
chứa vector TF của công việc, mỗi id công việc sẽ được map dén một vector tương
Map<Long, MutableSparseVector> itemVectors = new HashMap<Long, MutableSparseVector>();
Hình 59 - Code mau hệ thong dé xuất - 4
Chúng ta sẽ lặp qua tất cả công việc, với một công việc ta sẽ tạo một vector với các key là các đặc trưng dưới dang văn ban và giá trị sẽ là số lần xuất hiện của từ đó trong công việc đó — nếu chưa có giá trị cho đặc trưng sẽ khởi tạo giá tri là 1 còn nếu đã có thì tăng giá trị đó thêm 1 và đồng thời tăng thêm 1 cho của đặc trưng đó trong vector chứa tần suất xuất hiện của từ đó trong tất cả công việc.
LongSet idAllItems = itemDao.getItemIds();
r (Long idItem : idAllitems) {
MutableSparseVector vectorTFOfTtem = MutableSparseVector.create(idMapFeature.values :
List<String> featureOfTtem = itemDao.getFeatureByTdTtem(1dTtem) ; String feature : featureofItem
long featureID = idMapFeature.get(feature) ;
vectorTFOfitem.set(featureID, vectorTFOfItem.get(featureID) + 1);
IllegalArgumentException e vectorTFOfitem.set(featureID, 1);
vectorDF.set(featureID, vectorDF.get(featureID) + 1);
Hình 60 - Code mau hệ thống dé xuất - 5 Bước 4: Tiếp theo chúng ta sẽ tính IDF đặc trưng của các công việc
( .isinfinite(idf)) {
Hình 61 - Code mẫu hệ thong dé xuất - 6
Bước 4: Tình TF-IDF cho mỗi công việc va trả về khởi tạo một TFIDFModel.
Map<Long, MutableSparseVector> modelData = new HashMap<Long, MutableSparseVector>();
Set<Map.Entry<Long, MutableSparseVector>> setVectorTFItem = 1temVectors.entrySet();
(Map.Entry<Long, MutableSparseVector> veEntry : setVectorTFItem) { MutableSparseVector vectorTfTtemTemp = veEntry.getValue();
VectorEntry entry : vectorTfTtemTemp long idFeature = entry.getKey();
int countSpecificFeature = ScoreUtils.countFeatureSpecific(vectorTfitemTemp) ; double tf = entry.getValue() / countSpecificFeature;
double idf = vectorDF.get(idFeature) ;
modelData.put(veEntry.getKey(), vectorTfTtemTemp) ;
}
Map<Long, Double> idToDFMap = createIDToDFMap();
I ú TFIDFModel(idMapFeature, modelData, idToDFMap) ;
Hình 62 - Code mẫu hệ thống dé xuất - 7
Bước 5: Tính TF-IDF cho hồ sơ người dùng chỉ định và sau đó tính độ tương đồng của cosine giữa vector TF-IDF hồ sơ người dùng và các vector TF-IDF của các công
VIỆC.
37
scoreWithDetails user, ion<Long> items
> list = new < >0) userVector = makeUserVector(user) ;
sstem.out.println(‘ 5 System.out.println(uservector) ; System.out.printin();
¡ CosineVectorSimilarity();
idItem : items
vectorItem = model.getVectorItem(idItem) ;
¡ BasicResultMap( list);
Hình 63 - Code mẫu hệ thống dé xuất - 8
Bước 6: Kết quả sau khi thực hiện là một danh sách id các công việc, dựa vào các id công việc này sẽ lây được dây sách công việc được đề xuất từ database.
3.7. Xây dựng chức năng đề xuất ứng viên
Việc xây dựng chức năng đề xuất ứng viên cho từng công việc được thực hiện tương tự như công việc. Trong đó các chiều là các đặc trưng về các kỹ năng, địa điểm
làm việc.
Chúng ta cũng sẽ tạo những vector TF-IDF đại diện hồ sơ của từng ứng viên và tính vector chỉ định cho công việc. Sau đó chúng toán độ tương đồng cosine giữa công
việc và các ứng viên. Sau khi tính xong chúng ta sẽ được một danh sách id các ứng viên.