├── static
├── user.png
├── hiring.png
├── profile.png
├── result.png
├── analysis.png
├── interview.png
├── fer_output.png
├── sampleResume.pdf
├── tone_analysis.jpg
├── result.json
├── answers.json
├── candidateSelectscript.js
├── candidateSelectStyle.css
├── questionPageStyle.css
├── firstPageStyle.css
├── resultstyle.css
├── questionPagescript.js
├── styles.css
└── trainDataset.csv
├── screenshots
├── s3.PNG
├── info.PNG
├── pred.png
├── email.PNG
├── firstpg.png
├── info-2.PNG
├── mysql.PNG
├── stream.png
├── mailsent.png
├── profiles.PNG
├── structure.PNG
├── certificate.png
├── certificate2.png
├── firstpg(2).png
└── thank-resp.PNG
├── requirements.txt
├── .env.sample
├── .gitignore
├── templates
├── questionPage.html
├── recorded.html
├── FirstPage.html
├── result.html
├── candidateSelect.html
└── index.html
├── video_analysis.py
├── README.md
└── app.py
/static/user.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gautamgc17/Smart-Hire/HEAD/static/user.png
--------------------------------------------------------------------------------
/screenshots/s3.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gautamgc17/Smart-Hire/HEAD/screenshots/s3.PNG
--------------------------------------------------------------------------------
/static/hiring.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gautamgc17/Smart-Hire/HEAD/static/hiring.png
--------------------------------------------------------------------------------
/static/profile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gautamgc17/Smart-Hire/HEAD/static/profile.png
--------------------------------------------------------------------------------
/static/result.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gautamgc17/Smart-Hire/HEAD/static/result.png
--------------------------------------------------------------------------------
/screenshots/info.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gautamgc17/Smart-Hire/HEAD/screenshots/info.PNG
--------------------------------------------------------------------------------
/screenshots/pred.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gautamgc17/Smart-Hire/HEAD/screenshots/pred.png
--------------------------------------------------------------------------------
/static/analysis.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gautamgc17/Smart-Hire/HEAD/static/analysis.png
--------------------------------------------------------------------------------
/static/interview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gautamgc17/Smart-Hire/HEAD/static/interview.png
--------------------------------------------------------------------------------
/screenshots/email.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gautamgc17/Smart-Hire/HEAD/screenshots/email.PNG
--------------------------------------------------------------------------------
/screenshots/firstpg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gautamgc17/Smart-Hire/HEAD/screenshots/firstpg.png
--------------------------------------------------------------------------------
/screenshots/info-2.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gautamgc17/Smart-Hire/HEAD/screenshots/info-2.PNG
--------------------------------------------------------------------------------
/screenshots/mysql.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gautamgc17/Smart-Hire/HEAD/screenshots/mysql.PNG
--------------------------------------------------------------------------------
/screenshots/stream.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gautamgc17/Smart-Hire/HEAD/screenshots/stream.png
--------------------------------------------------------------------------------
/static/fer_output.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gautamgc17/Smart-Hire/HEAD/static/fer_output.png
--------------------------------------------------------------------------------
/static/sampleResume.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gautamgc17/Smart-Hire/HEAD/static/sampleResume.pdf
--------------------------------------------------------------------------------
/screenshots/mailsent.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gautamgc17/Smart-Hire/HEAD/screenshots/mailsent.png
--------------------------------------------------------------------------------
/screenshots/profiles.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gautamgc17/Smart-Hire/HEAD/screenshots/profiles.PNG
--------------------------------------------------------------------------------
/screenshots/structure.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gautamgc17/Smart-Hire/HEAD/screenshots/structure.PNG
--------------------------------------------------------------------------------
/static/tone_analysis.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gautamgc17/Smart-Hire/HEAD/static/tone_analysis.jpg
--------------------------------------------------------------------------------
/screenshots/certificate.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gautamgc17/Smart-Hire/HEAD/screenshots/certificate.png
--------------------------------------------------------------------------------
/screenshots/certificate2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gautamgc17/Smart-Hire/HEAD/screenshots/certificate2.png
--------------------------------------------------------------------------------
/screenshots/firstpg(2).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gautamgc17/Smart-Hire/HEAD/screenshots/firstpg(2).png
--------------------------------------------------------------------------------
/screenshots/thank-resp.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gautamgc17/Smart-Hire/HEAD/screenshots/thank-resp.PNG
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | numpy
2 | scipy
3 | pandas
4 | matplotlib
5 | seaborn
6 | scikit-learn
7 | opencv-python
8 | Flask
9 | Flask-Mail
10 | flask-mysqldb
11 | boto3
12 | ibm_watson
13 | python-dotenv
14 | python-decouple
15 | nltk
16 | spacy == 2.3.5
17 | tensorflow
18 | fer
19 | pyresparser
--------------------------------------------------------------------------------
/.env.sample:
--------------------------------------------------------------------------------
1 | my_region = ""
2 | bucket_name = ""
3 | lang_code = ""
4 | aws_access_key_id = ""
5 | aws_secret_key = ""
6 |
7 |
8 | mysql_password = ""
9 | mysql_user = "
10 |
11 |
12 | mail_username = ""
13 | mail_pwd = ""
14 |
15 |
16 | ibm_apikey = ""
17 | ibm_url = ""
18 |
19 |
20 | company_mail = ""
21 | company_pswd = ""
--------------------------------------------------------------------------------
/static/result.json:
--------------------------------------------------------------------------------
1 | {"Name": "Mohit Makkar", "Age": 21, "Email": "mohitmakkar57@gmail.com", "Mobile Number": "8872404929", "Skills": "Design, Robot, Javascript, Css, Engineering, Architecture, Editing, Django, Machine learning, Html, Communication, C++, English, Research, Python, Photography, Segmentation, Electronics, Research projects", "Degree": "Bachelor of Engineering", "Designation": "Aspiring Software Development Engineer", "Total Experience": 2.0, "Predicted Personality": "Extraverted"}
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 |
7 | # PyInstaller
8 | # Usually these files are written by a python script from a template
9 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
10 | *.manifest
11 | *.spec
12 |
13 |
14 | # Installer logs
15 | pip-log.txt
16 | pip-delete-this-directory.txt
17 |
18 |
19 | # Flask stuff:
20 | instance/
21 | .webassets-cache
22 |
23 |
24 | # Jupyter Notebook
25 | .ipynb_checkpoints
26 |
27 |
28 | # IPython
29 | profile_default/
30 | ipython_config.py
31 |
32 |
33 | # Environments
34 | .env
35 | .venv
36 | env/
37 | venv/
38 | ENV/
39 | env.bak/
40 | venv.bak/
41 |
42 | # Others
43 | .DS_Store
44 | .vscode/
45 | output/
--------------------------------------------------------------------------------
/static/answers.json:
--------------------------------------------------------------------------------
1 | {"Question 1: Tell something about yourself": ["Okay. So I am a self starter with strong interpersonal skills. I work efficiently both as an individual contributor as well as along with a team. I see new challenges and try to think out of the box while looking for creative solutions to a given problem. Besides that details given in my resume I believe in character, values, vision, and action. I am a quick learner and believe in learning from my mistakes."], "Question 2: Why should we hire you?": ["I have great communication skills, desired experience and the requisite skill set for this job role. If I get a chance to showcase my abilities, I will leave no stone unturned with my commitment to hard work and dedication."], "Question 3: Where Do You See Yourself Five Years From Now?": ["I am certain that the coming five years will be productive. For me, working in an esteemed organization with a positive work environment can be rewarding. I can picture myself growing to the position I'm working on. I feel values of this organization can be advantages to my career. In return, I see myself utilizing my knowledge to yield better outcomes. The five years, I see ahead of me are full of responsibilities which need better decisiveness. I'm sure the years will be mutually progressive for me and the organization."]}
--------------------------------------------------------------------------------
/templates/questionPage.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Video Recorder
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/static/candidateSelectscript.js:
--------------------------------------------------------------------------------
1 | const accept=document.querySelector('.accepted');
2 | const reject=document.querySelector('.rejected');
3 | const append=document.querySelector('.texttoadd');
4 | const comment=document.querySelector('.comment');
5 | console.log(accept.value)
6 | accept.addEventListener('click',()=>{// event to send mail asynchronously to candidate that he is selected
7 | console.log(accept.value)
8 | fetch('/accept')
9 | .then(response=>response.text())
10 | .then((text)=>{
11 | if(text=='success'){
12 | alert('Mail Sent succesfully');
13 | }
14 | else{
15 | alert("Mail not sent")
16 | }
17 | })
18 | document.querySelector('#tochange').innerHTML='Selected this candidate';
19 | reject.disabled=true;
20 | accept.disabled=true;
21 |
22 | })
23 | reject.addEventListener('click',()=>{// event to send mail asynchronously to candidate that he is not selected
24 | fetch('/reject')
25 | .then(response=>response.text())
26 | .then((text)=>{
27 | if(text=='success'){
28 | alert('Mail Sent succesfully');
29 | }
30 | else{
31 | alert("Mail not sent")
32 | }
33 | })
34 | document.querySelector('#tochange').innerHTML='Rejected this candidate';
35 | reject.disabled=true;
36 | accept.disabled=true;
37 |
38 | })
39 |
--------------------------------------------------------------------------------
/templates/recorded.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Interview Done
8 |
9 |
41 |
42 |
43 |
44 |
Thanks for an interview.
46 | You'll hear from us after a while via email.
47 |
48 |
49 |
--------------------------------------------------------------------------------
/static/candidateSelectStyle.css:
--------------------------------------------------------------------------------
1 | *{
2 | margin: 0;
3 | padding: 0;;
4 | }
5 | body{
6 | background-color: #ebede7 ;
7 | }
8 | .header__box{
9 | margin-left: 32px;
10 | padding: 10px;
11 | border-bottom: 1px solid gainsboro;
12 |
13 | }
14 | .header__box > h2{
15 | color: #1b7bdf;
16 | }
17 | .left > a{
18 | text-decoration: none;
19 | color:#1b7bdf;
20 | }
21 | .left > P{
22 | margin-bottom: 5px;
23 | }
24 | .right > p{
25 | margin-bottom: 5px;
26 |
27 | }
28 | .right > span{
29 | color:#1b7bdf;
30 | }
31 | .body{
32 | margin:auto;
33 | padding: 5px;
34 | border: 0.5px solid white;
35 | width: 500px;
36 | margin-top:20px;
37 | margin-bottom:20px;
38 |
39 | border-radius: 10px;
40 | background-color: white;
41 | }
42 | h3{
43 | margin-left: 4px;
44 | background-color: white;
45 | }
46 | .box1{
47 | display: flex;
48 | justify-content: space-between;
49 | margin-top: 10px;
50 | padding: 5px;
51 | background-color: white;
52 | }
53 | .left{
54 | margin-right: 10px;
55 | background-color: white;
56 | }
57 | .right{
58 | margin-left: 10px;
59 | margin-right: 10px;
60 | background-color: white;
61 | }
62 | .right__sidebar{
63 | margin-left: 36px;
64 | background-color: white;
65 | }
66 | .icon{
67 | margin-bottom: 14px;
68 | background-color: white;
69 | color: #71c0e3;
70 | }
71 | button{
72 | /* position: relative; */
73 | top: -49px;
74 | left: 5px;
75 | outline: none;
76 | border: 0.2px solid grey;
77 | border-radius: 5px;
78 | padding: 3px;
79 | }
80 | #white{
81 | background-color: white;
82 | }
83 | button{
84 | outline: none;
85 | border:none;
86 | background: transparent;
87 | cursor: pointer;
88 | }
89 | button:hover{
90 | transform: scale(0.90);
91 | }
92 | textarea{
93 | display: none;
94 | }
--------------------------------------------------------------------------------
/static/questionPageStyle.css:
--------------------------------------------------------------------------------
1 | #container{
2 | display: flex;
3 | flex-direction: column;
4 | justify-content: center;
5 | align-items: center;
6 | max-width: 700px;
7 | min-width:350px;
8 | margin:auto;
9 | height:100vh;
10 |
11 | }
12 | button {
13 | margin: 0 3px 10px 0;
14 | padding-left: 2px;
15 | padding-right: 2px;
16 | width: 99px;
17 | }
18 | #question{
19 | width: 90%;
20 | margin: 20px;
21 | font-size: 25px;
22 | text-align: center;
23 |
24 | }
25 | #next{
26 | display: block;
27 | margin: auto;
28 | margin-bottom: 20px;
29 | height: 35px;
30 | padding: 5px;
31 | font-size: 15px;
32 | max-width: 150px;
33 | font-weight: bolder;
34 | width: 200px;
35 | background-color: rgb(70, 184, 230);
36 | color: white;
37 | border: none;
38 | border-radius: 8px;
39 | cursor: pointer;
40 | }
41 | #next:hover{
42 | border-radius: 20px;
43 | transform: scale(0.98);
44 | }
45 |
46 | #start{
47 | display: block;
48 | margin: auto;
49 | margin-bottom: 20px;
50 | height: 35px;
51 | padding: 5px;
52 | font-size: 15px;
53 | max-width: 150px;
54 | font-weight: bolder;
55 | width: 400px;
56 | background-color: rgb(43, 219, 20);
57 | border: none;
58 | border-radius: 8px;
59 | cursor: pointer;
60 | }
61 | #record{
62 |
63 | margin: auto;
64 | margin-bottom: 20px;
65 | height: 35px;
66 | padding: 5px;
67 | font-size: 17px;
68 | width:200px;
69 | background-color: rgb(241, 48, 13);
70 | border: none;
71 | border-radius: 8px;
72 | cursor: pointer;
73 |
74 | }
75 | #record:disabled{
76 | background-color: rgb(209, 200, 200);
77 | color:white;
78 | }
79 | #download{
80 | border: none;
81 | border-radius: 8px;
82 | cursor: pointer;
83 | margin: auto;
84 | margin-bottom: 20px;
85 | height: 35px;
86 | padding: 5px;
87 | font-size: 17px;
88 | width:200px;
89 | background-color: rgb(120, 197, 211);
90 | }
91 | #download:active {
92 | background-color: #3598e9;
93 | box-shadow: 0 4px rgb(8, 49, 126);
94 | transform: translateY(4px);
95 | }
96 | #download:disabled{
97 | background-color: rgb(209, 200, 200);
98 | color:white;
99 | }
100 | p.borderBelow {
101 | margin: 0 0 20px 0;
102 | padding: 0 0 20px 0;
103 | }
104 |
105 | video {
106 | width:90%;
107 | border-radius: 10px;
108 | }
109 |
110 | video:last-of-type {
111 | margin: 0 0 20px 0;
112 | }
113 |
114 | video#gumVideo {
115 | margin: 0 20px 20px 0;
116 | }
--------------------------------------------------------------------------------
/templates/FirstPage.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Applicant Detail
9 |
10 |
11 |
12 |
13 |
14 | {% if reg %}
15 |
16 | {% endif %}
17 |
18 |
19 |
20 |
Personality Prediction
21 |
22 |
71 |
72 |
73 |
74 |
--------------------------------------------------------------------------------
/static/firstPageStyle.css:
--------------------------------------------------------------------------------
1 | *{
2 | margin: 0;
3 | padding: 0;
4 | }
5 | body{
6 | font-family: sans-serif;
7 | margin-top: 16px;
8 | background-position: center;
9 | background:linear-gradient(to top right ,
10 | #61d9de , #e739f6)
11 | }
12 | /* Container style */
13 | .container{
14 | background-color: white;
15 | max-width: 920px;
16 | min-width:850px;
17 | width:50%;
18 | margin:auto;
19 | margin-top:30px;
20 | margin-bottom: 30px;
21 | border-radius: 30px;
22 | border:5px solid #2f18f7;
23 | padding:20px;
24 | opacity: 0.9;
25 | }
26 | .heading{
27 | width: 100%;
28 | margin: auto;
29 | color:black;
30 | text-align: center;
31 | background: url();
32 |
33 | }
34 | .main{
35 | width: 800px;
36 | margin: 20px auto;
37 | /* background-color: #2e5f70; */
38 | padding: 10px;
39 | border-radius: 4px;
40 | }
41 | .name{
42 | width: 200px;
43 | margin-top: 20px;
44 | font-size: 16px;
45 | }
46 | .fname{
47 | position: relative;
48 | left: 298px;
49 | top: -29px;
50 | width: 219px;
51 | line-height: 25px;
52 | border-radius: 4px;
53 | font-size: 16px;
54 | }
55 | .lname{
56 | position: relative;
57 | left: 320px;
58 | top: -29px;
59 | width: 219px;
60 | line-height: 25px;
61 | border-radius: 4px;
62 | font-size: 16px;
63 | }
64 | .flabel{
65 | position: relative;
66 | left: 70px;
67 | top: -3px;
68 | text-transform: capitalize;
69 | font-size: 16px;
70 | }
71 | .llabel{
72 | position: relative;
73 | left: 35px;
74 | top: -3px;
75 | text-transform: capitalize;
76 | font-size: 16px;
77 | }
78 | .email{
79 | position: relative;
80 | left: 297px;
81 | line-height: 23px;
82 | top: -25px;
83 | border-radius: 4px;
84 | font-size: 16px;
85 | }
86 | .age{
87 | left: 297px;
88 | position: relative;
89 | width: 100px;
90 | line-height: 23px;
91 | top: -25px;
92 | border-radius: 4px;
93 | font-size: 16px;
94 | }
95 | .radio{
96 | position: relative;
97 | left: 284px;
98 | padding: 12px;
99 | top: -23px;
100 | }
101 | .resume{
102 | position: relative;
103 | left: 295px;
104 | top: -21px;
105 | border-radius: 4px;
106 | font-size: 16px;
107 | font-weight: bold;
108 | }
109 | /* Rating */
110 | .Qname{
111 | text-align: center;
112 | padding: 10px;
113 | margin: 18px;
114 | }
115 | .Q{
116 | text-transform: capitalize;
117 | margin-top: 7px;
118 | }
119 | .ans{
120 | position: relative;
121 | left: 500px;
122 | top: -26px;
123 | height: 23px;
124 | width: 250px;
125 | border-radius: 4px;
126 | font-size: 16px;
127 | }
128 |
129 | button{
130 | width: 152px;
131 | height: 40px;
132 | top: 30px;
133 | position: relative;
134 | left: 73px;
135 | color:white;
136 | font-size: 16px;
137 | font-weight: 400;
138 | background:#2f18f7; ;
139 | border-radius: 10px;
140 | border: 2px solid #15f4ee;
141 | letter-spacing: 3px;
142 | transition: 0.5s;
143 | }
144 |
145 | button:hover{
146 | box-shadow: 0 2px 10px 0 #15f4ee inset;
147 | }
148 | input{
149 | padding:5px;
150 | }
--------------------------------------------------------------------------------
/static/resultstyle.css:
--------------------------------------------------------------------------------
1 |
2 | .container{
3 | display: grid;
4 | grid-template-rows: auto;
5 | /* grid-gap: 20px; */
6 | /* height: 100vh; */
7 | /* overflow: hidden; */
8 | margin:10px;
9 | border-radius: 20px;
10 | }
11 | .upper{
12 | display: grid;
13 | grid-template-columns: 11fr 4fr;
14 | }
15 |
16 | .images-area{
17 | height:480px;
18 | overflow-y: scroll;
19 | overflow-x: hidden;
20 | width:100%;
21 | scrollbar-width: none;
22 | }
23 | .images-area::-webkit-scrollbar {
24 | display: none; /* for Chrome, Safari, and Opera */
25 | }
26 | .images-area .questionwise{
27 | position: relative;
28 | width:95%;
29 | text-align: center;
30 | border:3px solid red;
31 | padding: 0;
32 | margin:auto;
33 | overflow: none;
34 | height: 460px;
35 | margin-bottom: 10px;
36 | border-radius: 10px;
37 | }
38 | .images-area .questionwise h2{
39 | position: relative;
40 | top:-30px;
41 | }
42 | .images-area .questionwise img{
43 | position: relative;
44 | /* top:20px;
45 | left:0px; */
46 | padding:0;
47 | width:auto;
48 | height:380px;
49 | margin:10px;
50 | }
51 | .images-area .timewise{
52 | position:relative;
53 | width:95%;
54 | text-align: center;
55 | border:3px solid red;
56 | overflow: hidden;
57 | margin:auto;
58 | height: 90%;
59 | padding:0;
60 | margin-bottom: 10px;
61 | border-radius: 10px;
62 | }
63 | .images-area .timewise img{
64 | position: relative;
65 | top:10px;
66 | left:-105px;
67 | height: 85%;
68 | width: 120%;
69 | }
70 |
71 | .profile{
72 | height:100%;
73 | }
74 | .card-border{
75 | display: flex;
76 | flex-direction: column;
77 | justify-content: center;
78 | align-items: center;
79 | text-align: center;
80 | width:100%;
81 | }
82 | .name-age{
83 | text-transform:uppercase;
84 | margin:2px;
85 | }
86 | .question{
87 | color:red;
88 | margin:10px;
89 | font-weight: bold;
90 | }
91 | .answer{
92 | margin-left: 10px;
93 | }
94 | p{
95 | margin:2px;
96 | }
97 | .contact{
98 | display: flex;
99 | flex-direction: row;
100 | justify-content:space-around;
101 | align-items: baseline;
102 | width:100%;
103 | }
104 | .otherdetails{
105 | display: flex;
106 | flex-direction: column;
107 | width:100%;
108 | margin:2px;
109 | color:#02BFCB;
110 | }
111 | .otherdetails .row1{
112 | width:100%;
113 | display: flex;
114 | flex-direction: row;
115 | justify-content: space-between;
116 | margin:2px;
117 | width:100%;
118 | }
119 | .otherdetails .row2{
120 | width:100%;
121 | display: flex;
122 | flex-direction: row;
123 | justify-content: space-between;
124 | margin:2px;
125 | width:100%;
126 | }
127 | .profile{
128 | color:white;
129 | background-color: #231E39;
130 | padding: 10px;
131 | }
132 | /*
133 | LOWER */
134 | .lower{
135 | color:white;
136 | padding: 10px;
137 | background-color:#231E39;
138 | font-size: 18px;
139 | border-radius: 20px;
140 | /* max-height: 1000px; */
141 |
142 |
143 | }
144 | span{
145 | display: inline-flex;
146 | margin:2px;
147 | padding:4px;
148 | border:3px solid #033a5f;
149 | border-radius: 5px;
150 | }
--------------------------------------------------------------------------------
/video_analysis.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import pandas as pd
3 | import json
4 | import os
5 | import random
6 | import time
7 | import boto3
8 | from ibm_watson import ToneAnalyzerV3
9 | from ibm_cloud_sdk_core.authenticators import IAMAuthenticator
10 | from decouple import config
11 |
12 | # Accessing the environment variables stored in .env file
13 | AWS_ACCESS_KEY_ID = config('aws_access_key_id')
14 | AWS_SECRET_KEY = config('aws_secret_key')
15 | MY_REGION = config('my_region')
16 | BUCKET_NAME = config('bucket_name')
17 | LANG_CODE = config('lang_code')
18 | IBM_APIKEY = config('ibm_apikey')
19 | IBM_URL = config('ibm_url')
20 |
21 | # Authenticate Watson Tone Analyzer
22 | authenticator = IAMAuthenticator(IBM_APIKEY)
23 | tone_analyzer = ToneAnalyzerV3(version='2017-09-21' , authenticator = authenticator)
24 | tone_analyzer.set_service_url(IBM_URL)
25 |
26 | # Create a resource service client by name using the default session. AWS Transcribe will transcribe files from S3 Storage
27 | s3 = boto3.resource(service_name = "s3" , region_name = MY_REGION , aws_access_key_id = AWS_ACCESS_KEY_ID ,
28 | aws_secret_access_key = AWS_SECRET_KEY)
29 |
30 | # For each transcription call, create a random job name
31 | def random_job_name():
32 | DIGITS = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
33 | LOWERCASE_CHAR = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'm', 'n', 'o', 'p', 'q','r', 's', 't', 'u', 'v', 'w', 'x', 'y','z']
34 | UPPERCASE_CHAR = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'M', 'N', 'O', 'p', 'Q','R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z']
35 |
36 | COMBINED_LIST = DIGITS + UPPERCASE_CHAR + LOWERCASE_CHAR
37 | temp_name = ""
38 |
39 | for x in range(10):
40 | temp_name += random.choice(COMBINED_LIST)
41 |
42 | return str(temp_name)
43 |
44 | # Function to analyze video/audio files uploaded to S3 Bucket and return transcribed speech in json format using the Amazon Transcribe API
45 | def extract_text(file_name):
46 | try:
47 | s3.Bucket(f"{BUCKET_NAME}").upload_file(Filename = f"./static/{file_name}" , Key = file_name)
48 | except Exception as e:
49 | print("Could not fetch data")
50 |
51 | transcribe = boto3.Session(region_name = MY_REGION ,
52 | aws_access_key_id = AWS_ACCESS_KEY_ID ,
53 | aws_secret_access_key = AWS_SECRET_KEY).client("transcribe")
54 |
55 | random_job = random_job_name()
56 |
57 | file_format = "webm"
58 | job_uri = f"s3://{BUCKET_NAME}/"+file_name
59 | job_name = file_name.split('.')[0] + random_job
60 |
61 | # starts an asynchronous job to transcribe speech to text
62 | transcribe.start_transcription_job(TranscriptionJobName = job_name ,
63 | Media = {'MediaFileUri': job_uri} ,
64 | MediaFormat = file_format ,
65 | LanguageCode = LANG_CODE)
66 |
67 | while True:
68 | status = transcribe.get_transcription_job(TranscriptionJobName=job_name)
69 | time.sleep(45)
70 | if status['TranscriptionJob']['TranscriptionJobStatus'] in ['COMPLETED', 'FAILED']:
71 | break
72 |
73 | if status['TranscriptionJob']['TranscriptionJobStatus'] == "COMPLETED":
74 | data = pd.read_json(status['TranscriptionJob']['Transcript']['TranscriptFileUri'])
75 |
76 | elif status['TranscriptionJob']['TranscriptionJobStatus'] == "FAILED":
77 | print("Failed to extract text from audio.....Try again!!")
78 |
79 | # get the text from json response object
80 | text = data['results'][1][0]['transcript']
81 |
82 | s3.Bucket(BUCKET_NAME).objects.all().delete()
83 | s3.Bucket(BUCKET_NAME).object_versions.delete()
84 |
85 | return text , data
86 |
87 | # Tone analysis of the text obtained through Amazon Transcribe API
88 | def analyze_tone(text):
89 | res = tone_analyzer.tone(text).get_result()
90 | return res
--------------------------------------------------------------------------------
/templates/result.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Interview Results
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |

18 |
Tone Analysis
19 |
20 |
21 |
22 |

23 |
Face Emotion Analysis
24 |
25 |
26 |
27 |
28 |
29 |
30 |
42 |
43 | {{output['Name']}}
{{output['Age']}}
44 |
45 |
46 |
54 |
55 |
56 |
Degree: {{output['Degree']}}
57 |
58 | Designation: {{output['Designation']}}
59 |
60 |
61 |
62 |
63 | Experience: {{output['Total Experience']}}
64 |
65 |
66 | Predicted Personality: {{output['Predicted Personality']}}
67 |
68 |
69 |
70 |
71 |
72 |
Skills
73 |
{{output['Skills']}}
74 |
75 |
76 |
77 |
78 |
79 | {% if responses %} {% for key , val in responses.items() %}
80 |
{{ key }}
81 |
{{val[0]}}
82 |
83 | {% endfor %} {% endif %}
84 |
85 |
86 |
87 |
104 |
105 |
106 |
--------------------------------------------------------------------------------
/templates/candidateSelect.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | View Profiles
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
22 |
23 |
24 |
Mohit Makkar
25 |
26 |
27 |
Not evaluated for this stage.
28 |
Evaluate Now
29 |
30 |
31 |
32 |
48 |
49 |
50 |
51 |
52 |
53 |
Jitendra Khatri
54 |
55 |
56 |
57 |
Not evaluated for this stage.
58 |
Evaluate Now
59 |
60 |
61 |
62 |
78 |
79 |
80 |
81 |
82 |
83 |
Gaurav Rajput
84 |
85 |
86 |
87 |
Not evaluated for this stage.
88 |
Evaluate Now
89 |
90 |
91 |
92 |
108 |
109 |
110 |
111 |
112 |
113 |
Akash Kumar Rana
114 |
115 |
116 |
117 |
Not evaluated for this stage.
118 |
Evaluate Now
119 |
120 |
121 |
122 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
--------------------------------------------------------------------------------
/static/questionPagescript.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | /* globals MediaRecorder */
4 |
5 | let mediaRecorder;
6 | let recordedBlobs;
7 | let count = 1;
8 | const questions = ['Question 1: Tell something about yourself', 'Question 2: Why should we hire you?', 'Question 3:Where Do You See Yourself Five Years From Now?']
9 | const errorMsgElement = document.querySelector('span#errorMsg');
10 | const recordedVideo = document.querySelector('video#recorded');
11 | const recordButton = document.querySelector('button#record');
12 | const downloadButton = document.querySelector('button#download');
13 | const nextButton = document.getElementById('next');
14 | const time = [];
15 | let userStream;
16 | let filedat;
17 | const numrec=[];
18 |
19 |
20 | nextButton.addEventListener('click', () => {//Button for next question to be asked
21 | if (count <= questions.length - 1) {
22 | document.getElementById('question').innerText = questions[count];
23 | time.push(Date());
24 | count++;
25 | mediaRecorder.stop();
26 | mediaRecorder.start();
27 | } else {
28 | recordButton.disabled = false;
29 | time.push(Date());
30 | nextButton.style.display = 'none';
31 | document.getElementById('question').style.display = 'none';
32 | count = 1;
33 | mediaRecorder.stop();
34 | mediaRecorder.start();
35 | }
36 | })
37 |
38 | recordButton.addEventListener('click', () => {// to start the camera for recording
39 | if (recordButton.textContent === 'Record') {
40 | time.push(Date());
41 | console.log(time);
42 | startRecording();
43 | } else {
44 | stopRecording();
45 | time.push(Date());
46 | recordButton.textContent = 'Record';
47 | downloadButton.disabled=false
48 | }
49 | });
50 |
51 | // playButton.addEventListener('click', () => {
52 | // const superBuffer = new Blob(recordedBlobs, {type: 'video/webm'});
53 | // recordedVideo.src = null;
54 | // recordedVideo.srcObject = null;
55 | // recordedVideo.src = window.URL.createObjectURL(superBuffer);
56 | // recordedVideo.controls = true;
57 | // recordedVideo.play();
58 | // });
59 |
60 | downloadButton.addEventListener('click', () => {// send data to server
61 | var data = new FormData();
62 | recordedBlobs.forEach((blob,index) => {
63 | const arr=[];
64 | arr.push(blob);
65 | if(index<3){
66 | const blobdata=new Blob(arr,{type:'video/webm'});
67 | data.append(`question${index+1}`,blobdata);
68 | }
69 | });
70 |
71 |
72 |
73 | const url1 = `/recorded`;
74 | fetch(`${window.origin}/analysis`, {
75 | method: 'POST',
76 | body: data
77 | })
78 | .then(response => {
79 | console.log(response);
80 | return response.text()
81 | })
82 | .then(data => {
83 | console.log(data)
84 | console.log(time);
85 | if (data === 'success') {
86 | const a = document.createElement('a');
87 | a.style.display = 'none';
88 | a.target = '_self';
89 | a.href = url1;
90 | document.body.appendChild(a);
91 | a.click();
92 | }
93 | else {
94 | alert("can't post");
95 | }
96 |
97 |
98 |
99 | })
100 | });
101 |
102 | function handleDataAvailable(event) {// push data to blob or video data
103 | console.log('handleDataAvailable', event);
104 | if (event.data && event.data.size > 0) {
105 | recordedBlobs.push(event.data);
106 | }
107 | }
108 | function showNextBtn() {
109 | document.getElementById('next').style.display = 'block';
110 | document.getElementById('question').innerText = questions[0];
111 | recordButton.disabled = true;
112 |
113 | }
114 | function startRecording() {// start camera
115 | showNextBtn();
116 | recordedBlobs = [];
117 | let options = { mimeType: 'video/webm;codecs=vp9,opus',audioBitsPerSecond:128000,videoBitsPerSecond:2500000 };
118 | try {
119 | mediaRecorder = new MediaRecorder(userStream, options);
120 | } catch (e) {
121 | console.error('Exception while creating MediaRecorder:', e);
122 | errorMsgElement.innerHTML = `Exception while creating MediaRecorder: ${JSON.stringify(e)}`;
123 | return;
124 | }
125 |
126 | console.log('Created MediaRecorder', mediaRecorder, 'with options', options);
127 | recordButton.textContent = 'Stop Recording';
128 | downloadButton.disabled = true;
129 | mediaRecorder.onstop = (event) => {
130 | console.log('Recorder stopped: ', event);
131 | console.log('Recorded Blobs: ', recordedBlobs);
132 | };
133 |
134 | mediaRecorder.ondataavailable = handleDataAvailable;
135 | mediaRecorder.start();
136 | console.log('MediaRecorder started', mediaRecorder);
137 | }
138 |
139 | function stopRecording() {// stop recording answered question
140 | console.log('iniside stop');
141 | console.log(userStream);
142 | mediaRecorder.stop();
143 | recordButton.style.display = 'none';
144 | const gumVideo = document.querySelector('video#gum');
145 | userStream.getTracks()[0].enabled=false;
146 | userStream.getTracks()[1].enabled=false;
147 | // console.log(userStream);
148 | // delete userStream.getTracks()[0];
149 | // delete userStream.getTracks()[1];
150 |
151 | // gumVideo.pause();
152 | // gumVideo.src='';
153 | // gumVideo.style.display='none';
154 |
155 | }
156 |
157 | function handleSuccess(stream) {// set video stream to video tag
158 | recordButton.disabled = false;
159 | console.log('getUserMedia() got stream:', stream);
160 |
161 |
162 | const gumVideo = document.querySelector('video#gum');
163 | gumVideo.srcObject = stream;
164 | }
165 |
166 | async function init(constraints) {
167 | try {
168 | const stream = await navigator.mediaDevices.getUserMedia(constraints);
169 | userStream = stream;
170 | handleSuccess(stream);
171 | } catch (e) {
172 | console.error('navigator.getUserMedia error:', e);
173 | errorMsgElement.innerHTML = `navigator.getUserMedia error:${e.toString()}`;
174 | }
175 | }
176 |
177 | document.querySelector('button#start').addEventListener('click', async () => {// start button to trigger camera
178 | const hasEchoCancellation = document.querySelector('#echoCancellation').checked;
179 | const hasnoiseSuppression = document.querySelector('#noiseSuppression').checked;
180 | const hasAutoGainControl = document.querySelector('#autogaincontrol').checked;
181 | console.log(hasEchoCancellation);
182 | console.log(hasnoiseSuppression);
183 | console.log(hasAutoGainControl);
184 | document.querySelector('button#start').style.display = 'none';
185 | const constraints = {
186 | audio: {
187 | echoCancellation: { exact: hasEchoCancellation },
188 | autoGainControl:{exact:hasAutoGainControl},
189 | noiseSupperssion:{exact:hasnoiseSuppression}
190 | },
191 | video: {
192 | width: 1280, height: 720
193 | }
194 | };
195 | console.log('Using media constraints:', constraints);
196 | await init(constraints);
197 | });
--------------------------------------------------------------------------------
/templates/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Login Page
8 |
9 |
10 |
11 |
12 |
13 | {% if err %}
14 |
15 | {% endif %}
16 |
17 |
18 |
19 |
20 |
21 |
Welcome Interviewer!
22 |
For taking interview please login with your personal info
23 |
24 |
25 |
26 |
Hello, Interviewee!
27 |
Enter your personal details and start your interview
28 |
29 |
30 |
31 |
88 |
89 |
90 |
157 |
158 |
--------------------------------------------------------------------------------
/static/styles.css:
--------------------------------------------------------------------------------
1 | :root{
2 | --form-height:600px;
3 | --form-width: 1100px;
4 | /* Sea Green */
5 | --left-color: #9fdeaf;
6 | /* Light Blue */
7 | --right-color: #96dbe2;
8 | }
9 |
10 | body, html{
11 | width: 100%;
12 | height: 100%;
13 | margin: 0;
14 | font-family: 'Helvetica Neue', sans-serif;
15 | letter-spacing: 0.5px;
16 | }
17 |
18 | .container{
19 | width: var(--form-width);
20 | height: var(--form-height);
21 | position: relative;
22 | margin: auto;
23 | box-shadow: 2px 10px 40px rgba(22,20,19,0.4);
24 | border-radius: 10px;
25 | margin-top: 50px;
26 | }
27 | /*
28 | ----------------------
29 | Overlay
30 | ----------------------
31 | */
32 | .overlay{
33 | width: 100%;
34 | height: 100%;
35 | position: absolute;
36 | z-index: 100;
37 | background-image: linear-gradient(to right, var(--left-color), var(--right-color));
38 | border-radius: 10px;
39 | color: white;
40 | clip: rect(0, 385px, var(--form-height), 0);
41 | }
42 |
43 | .open-sign-up{
44 | animation: slideleft 1s linear forwards;
45 | }
46 |
47 | .open-sign-in{
48 | animation: slideright 1s linear forwards;
49 | }
50 |
51 | .overlay .sign-in, .overlay .sign-up{
52 | /* Width is 385px - padding */
53 | --padding: 50px;
54 | width: calc(385px - var(--padding) * 2);
55 | height: 100%;
56 | display: flex;
57 | justify-content: center;
58 | flex-direction: column;
59 | align-items: center;
60 | padding: 0px var(--padding);
61 | text-align: center;
62 | }
63 |
64 | .overlay .sign-in{
65 | float: left;
66 | }
67 |
68 | .overlay-text-left-animation{
69 | animation: text-slide-in-left 1s linear;
70 | }
71 | .overlay-text-left-animation-out{
72 | animation: text-slide-out-left 1s linear;
73 | }
74 |
75 | .overlay .sign-up{
76 | float:right;
77 | }
78 |
79 | .overlay-text-right-animation{
80 | animation: text-slide-in-right 1s linear;
81 | }
82 |
83 | .overlay-text-right-animation-out{
84 | animation: text-slide-out-right 1s linear;
85 | }
86 |
87 |
88 | .overlay h1{
89 | margin: 0px 5px;
90 | font-size: 2.1rem;
91 | }
92 |
93 | .overlay p{
94 | margin: 20px 0px 30px;
95 | font-weight: 200;
96 | }
97 | /*
98 | ------------------------
99 | Buttons
100 | ------------------------
101 | */
102 | .switch-button, .control-button{
103 | cursor: pointer;
104 | display: block;
105 | margin-left: auto;
106 | margin-right: auto;
107 | width: 140px;
108 | height: 40px;
109 | font-size: 14px;
110 | text-transform: uppercase;
111 | background: none;
112 | border-radius: 20px;
113 | color: white;
114 | }
115 |
116 | .switch-button{
117 | border: 2px solid;
118 | }
119 |
120 | .control-button{
121 | border: none;
122 | margin-top: 15px;
123 | }
124 |
125 | .switch-button:focus, .control-button:focus{
126 | outline:none;
127 | }
128 |
129 | .control-button.up{
130 | background-color: var(--left-color);
131 | }
132 |
133 | .control-button.in{
134 | background-color: var(--right-color);
135 | }
136 |
137 | /*
138 | --------------------------
139 | Forms
140 | --------------------------
141 | */
142 | .form{
143 | width: 100%;
144 | height: 100%;
145 | position: absolute;
146 | border-radius: 10px;
147 | }
148 |
149 | .form .sign-in, .form .sign-up{
150 | --padding: 50px;
151 | position:absolute;
152 | /* Width is 100% - 385px - padding */
153 | width: calc(var(--form-width) - 385px - var(--padding) * 2);
154 | height: 100%;
155 | display: flex;
156 | justify-content: center;
157 | flex-direction: column;
158 | align-items: center;
159 | padding: 0px var(--padding);
160 | text-align: center;
161 | }
162 |
163 | /* Sign in is initially not displayed */
164 | .form .sign-in{
165 | display: none;
166 | }
167 |
168 | .form .sign-in{
169 | left:0;
170 | }
171 |
172 | .form .sign-up{
173 | right: 0;
174 | }
175 |
176 | .form-right-slide-in{
177 | animation: form-slide-in-right 1s;
178 | }
179 |
180 | .form-right-slide-out{
181 | animation: form-slide-out-right 1s;
182 | }
183 |
184 | .form-left-slide-in{
185 | animation: form-slide-in-left 1s;
186 | }
187 |
188 | .form-left-slide-out{
189 | animation: form-slide-out-left 1s;
190 | }
191 |
192 | .form .sign-in h1{
193 | color: var(--right-color);
194 | margin: 0;
195 | }
196 |
197 | .form .sign-up h1{
198 | color: var(--left-color);
199 | margin: 0;
200 | }
201 |
202 | .social-media-buttons{
203 | display: flex;
204 | justify-content: center;
205 | width: 100%;
206 | margin: 15px;
207 | }
208 |
209 | .social-media-buttons .icon{
210 | width: 40px;
211 | height: 40px;
212 | border: 1px solid #dadada;
213 | border-radius: 100%;
214 | display: flex;
215 | justify-content: center;
216 | align-items: center;
217 | margin: 10px 7px;
218 | }
219 |
220 | .small{
221 | font-size: 13px;
222 | color: grey;
223 | font-weight: 200;
224 | margin: 5px;
225 | }
226 |
227 | .social-media-buttons .icon svg{
228 | width: 25px;
229 | height: 25px;
230 | }
231 |
232 | #sign-in-form input, #sign-up-form input{
233 | margin: 12px;
234 | font-size: 14px;
235 | padding: 15px;
236 | width: 260px;
237 | font-weight: 300;
238 | border: none;
239 | background-color: #e4e4e494;
240 | font-family: 'Helvetica Neue', sans-serif;
241 | letter-spacing: 1.5px;
242 | padding-left: 20px;
243 | }
244 |
245 | #sign-in-form input::placeholder{
246 | letter-spacing: 1px;
247 | }
248 |
249 | .forgot-password{
250 | font-size: 12px;
251 | display: inline-block;
252 | border-bottom: 2px solid #efebeb;
253 | padding-bottom: 3px;
254 | }
255 |
256 | .forgot-password:hover{
257 | cursor: pointer;
258 | }
259 |
260 | /*
261 | ---------------------------
262 | Animation
263 | ---------------------------
264 | */
265 | @keyframes slideright{
266 | 0%{
267 | clip: rect(0, 385px, var(--form-height), 0);
268 | }
269 | 30%{
270 | clip: rect(0, 480px, var(--form-height), 0);
271 | }
272 | /* we want the width to be slightly larger here */
273 | 50%{
274 | clip: rect(0px, calc(var(--form-width) / 2 + 480px / 2), var(--form-height), calc(var(--form-width) / 2 - 480px / 2));
275 | }
276 | 80%{
277 | clip: rect(0px, var(--form-width), var(--form-height), calc(var(--form-width) - 480px));
278 | }
279 | 100%{
280 | clip: rect(0px, var(--form-width), var(--form-height), calc(var(--form-width) - 385px));
281 | }
282 | }
283 |
284 | @keyframes slideleft{
285 | 100%{
286 | clip: rect(0, 385px, var(--form-height), 0);
287 | }
288 | 70%{
289 | clip: rect(0, 480px, var(--form-height), 0);
290 | }
291 | /* we want the width to be slightly larger here */
292 | 50%{
293 | clip: rect(0px, calc(var(--form-width) / 2 + 480px / 2), var(--form-height), calc(var(--form-width) / 2 - 480px / 2));
294 | }
295 | 30%{
296 | clip: rect(0px, var(--form-width), var(--form-height), calc(var(--form-width) - 480px));
297 | }
298 | 0%{
299 | clip: rect(0px, var(--form-width), var(--form-height), calc(var(--form-width) - 385px));
300 | }
301 | }
302 |
303 | @keyframes text-slide-in-left{
304 | 0% {
305 | padding-left: 20px;
306 | }
307 | 100% {
308 | padding-left: 50px;
309 | }
310 | }
311 |
312 | @keyframes text-slide-in-right{
313 | 0% {
314 | padding-right: 20px;
315 | }
316 | 100% {
317 | padding-right: 50px;
318 | }
319 | }
320 |
321 | @keyframes text-slide-out-left{
322 | 0% {
323 | padding-left: 50px;
324 | }
325 | 100% {
326 | padding-left: 20px;
327 | }
328 | }
329 |
330 | @keyframes text-slide-out-right{
331 | 0% {
332 | padding-right: 50px;
333 | }
334 | 100% {
335 | padding-right: 20px;
336 | }
337 | }
338 |
339 | @keyframes form-slide-in-right{
340 | 0%{
341 | padding-right: 100px;
342 | }
343 | 100%{
344 | padding-right: 50px;
345 | }
346 | }
347 |
348 | @keyframes form-slide-in-left{
349 | 0%{
350 | padding-left: 100px;
351 | }
352 | 100%{
353 | padding-left: 50px;
354 | }
355 | }
356 |
357 | @keyframes form-slide-out-right{
358 | 0%{
359 | padding-right: 50px;
360 | }
361 | 100%{
362 | padding-right: 80px;
363 | }
364 | }
365 |
366 | @keyframes form-slide-out-left{
367 | 0%{
368 | padding-left: 50px;
369 | }
370 | 100%{
371 | padding-left: 80px;
372 | }
373 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Project Description
2 |
3 | __SMART HIRE__ : An application made for "HackUIET" Hackathon with an aim to automate the interview process.
4 |
5 | ## Objective
6 |
7 | - Application to automate the hiring process
8 | - Personality prediction using ML
9 | - Check confidence and other traits using video and tone analysis
10 | - Send mail to selected/rejected candidates automatically in one-click
11 | - Fast recruitment in larger numbers
12 | - Generate concise insights and provide summary of the candidate's profile
13 | - Handy application for HR/Recruiting Team
14 |
15 | ## Project Workflow
16 | - Interviewee
17 | - Enter personal details, upload resume, attempt a questionnaire wherein the candidate has to rate himself/herself
18 | - Personality prediction (based on [Big Five Personality Traits](https://www.thomas.co/resources/type/hr-guides/what-are-big-5-personality-traits) model) with OCEAN values and CV analysis
19 | - Video recording in browser. The candidate has to answer few questions put up by the HR team on the portal.
20 | - Face emotion and Speech Analysis to get insights like confidence level, candidate personality traits
21 |
22 | - Interviewer/HR team/Admin
23 | - View all the registered candidates’ details
24 | - View each candidate's profile summary which includes resume, responses to questions, technical skills, personality traits, video and tone analysis result.
25 | - Update candidate about selection/rejection, further interview process using one-click mail or phone call
26 |
27 | ## Video Link
28 | [Project Demonstration](https://drive.google.com/drive/folders/1D5i3sphhTIIBBlRkfxhkuGK2vdK1NoXm?usp=sharing)
29 |
30 | ## Presentation Slides
31 | [Presentation Link](https://docs.google.com/presentation/d/1L1slU4owXQ5fTBK6zP6kCrpBuiCoABMF/edit#slide=id.p1)
32 |
33 |
34 |
35 |
36 | _Though most of the features has been added, yet the complete process is not yet automated as this application is made for HackUIET Hackathon. As of now, the application can be used to store the results of multiple users in mysql server, however sending of mail and candidate profile summary/dashboard can only be generated/viewed for a single user i.e, [topmost user](#Track-candidates)._
37 |
38 |
39 |
40 | # Installation Guide
41 | This project requires the following tools to get started:
42 |
43 | - Python - The programming language used by Flask.
44 | - MySQL - A relational database management system based on SQL.
45 | - Virtualenv - A tool for creating isolated Python environments.
46 | - VSCode - A lightweight source code editor which can be used to view, edit, run, and debug source code for applications. You can optionally use any other code editor of your choice such as Sublime Text or Atom.
47 | - AWS Account - A subsidiary of Amazon providing on-demand cloud computing platforms and APIs.
48 |
49 | To get started, install Python and MySQL on your local computer if you don't have them already.
50 |
51 | Also, create an AWS Free Tier account, if you don't have it. Services like Amazon S3 and Amazon Transcribe API will be used in this project.
52 |
53 | ## Getting Started
54 |
55 | **Step 1. Clone the repository into a new folder and then switch to code directory**
56 |
57 | ```
58 | $ git clone https://github.com/gautamgc17/smart-hire
59 | $ cd smart-hire
60 | ```
61 |
62 | **Step 2. Create a Virtual Environment and install Dependencies.**
63 |
64 | If you don't have the virtualenv command yet, you can find installation [instructions here](https://virtualenv.readthedocs.io/en/latest/). Learn more about [Virtual Environments](https://www.geeksforgeeks.org/python-virtual-environment/).
65 |
66 | ```
67 | $ pip install virtualenv
68 | ```
69 |
70 | Create a new Virtual Environment for the project and activate it.
71 |
72 | ```
73 | $ virtualenv venv
74 | $ source venv/bin/activate
75 | ```
76 | Once the virtual environment is activated, the name of your virtual environment will appear on left side of terminal. In our case, venv named virtual environment is active.
77 |
78 | Next, we need to install the project dependencies in this virtual environment, which are listed in `requirements.txt`.
79 |
80 | ```
81 | (venv) $ pip install -r requirements.txt
82 | ```
83 | For NLP operations, the [resume parser](https://omkarpathak.in/pyresparser/) package uses spacy and nltk. Install them using below commands:
84 | ```
85 | # spaCy
86 | python -m spacy download en_core_web_sm
87 |
88 | # nltk
89 | python -m nltk.downloader words
90 | ```
91 |
92 |
93 | **Step 3. Setup your database to store information of the candidates**
94 |
95 | Go to MySQL Command-Line Client, and login to the database server using the username and password. Then execute the below statements:
96 |
97 | ```
98 | CREATE DATABASE databasename;
99 | USE databasename;
100 | CREATE TABLE candidates (id int(11) NOT NULL AUTO_INCREMENT, candidatename varchar(50) NOT NULL, email varchar(50) NOT NULL, password varchar(50)NOT NULL, PRIMARY KEY(id));
101 | ```
102 |
103 | 
104 |
105 | To look at the candidates table structure, execute
106 |
107 | ```
108 | DESCRIBE candidates;
109 | ```
110 |
111 | **Step 4. Set up Amazon Transcribe API for speech to text conversion**
112 |
113 | - Sign in to your Amazon console and create a _S3 bucket_ and give it a unique name. Note your AWS region as it will be required later.
114 | - Go to _IAM dashboard_, add a new User. Then click on add permissions and grant the following two permissions - _AmazonTranscribeFullAccess_ and _AmazonS3FullAccess_.
115 | - Then under Security Credentials, click on _Create access key_ to get your credentials i.e, 'aws_access_key_id' and 'aws_secret_access_key'.
116 |
117 | 
118 |
119 |
120 | **Step 5. Setting up IBM Watson for tone analysis**
121 | - Go to [IBM Cloud catalog](https://cloud.ibm.com/catalog), under category choose _AI / Machine Learning_. Then choose _Tone Analyzer_ service.
122 | - To create an instance of Tone Analyzer service, click on _Create_ on right hand side.
123 | - Now we need 2 things - _service url_ and _api key_. So click on _Manage_ and copy your credentials.
124 |
125 | **Step 6. Update environment variables.**
126 |
127 | To run the project, you need to configure the application to run locally. This will require updating a set of environment variables specific to your environment.
128 |
129 | In the same directory, create a local environment file
130 |
131 | ```
132 | (venv) $ touch .env
133 | (venv) $ nano .env
134 | ```
135 |
136 | To get help on how to Set and Get Environment Variables in Python, visit [here](https://able.bio/rhett/how-to-set-and-get-environment-variables-in-python--274rgt5).
137 |
138 | _Now You have to simply duplicate the __.env.sample__ file and just insert your credentials._
139 |
140 | In the file _.env_ ,
141 | - store your aws credentials i.e aws region, unique bucket name, language code, aws access key id and secret key in following variables:
142 |
143 | ```
144 | my_region = ""
145 | bucket_name = ""
146 | lang_code = ""
147 | aws_access_key_id = ""
148 | aws_secret_key = ""
149 | ```
150 |
151 | - store your watson tone analyzer credentials in the following variables:
152 |
153 | ```
154 | ibm_apikey = ""
155 | ibm_url = ""
156 | ```
157 | - configure MySql username and password
158 |
159 | ```
160 | mysql_password = ""
161 | mysql_user = ""
162 | ```
163 |
164 | - interviewer mail and password
165 |
166 | ```
167 | mail_username = ""
168 | mail_pwd = ""
169 | ```
170 |
171 | - company's official email and password for members of HR team to sign in into the portal.
172 | ```
173 | company_mail = ""
174 | company_pswd = ""
175 | ```
176 |
177 |
178 |
179 | __So, basically your project structure would look like:__
180 |
181 | 
182 |
183 |
184 | **Step 7: Run the server**
185 |
186 | Set the FLASK_APP environment variable.
187 | ```
188 | (venv) $ export FLASK_APP=app.py
189 | ```
190 |
191 | Now we're ready to start our flask server:
192 | ```
193 | (venv) $ flask run
194 | ```
195 | Visit http://127.0.0.1:5000 to see your app in action
196 |
197 |
198 |
199 | __To know more about how to set up a flask application on Windows, MacOS or Linux, visit [here](https://phoenixnap.com/kb/install-flask#ftoc-heading-12)__
200 |
201 |
202 |
203 |
204 | # Snapshots
205 |
206 | ### Interviewee Sign Up page
207 |
208 | 
209 |
210 | ### Personality Prediction page
211 |
212 | 
213 |
214 | ### Streaming Interview of the candidate
215 |
216 | 
217 |
218 | ### 'Thankyou for Taking Interview' Response page
219 |
220 | 
221 |
222 | ### Interviewer Sign In page
223 |
224 | .png)
225 |
226 | ### Track candidates
227 |
228 | 
229 |
230 | ### Concise insights and summary of candidate profile
231 |
232 | 
233 |
234 | 
235 |
236 | ### One-click mail to candidate
237 |
238 | 
239 |
240 | ### Mail to candidate
241 |
242 | 
243 |
244 |
245 |
246 |
--------------------------------------------------------------------------------
/app.py:
--------------------------------------------------------------------------------
1 | # Import all the necessary libraries
2 | import numpy as np
3 | from numpy.core.numeric import NaN
4 | import pandas as pd
5 | import seaborn as sns
6 | import matplotlib.pyplot as plt
7 | import json
8 | import re
9 | import time
10 | import cv2
11 | from sklearn.linear_model import LogisticRegression
12 | from sklearn.preprocessing import LabelEncoder
13 | from flask import Flask , render_template , request , url_for , jsonify , Response
14 | from werkzeug.utils import redirect, secure_filename
15 | from flask_mail import Mail , Message
16 | from flask_mysqldb import MySQL
17 | from pyresparser import ResumeParser
18 | from fer import Video
19 | from fer import FER
20 | from video_analysis import extract_text , analyze_tone
21 | from decouple import config
22 |
23 |
24 | # Access the environment variables stored in .env file
25 | MYSQL_USER = config('mysql_user')
26 | MYSQL_PASSWORD = config('mysql_password')
27 |
28 | # To send mail (By interviewee)
29 | MAIL_USERNAME = config('mail_username')
30 | MAIL_PWD = config('mail_pwd')
31 |
32 | # For logging into the interview portal
33 | COMPANY_MAIL = config('company_mail')
34 | COMPANY_PSWD = config('company_pswd')
35 |
36 | # Create a Flask app
37 | app = Flask(__name__)
38 |
39 | # App configurations
40 | app.config['MYSQL_HOST'] = 'localhost'
41 | app.config['MYSQL_USER'] = MYSQL_USER
42 | app.config['MYSQL_PASSWORD'] = MYSQL_PASSWORD
43 | app.config['MYSQL_DB'] = 'smarthire'
44 | user_db = MySQL(app)
45 |
46 | mail = Mail(app)
47 | app.config['MAIL_SERVER']='smtp.gmail.com'
48 | app.config['MAIL_PORT'] = 465
49 | app.config['MAIL_USERNAME'] = MAIL_USERNAME
50 | app.config['MAIL_PASSWORD'] = MAIL_PWD
51 | app.config['MAIL_USE_TLS'] = False
52 | app.config['MAIL_USE_SSL'] = True
53 | app.config['MAIL_ASCII_ATTACHMENTS'] = True
54 | mail = Mail(app)
55 |
56 |
57 | # Initial sliding page
58 | @app.route('/')
59 | def home():
60 | return render_template('index.html')
61 |
62 |
63 | # Interviewee signup
64 | @app.route('/signup' , methods=['POST' , 'GET'])
65 | def interviewee():
66 | if request.method == 'POST' and 'username' in request.form and 'usermail' in request.form and 'userpassword' in request.form:
67 | username = request.form['username']
68 | usermail = request.form['usermail']
69 | userpassword = request.form['userpassword']
70 |
71 | cursor = user_db.connection.cursor()
72 |
73 | cursor.execute("SELECT * FROM candidates WHERE candidatename = % s AND email = %s", (username, usermail))
74 | account = cursor.fetchone()
75 |
76 | if account:
77 | err = "Account Already Exists"
78 | return render_template('index.html' , err = err)
79 | elif not re.fullmatch(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', usermail):
80 | err = "Invalid Email Address !!"
81 | return render_template('index.html' , err = err)
82 | elif not re.fullmatch(r'[A-Za-z0-9\s]+', username):
83 | err = "Username must contain only characters and numbers !!"
84 | return render_template('index.html' , err = err)
85 | elif not username or not userpassword or not usermail:
86 | err = "Please fill out all the fields"
87 | return render_template('index.html' , err = err)
88 | else:
89 | cursor.execute("INSERT INTO candidates VALUES (NULL, % s, % s, % s)" , (username, usermail, userpassword,))
90 | user_db.connection.commit()
91 | reg = "You have successfully registered !!"
92 | return render_template('FirstPage.html' , reg = reg)
93 | else:
94 | return render_template('index.html')
95 |
96 |
97 | # Interviewer signin
98 | @app.route('/signin' , methods=['POST' , 'GET'])
99 | def interviewer():
100 | if request.method == 'POST' and 'company_mail' in request.form and 'password' in request.form:
101 | company_mail = request.form['company_mail']
102 | password = request.form['password']
103 |
104 | if company_mail == COMPANY_MAIL and password == COMPANY_PSWD:
105 | return render_template('candidateSelect.html')
106 | else:
107 | return render_template("index.html" , err = "Incorrect Credentials")
108 | else:
109 | return render_template("index.html")
110 |
111 |
112 | # personality trait prediction using Logistic Regression and parsing resume
113 | @app.route('/prediction' , methods = ['GET' , 'POST'])
114 | def predict():
115 | # get form data
116 | if request.method == 'POST':
117 | fname = request.form['firstname'].capitalize()
118 | lname = request.form['lastname'].capitalize()
119 | age = int(request.form['age'])
120 | gender = request.form['gender']
121 | email = request.form['email']
122 | file = request.files['resume']
123 | path = './static/{}'.format(file.filename)
124 | file.save(path)
125 | val1 = request.form['openness']
126 | val2 = request.form['neuroticism']
127 | val3 = request.form['conscientiousness']
128 | val4 = request.form['agreeableness']
129 | val5 = request.form['extraversion']
130 |
131 | # model prediction
132 | df = pd.read_csv(r'static\trainDataset.csv')
133 | le = LabelEncoder()
134 | df['Gender'] = le.fit_transform(df['Gender'])
135 | x_train = df.iloc[:, :-1].to_numpy()
136 | y_train = df.iloc[:, -1].to_numpy(dtype = str)
137 | lreg = LogisticRegression(multi_class='multinomial', solver='newton-cg',max_iter =1000)
138 | lreg.fit(x_train, y_train)
139 |
140 | if gender == 'male':
141 | gender = 1
142 | elif gender == 'female':
143 | gender = 0
144 | input = [gender, age, val1, val2, val3, val4, val5]
145 |
146 | pred = str(lreg.predict([input])[0]).capitalize()
147 |
148 | # get data from the resume
149 | data = ResumeParser(path).get_extracted_data()
150 |
151 | result = {'Name':fname+' '+lname , 'Age':age , 'Email':email , 'Mobile Number':data.get('mobile_number', None) ,
152 | 'Skills':str(data['skills']).replace("[" , "").replace("]" , "").replace("'" , "") , 'Degree':data.get('degree' , None)[0] , 'Designation':data.get('designation', None)[0] ,
153 | 'Total Experience':data.get('total_experience') , 'Predicted Personality':pred}
154 |
155 | with open('./static/result.json' , 'w') as file:
156 | json.dump(result , file)
157 |
158 | return render_template('questionPage.html')
159 |
160 |
161 | # Record candidate's interview for face emotion and tone analysis
162 | @app.route('/analysis', methods = ['POST'])
163 | def video_analysis():
164 |
165 | # get videos using media recorder js and save
166 | quest1 = request.files['question1']
167 | quest2 = request.files['question2']
168 | quest3 = request.files['question3']
169 | path1 = "./static/{}.{}".format("question1","webm")
170 | path2 = "./static/{}.{}".format("question2","webm")
171 | path3 = "./static/{}.{}".format("question3","webm")
172 | quest1.save(path1)
173 | quest2.save(path2)
174 | quest3.save(path3)
175 |
176 | # speech to text response for each question - AWS
177 | responses = {'Question 1: Tell something about yourself': [] , 'Question 2: Why should we hire you?': [] , 'Question 3: Where Do You See Yourself Five Years From Now?': []}
178 | ques = list(responses.keys())
179 |
180 | text1 , data1 = extract_text("question1.webm")
181 | time.sleep(15)
182 | responses[ques[0]].append(text1)
183 |
184 | text2 , data2 = extract_text("question2.webm")
185 | time.sleep(15)
186 | responses[ques[1]].append(text2)
187 |
188 | text3 , data3 = extract_text("question3.webm")
189 | time.sleep(15)
190 | responses[ques[2]].append(text3)
191 |
192 | # tone analysis for each textual answer - IBM
193 | res1 = analyze_tone(text1)
194 | tones_doc1 = []
195 |
196 | for tone in res1['document_tone']['tones']:
197 | tones_doc1.append((tone['tone_name'] , round(tone['score']*100, 2)))
198 |
199 | if 'Tentative' not in [key for key, val in tones_doc1]:
200 | tones_doc1.append(('Tentative', 0.0))
201 | if 'Analytical' not in [key for key, val in tones_doc1]:
202 | tones_doc1.append(('Analytical', 0.0))
203 | if 'Fear' not in [key for key, val in tones_doc1]:
204 | tones_doc1.append(('Fear', 0.0))
205 | if 'Confident' not in [key for key, val in tones_doc1]:
206 | tones_doc1.append(('Confident', 0.0))
207 | if 'Joy' not in [key for key, val in tones_doc1]:
208 | tones_doc1.append(('Joy', 0.0))
209 |
210 | tones_doc1 = sorted(tones_doc1)
211 |
212 | res2 = analyze_tone(text2)
213 | tones_doc2 = []
214 |
215 | for tone in res2['document_tone']['tones']:
216 | tones_doc2.append((tone['tone_name'] , round(tone['score']*100, 2)))
217 |
218 | if 'Tentative' not in [key for key, val in tones_doc2]:
219 | tones_doc2.append(('Tentative', 0.0))
220 | if 'Analytical' not in [key for key, val in tones_doc2]:
221 | tones_doc2.append(('Analytical', 0.0))
222 | if 'Fear' not in [key for key, val in tones_doc2]:
223 | tones_doc2.append(('Fear', 0.0))
224 | if 'Confident' not in [key for key, val in tones_doc2]:
225 | tones_doc2.append(('Confident', 0.0))
226 | if 'Joy' not in [key for key, val in tones_doc2]:
227 | tones_doc2.append(('Joy', 0.0))
228 |
229 | tones_doc2 = sorted(tones_doc2)
230 |
231 | res3 = analyze_tone(text3)
232 | tones_doc3 = []
233 |
234 | for tone in res3['document_tone']['tones']:
235 | tones_doc3.append((tone['tone_name'] , round(tone['score']*100, 2)))
236 |
237 | if 'Tentative' not in [key for key, val in tones_doc3]:
238 | tones_doc3.append(('Tentative', 0.0))
239 | if 'Analytical' not in [key for key, val in tones_doc3]:
240 | tones_doc3.append(('Analytical', 0.0))
241 | if 'Fear' not in [key for key, val in tones_doc3]:
242 | tones_doc3.append(('Fear', 0.0))
243 | if 'Confident' not in [key for key, val in tones_doc3]:
244 | tones_doc3.append(('Confident', 0.0))
245 | if 'Joy' not in [key for key, val in tones_doc3]:
246 | tones_doc3.append(('Joy', 0.0))
247 |
248 | tones_doc3 = sorted(tones_doc3)
249 |
250 | # plot tone analysis
251 | document_tones = tones_doc1 + tones_doc2 + tones_doc3
252 |
253 | analytical_tone = []
254 | tentative_tone = []
255 | fear_tone = []
256 | joy_tone = []
257 | confident_tone = []
258 |
259 | for sentiment, score in document_tones:
260 | if sentiment == "Analytical":
261 | analytical_tone.append(score)
262 | elif sentiment == "Tentative":
263 | tentative_tone.append(score)
264 | elif sentiment == "Fear":
265 | fear_tone.append(score)
266 | elif sentiment == "Joy":
267 | joy_tone.append(score)
268 | elif sentiment == "Confident":
269 | confident_tone.append(score)
270 |
271 | values = np.array([0,1,2])*3
272 | fig = plt.figure(figsize=(12, 6))
273 | sns.set_style("whitegrid")
274 | plt.xlim(-1.5, 10)
275 |
276 | plt.bar(values , analytical_tone , width = 0.4 , label = 'Analytical')
277 | plt.bar(values+0.4 , confident_tone , width = 0.4 , label = 'Confidence')
278 | plt.bar(values+0.8 , fear_tone , width = 0.4 , label = 'Fear')
279 | plt.bar(values-0.4 , joy_tone , width = 0.4 , label = 'Joy')
280 | plt.bar(values-0.8 , tentative_tone , width = 0.4 , label = 'Tentative')
281 |
282 | plt.xticks(ticks = values , labels = ['Question 1','Question 2','Question 3'] , fontsize = 15 , fontweight = 60)
283 | plt.yticks(fontsize = 12 , fontweight = 90)
284 | ax = plt.gca()
285 | ax.xaxis.set_ticks_position('none')
286 | ax.yaxis.set_ticks_position('none')
287 | ax.xaxis.set_tick_params(pad = 5)
288 | ax.yaxis.set_tick_params(pad = 5)
289 | plt.legend()
290 | plt.savefig(f'./static/tone_analysis.jpg' , bbox_inches = 'tight')
291 |
292 | # save all responses
293 | with open('./static/answers.json' , 'w') as file:
294 | json.dump(responses , file)
295 |
296 | # face emotion recognition - plotting the emotions against time in the video
297 | videos = ["question1.webm", "question2.webm", "question3.webm"]
298 | frame_per_sec = 100
299 | size = (1280, 720)
300 |
301 | video = cv2.VideoWriter(f"./static/combined.webm", cv2.VideoWriter_fourcc(*"VP90"), int(frame_per_sec), size)
302 |
303 | # Write all the frames sequentially to the new video
304 | for v in videos:
305 | curr_v = cv2.VideoCapture(f'./static/{v}')
306 | while curr_v.isOpened():
307 | r, frame = curr_v.read()
308 | if not r:
309 | break
310 | video.write(frame)
311 | video.release()
312 |
313 | face_detector = FER(mtcnn=True)
314 | input_video = Video(r"./static/combined.webm")
315 | processing_data = input_video.analyze(face_detector, display = False, save_frames = False, save_video = False, annotate_frames = False, zip_images = False)
316 | vid_df = input_video.to_pandas(processing_data)
317 | vid_df = input_video.get_first_face(vid_df)
318 | vid_df = input_video.get_emotions(vid_df)
319 | pltfig = vid_df.plot(figsize=(12, 6), fontsize=12).get_figure()
320 | plt.legend(fontsize = 'large' , loc = 1)
321 | pltfig.savefig(f'./static/fer_output.png')
322 |
323 | return "success"
324 |
325 |
326 | # Interview completed response message
327 | @app.route('/recorded')
328 | def response():
329 | return render_template('recorded.html')
330 |
331 |
332 | # Display results to interviewee
333 | @app.route('/info')
334 | def info():
335 | with open('./static/result.json' , 'r') as file:
336 | output = json.load(file)
337 |
338 | with open('./static/answers.json' , 'r') as file:
339 | answers = json.load(file)
340 |
341 | return render_template('result.html' , output = output , responses = answers)
342 |
343 |
344 | # Send job confirmation mail to selected candidate
345 | @app.route('/accept' , methods=['GET'])
346 | def accept():
347 |
348 | with open('./static/result.json' , 'r') as file:
349 | output = json.load(file)
350 |
351 | name = output['Name']
352 | email = output['Email']
353 | position = "Software Development Engineer"
354 |
355 | msg = Message(f'Job Confirmation Letter', sender = MAIL_USERNAME, recipients = [email])
356 | msg.body = f"Dear {name},\n\n" + f"Thank you for taking the time to interview for the {position} position. We enjoyed getting to know you. We have completed all of our interviews.\n\n"+ f"I am pleased to inform you that we would like to offer you the {position} position. We believe your past experience and strong technical skills will be an asset to our organization. Your starting salary will be $15,000 per year with an anticipated start date of July 1.\n\n"+ f"The next step in the process is to set up meetings with our CEO, Rahul Dravid\n\n."+ f"Please respond to this email by June 23 to let us know if you would like to accept the SDE position.\n\n" + f"I look forward to hearing from you.\n\n"+ f"Sincerely,\n\n"+ f"Harsh Verma\nHuman Resources Director\nPhone: 555-555-1234\nEmail: feedbackmonitor123@gmail.com"
357 | mail.send(msg)
358 |
359 | return "success"
360 |
361 | # Send mail to rejected candidate
362 | @app.route('/reject' , methods=['GET'])
363 | def reject():
364 |
365 | with open('./static/result.json' , 'r') as file:
366 | output = json.load(file)
367 |
368 | name = output['Name']
369 | email = output['Email']
370 | position = "Software Development Engineer"
371 |
372 | msg = Message(f'Your application to Smart Hire', sender = MAIL_USERNAME, recipients = [email])
373 | msg.body = f"Dear {name},\n\n" + f"Thank you for taking the time to consider Smart Hire. We wanted to let you know that we have chosen to move forward with a different candidate for the {position} position.\n\n"+ f"Our team was impressed by your skills and accomplishments. We think you could be a good fit for other future openings and will reach out again if we find a good match.\n\n"+ f"We wish you all the best in your job search and future professional endeavors.\n\n"+ f"Regards,\n\n"+ f"Harsh Verma\nHuman Resources Director\nPhone: 555-555-1234\nEmail: feedbackmonitor123@gmail.com"
374 | mail.send(msg)
375 |
376 | return "success"
377 |
378 |
379 | if __name__ == '__main__':
380 | app.run(debug = True)
381 |
--------------------------------------------------------------------------------
/static/trainDataset.csv:
--------------------------------------------------------------------------------
1 | Gender,Age,openness,neuroticism,conscientiousness,agreeableness,extraversion,Personality (Class label)
2 | Male,17,7,4,7,3,2,extraverted
3 | Male,19,4,5,4,6,6,serious
4 | Female,18,7,6,4,5,5,dependable
5 | Female,22,5,6,7,4,3,extraverted
6 | Female,19,7,4,6,5,4,lively
7 | Male,18,5,7,7,6,4,lively
8 | Female,17,5,6,5,7,4,extraverted
9 | Female,19,6,6,7,5,4,extraverted
10 | Male,18,5,7,5,6,7,dependable
11 | Female,19,5,5,7,4,5,lively
12 | Male,19,6,7,5,6,3,serious
13 | Male,19,7,6,7,7,6,extraverted
14 | Male,19,7,6,6,5,6,lively
15 | Female,19,6,7,5,5,5,dependable
16 | Female,19,5,5,4,5,4,responsible
17 | Male,19,5,6,4,6,3,extraverted
18 | Female,19,7,7,2,6,5,serious
19 | Female,18,6,7,4,4,2,dependable
20 | Female,19,6,6,6,4,3,responsible
21 | Female,19,5,6,3,3,3,extraverted
22 | Female,19,6,4,6,3,4,responsible
23 | Male,18,4,5,4,3,6,extraverted
24 | Female,19,5,4,5,5,3,responsible
25 | Male,20,5,3,3,4,4,serious
26 | Female,19,6,7,5,5,4,serious
27 | Female,19,7,5,6,6,5,dependable
28 | Female,18,6,4,5,5,4,extraverted
29 | Female,19,4,6,4,7,6,extraverted
30 | Female,27,6,5,6,4,5,lively
31 | Female,17,7,4,7,6,5,lively
32 | Female,21,6,6,3,5,4,extraverted
33 | Male,18,6,5,5,6,1,extraverted
34 | Female,18,6,6,5,6,3,dependable
35 | Male,18,6,3,5,5,4,lively
36 | Male,18,5,7,3,6,4,serious
37 | Female,19,7,6,6,6,5,lively
38 | Female,18,7,6,6,7,5,responsible
39 | Female,18,7,7,5,7,3,responsible
40 | Female,17,7,5,7,7,2,dependable
41 | Female,20,6,5,4,5,5,serious
42 | Male,19,3,5,3,4,2,dependable
43 | Female,17,6,7,6,6,6,extraverted
44 | Female,18,7,5,6,6,4,serious
45 | Female,20,5,7,5,6,3,extraverted
46 | Male,28,6,5,7,6,4,dependable
47 | Male,17,5,6,5,5,3,dependable
48 | Female,18,5,5,4,4,3,responsible
49 | Female,20,7,6,6,4,4,serious
50 | Female,18,6,4,3,6,2,lively
51 | Female,19,6,4,5,6,4,lively
52 | Female,19,3,4,5,5,1,extraverted
53 | Female,18,4,5,4,6,1,extraverted
54 | Male,17,5,4,3,6,6,serious
55 | Female,23,6,7,4,4,5,extraverted
56 | Female,19,7,5,7,4,6,lively
57 | Male,18,7,5,5,4,3,lively
58 | Female,17,5,5,4,6,4,extraverted
59 | Female,18,6,6,5,4,4,dependable
60 | Female,19,5,6,5,4,7,lively
61 | Male,19,5,4,6,1,3,lively
62 | Male,19,3,7,2,6,7,responsible
63 | Female,18,7,6,5,5,5,extraverted
64 | Female,19,6,5,4,5,2,responsible
65 | Male,19,6,6,2,5,6,dependable
66 | Female,18,7,5,5,4,5,serious
67 | Male,19,6,6,5,5,4,serious
68 | Female,17,6,5,5,4,4,responsible
69 | Female,19,5,6,5,6,4,dependable
70 | Male,19,6,5,5,6,6,responsible
71 | Female,19,5,5,5,7,3,dependable
72 | Male,18,6,6,4,4,3,extraverted
73 | Male,18,7,6,6,5,7,extraverted
74 | Female,17,5,5,5,5,3,responsible
75 | Female,19,5,5,4,4,4,dependable
76 | Female,18,5,4,5,6,4,responsible
77 | Female,18,7,4,6,6,4,serious
78 | Female,17,4,6,4,4,1,extraverted
79 | Female,17,7,4,5,5,5,dependable
80 | Female,19,6,4,5,5,6,lively
81 | Female,18,5,1,3,5,2,lively
82 | Male,18,3,6,3,3,2,extraverted
83 | Female,18,7,5,7,5,2,lively
84 | Male,21,6,5,5,5,3,serious
85 | Female,21,6,5,6,5,2,responsible
86 | Female,18,6,4,4,6,4,extraverted
87 | Male,18,7,5,7,6,1,serious
88 | Female,19,5,4,7,4,4,dependable
89 | Female,18,4,6,2,1,4,serious
90 | Male,20,5,6,6,5,3,dependable
91 | Male,18,6,7,6,5,4,responsible
92 | Female,18,6,4,5,4,6,dependable
93 | Male,18,6,5,3,5,3,extraverted
94 | Female,18,7,5,2,4,3,extraverted
95 | Male,21,4,4,4,4,4,serious
96 | Male,21,6,6,5,6,4,lively
97 | Male,18,3,6,6,1,3,responsible
98 | Female,18,4,4,5,7,3,dependable
99 | Female,19,5,5,4,6,3,lively
100 | Male,19,2,5,3,6,4,serious
101 | Female,19,5,5,2,2,1,responsible
102 | Male,18,5,3,3,6,2,responsible
103 | Female,19,6,5,2,3,3,lively
104 | Male,27,7,5,6,7,3,dependable
105 | Male,17,6,5,4,7,5,dependable
106 | Female,21,4,6,3,5,2,lively
107 | Female,18,7,6,4,1,1,extraverted
108 | Female,17,7,4,7,3,7,responsible
109 | Female,19,5,1,5,1,5,lively
110 | Female,18,6,5,3,2,3,extraverted
111 | Male,22,7,5,3,6,3,dependable
112 | Female,19,5,5,6,3,2,serious
113 | Female,18,7,5,7,1,5,serious
114 | Female,17,7,4,4,6,4,lively
115 | Male,19,3,4,4,2,5,lively
116 | Male,18,2,6,6,7,5,extraverted
117 | Female,19,6,2,6,5,5,responsible
118 | Female,19,3,6,6,1,4,dependable
119 | Male,19,4,6,7,6,5,dependable
120 | Female,28,6,4,6,5,4,responsible
121 | Female,17,5,3,4,7,6,dependable
122 | Female,18,5,5,5,6,5,responsible
123 | Male,20,7,5,7,2,2,serious
124 | Female,18,4,5,5,6,3,serious
125 | Female,19,4,6,6,5,6,lively
126 | Female,19,5,3,6,5,2,serious
127 | Male,28,7,3,6,4,3,extraverted
128 | Female,17,2,6,3,6,1,serious
129 | Male,18,5,7,7,6,2,extraverted
130 | Male,20,7,2,4,5,2,responsible
131 | Female,18,3,1,6,5,2,responsible
132 | Female,19,5,3,4,5,3,lively
133 | Female,19,3,5,5,7,4,extraverted
134 | Female,21,7,2,3,3,5,responsible
135 | Female,18,5,5,4,5,3,serious
136 | Female,17,4,3,7,6,3,responsible
137 | Female,19,4,7,6,5,3,serious
138 | Female,18,3,7,6,1,6,serious
139 | Male,22,2,6,5,4,6,extraverted
140 | Male,19,6,2,6,6,3,extraverted
141 | Female,18,7,5,6,2,6,dependable
142 | Female,17,7,7,6,6,4,dependable
143 | Female,19,6,2,7,6,3,lively
144 | Female,18,5,3,6,7,7,lively
145 | Female,20,5,5,6,2,5,dependable
146 | Female,18,4,6,5,1,6,responsible
147 | Male,19,3,5,7,6,5,serious
148 | Female,19,5,2,5,4,4,serious
149 | Male,18,5,3,6,7,4,serious
150 | Female,17,6,3,5,5,7,extraverted
151 | Male,23,5,3,4,5,5,serious
152 | Female,19,3,4,7,7,7,extraverted
153 | Female,18,7,5,4,1,5,dependable
154 | Female,17,4,1,7,6,5,responsible
155 | Female,18,3,6,3,7,6,lively
156 | Female,19,6,4,3,1,7,extraverted
157 | Female,19,5,2,2,2,4,dependable
158 | Female,19,2,2,3,4,4,serious
159 | Male,18,6,3,2,3,4,responsible
160 | Female,19,4,6,6,5,4,extraverted
161 | Male,19,5,6,4,6,2,lively
162 | Male,18,2,5,3,7,1,serious
163 | Female,19,4,7,5,4,5,extraverted
164 | Female,17,4,7,4,7,3,dependable
165 | Female,19,1,1,5,5,6,dependable
166 | Female,19,7,6,6,5,7,dependable
167 | Female,19,5,7,7,7,4,responsible
168 | Male,18,6,7,5,4,1,dependable
169 | Female,19,7,4,4,4,6,responsible
170 | Male,27,5,5,6,6,7,lively
171 | Male,17,2,7,2,6,2,responsible
172 | Male,21,6,3,4,5,1,lively
173 | Female,18,6,3,5,3,2,extraverted
174 | Female,17,5,4,1,5,2,extraverted
175 | Male,19,5,3,1,3,3,responsible
176 | Female,18,5,5,2,6,4,serious
177 | Female,19,5,7,2,4,2,extraverted
178 | Female,19,5,4,2,1,5,lively
179 | Male,18,7,7,1,1,1,extraverted
180 | Female,19,6,2,2,7,4,extraverted
181 | Male,20,5,3,1,5,5,serious
182 | Female,19,5,7,1,6,6,serious
183 | Male,19,4,5,5,4,3,serious
184 | Female,18,5,3,4,6,2,responsible
185 | Female,19,6,1,5,4,5,serious
186 | Female,27,5,2,3,7,5,extraverted
187 | Female,23,6,7,3,7,7,lively
188 | Male,20,6,5,1,7,4,lively
189 | Male,25,5,7,1,3,6,extraverted
190 | Female,18,6,7,4,4,6,serious
191 | Male,21,5,5,2,7,1,dependable
192 | Male,22,3,4,7,6,5,serious
193 | Male,17,4,4,7,6,5,lively
194 | Female,20,4,5,3,4,1,responsible
195 | Male,18,6,3,1,5,7,lively
196 | Female,19,5,2,3,6,1,serious
197 | Male,19,4,5,5,7,5,extraverted
198 | Female,18,5,3,1,5,5,extraverted
199 | Female,18,2,7,1,4,4,responsible
200 | Male,20,6,6,1,2,2,lively
201 | Female,18,5,5,3,6,1,extraverted
202 | Male,19,5,5,2,7,4,dependable
203 | Male,19,4,7,4,6,4,responsible
204 | Male,17,6,2,1,6,6,serious
205 | Female,19,4,5,2,5,5,responsible
206 | Male,18,7,2,1,7,6,dependable
207 | Male,19,3,4,3,6,3,responsible
208 | Female,19,6,1,1,7,6,serious
209 | Female,18,2,5,7,7,7,dependable
210 | Male,22,6,1,2,7,4,serious
211 | Male,19,5,1,1,2,3,lively
212 | Female,18,5,5,6,6,5,extraverted
213 | Female,17,4,4,4,7,5,serious
214 | Female,19,4,1,1,3,5,dependable
215 | Male,18,4,3,3,7,7,serious
216 | Female,20,5,1,5,7,6,lively
217 | Female,23,5,5,5,7,6,extraverted
218 | Male,20,6,2,7,6,1,lively
219 | Female,25,6,1,4,6,4,responsible
220 | Female,18,4,1,2,7,5,responsible
221 | Female,21,6,1,5,7,7,extraverted
222 | Male,22,5,4,6,5,3,serious
223 | Male,19,7,2,1,6,4,extraverted
224 | Female,18,6,1,3,7,5,responsible
225 | Male,19,1,2,3,7,6,responsible
226 | Female,19,4,1,4,7,4,responsible
227 | Female,19,5,5,5,4,4,dependable
228 | Male,19,5,1,5,6,6,dependable
229 | Female,19,5,1,7,6,5,dependable
230 | Female,19,5,1,2,5,4,responsible
231 | Male,19,7,2,6,4,4,serious
232 | Male,19,6,7,6,6,4,extraverted
233 | Female,18,4,5,5,4,6,serious
234 | Male,17,3,4,3,1,5,lively
235 | Female,19,6,1,2,7,7,extraverted
236 | Male,18,7,2,4,6,5,extraverted
237 | Female,19,6,5,5,4,6,dependable
238 | Male,19,5,3,6,6,5,lively
239 | Male,19,2,1,5,6,6,lively
240 | Female,19,6,1,4,6,7,serious
241 | Female,19,5,1,3,7,5,responsible
242 | Male,19,5,3,2,7,7,dependable
243 | Female,19,5,1,3,5,4,responsible
244 | Male,19,3,4,2,4,6,extraverted
245 | Male,18,6,3,6,7,6,responsible
246 | Female,21,6,4,5,5,5,extraverted
247 | Female,22,5,1,1,7,6,serious
248 | Female,17,7,3,3,1,6,dependable
249 | Male,20,6,1,6,4,5,extraverted
250 | Male,18,5,7,6,5,6,extraverted
251 | Female,19,4,5,5,4,4,dependable
252 | Male,19,6,5,1,4,7,responsible
253 | Male,22,3,4,3,4,7,lively
254 | Male,19,5,7,2,6,5,serious
255 | Male,18,2,6,7,3,6,serious
256 | Female,19,5,6,3,4,7,serious
257 | Female,19,3,5,3,3,4,extraverted
258 | Male,19,5,6,5,6,1,dependable
259 | Female,19,7,3,3,5,5,responsible
260 | Male,23,4,3,6,2,6,dependable
261 | Female,20,3,4,7,6,4,lively
262 | Male,25,2,6,6,2,5,responsible
263 | Male,18,6,6,4,4,4,lively
264 | Female,21,6,6,4,7,5,extraverted
265 | Male,22,7,7,2,5,4,serious
266 | Male,17,4,7,7,3,5,responsible
267 | Female,25,5,5,5,4,5,responsible
268 | Female,26,1,5,4,6,5,dependable
269 | Male,27,1,5,2,7,3,dependable
270 | Male,20,4,2,3,5,5,serious
271 | Female,17,6,3,3,1,5,serious
272 | Female,19,6,1,6,4,6,serious
273 | Male,19,6,3,3,6,7,lively
274 | Male,21,7,2,4,6,4,serious
275 | Female,22,6,4,4,4,5,extraverted
276 | Male,23,3,3,2,3,7,responsible
277 | Male,21,4,4,1,6,6,lively
278 | Female,21,7,1,4,5,4,dependable
279 | Male,20,7,4,6,3,4,serious
280 | Female,20,6,5,1,3,5,lively
281 | Female,18,4,4,1,5,3,dependable
282 | Male,18,4,4,4,6,3,lively
283 | Male,19,5,4,3,5,6,dependable
284 | Male,18,4,3,3,5,3,serious
285 | Female,19,6,6,2,3,7,extraverted
286 | Male,20,6,6,6,3,3,dependable
287 | Male,21,6,2,2,7,5,lively
288 | Female,21,6,4,7,5,7,serious
289 | Male,25,7,7,5,6,7,extraverted
290 | Female,22,3,6,7,4,3,lively
291 | Male,17,5,2,7,5,1,lively
292 | Male,20,3,4,7,5,5,extraverted
293 | Female,18,5,5,5,7,5,dependable
294 | Female,19,5,6,7,4,5,serious
295 | Female,19,3,5,6,5,5,extraverted
296 | Male,18,3,5,2,5,2,responsible
297 | Female,18,5,4,6,7,5,serious
298 | Female,20,6,4,7,5,5,serious
299 | Male,18,7,4,3,6,5,responsible
300 | Male,17,5,4,6,7,1,lively
301 | Female,17,5,5,7,6,4,serious
302 | Male,20,6,6,5,4,5,serious
303 | Male,18,6,3,1,4,6,lively
304 | Female,19,3,5,3,5,4,serious
305 | Male,19,6,6,6,4,6,responsible
306 | Female,18,5,7,6,7,6,dependable
307 | Female,18,2,7,5,7,4,dependable
308 | Female,20,6,6,1,5,1,lively
309 | Male,18,6,7,3,1,5,extraverted
310 | Female,20,3,6,2,5,7,extraverted
311 | Male,18,7,7,7,6,2,lively
312 | Male,18,6,6,3,6,5,responsible
313 | Female,18,6,6,3,6,3,serious
314 | Female,18,5,5,7,5,6,serious
315 | Male,21,7,6,7,5,5,responsible
316 | Male,21,6,7,7,4,2,dependable
317 | Female,18,4,6,3,5,4,serious
318 | Male,18,6,5,5,4,5,extraverted
319 | Female,19,6,6,6,6,4,dependable
320 | Male,19,2,5,5,3,5,extraverted
321 | Female,18,5,4,6,4,5,lively
322 | Male,19,4,5,7,4,3,dependable
323 | Male,19,1,6,5,1,7,dependable
324 | Female,20,3,7,3,2,6,lively
325 | Male,22,5,6,7,5,4,responsible
326 | Male,21,4,6,7,6,5,lively
327 | Female,20,2,6,7,4,3,serious
328 | Male,17,3,7,6,3,5,serious
329 | Female,18,3,7,6,6,7,dependable
330 | Female,19,7,7,3,5,7,serious
331 | Female,17,6,7,3,7,5,extraverted
332 | Male,20,3,7,7,5,3,extraverted
333 | Female,17,4,4,5,2,3,lively
334 | Female,19,7,4,1,3,6,extraverted
335 | Male,19,6,5,5,6,5,responsible
336 | Female,21,4,5,7,7,4,extraverted
337 | Female,22,7,5,7,5,5,serious
338 | Male,26,1,6,3,6,6,lively
339 | Female,26,3,5,5,5,5,serious
340 | Male,24,5,4,5,7,5,serious
341 | Male,21,2,6,6,7,6,extraverted
342 | Female,20,4,5,2,2,3,extraverted
343 | Male,18,6,5,4,3,7,serious
344 | Male,19,1,5,4,7,4,dependable
345 | Male,17,3,3,2,6,4,lively
346 | Female,17,5,5,3,6,5,lively
347 | Female,21,2,3,6,7,5,dependable
348 | Male,20,4,7,3,5,1,lively
349 | Female,22,7,3,4,7,5,dependable
350 | Male,17,4,5,2,5,6,serious
351 | Male,20,6,4,5,7,5,extraverted
352 | Female,18,1,4,2,5,2,dependable
353 | Male,19,5,3,4,5,2,responsible
354 | Female,19,5,7,6,4,4,dependable
355 | Male,18,5,1,7,5,3,serious
356 | Male,20,7,4,7,6,5,serious
357 | Male,25,5,2,3,5,4,responsible
358 | Female,18,6,1,5,5,5,responsible
359 | Female,21,7,1,3,4,5,extraverted
360 | Male,22,6,2,2,4,5,dependable
361 | Female,17,4,4,5,4,5,lively
362 | Male,20,4,3,3,4,3,serious
363 | Female,18,5,4,3,4,6,serious
364 | Male,19,4,3,1,7,3,lively
365 | Male,19,7,4,4,3,6,responsible
366 | Male,18,7,4,3,2,6,responsible
367 | Female,18,5,8,1,7,4,extraverted
368 | Male,20,1,7,6,3,6,lively
369 | Male,17,5,5,4,5,3,lively
370 | Male,17,6,4,7,4,6,extraverted
371 | Female,18,6,6,5,3,1,dependable
372 | Female,19,6,2,7,1,2,dependable
373 | Male,26,5,6,3,5,4,serious
374 | Male,24,6,2,5,6,2,extraverted
375 | Female,21,1,6,6,2,6,dependable
376 | Male,20,4,6,6,3,4,lively
377 | Female,18,4,2,6,2,3,serious
378 | Male,19,6,3,4,4,5,extraverted
379 | Male,17,6,5,6,4,5,responsible
380 | Female,17,7,6,5,5,4,extraverted
381 | Female,17,7,5,7,2,3,extraverted
382 | Male,19,5,5,7,4,5,responsible
383 | Male,18,7,4,5,2,5,dependable
384 | Female,19,6,5,4,4,5,serious
385 | Male,19,6,5,7,4,5,lively
386 | Female,19,6,4,2,7,6,serious
387 | Male,21,6,6,7,3,6,extraverted
388 | Female,20,5,6,6,3,6,dependable
389 | Female,20,5,5,4,4,4,responsible
390 | Female,18,4,6,6,4,5,extraverted
391 | Male,25,6,4,4,6,6,serious
392 | Female,25,7,4,5,5,5,serious
393 | Male,17,3,7,1,5,7,responsible
394 | Male,21,5,5,6,6,4,lively
395 | Female,25,7,6,7,1,1,responsible
396 | Female,22,5,5,4,3,5,serious
397 | Male,17,6,3,7,1,4,dependable
398 | Female,20,5,6,6,4,4,dependable
399 | Male,23,1,3,5,6,4,serious
400 | Male,24,4,7,6,4,6,dependable
401 | Female,19,6,3,2,4,6,dependable
402 | Male,22,4,5,6,5,5,responsible
403 | Female,17,5,5,6,4,6,lively
404 | Male,20,1,2,7,6,4,dependable
405 | Male,18,3,3,6,5,3,responsible
406 | Female,19,4,4,7,5,6,serious
407 | Female,19,5,4,6,4,3,lively
408 | Male,18,2,5,7,6,7,dependable
409 | Male,18,7,5,6,2,6,serious
410 | Female,20,6,7,5,4,3,lively
411 | Female,18,3,5,3,5,6,responsible
412 | Female,17,3,5,6,3,4,responsible
413 | Male,17,5,4,5,2,7,extraverted
414 | Male,20,5,5,7,2,4,serious
415 | Female,18,4,5,7,4,7,lively
416 | Female,19,2,4,4,3,5,serious
417 | Female,19,6,4,7,5,7,lively
418 | Male,26,1,2,7,4,6,extraverted
419 | Male,27,1,6,7,4,4,lively
420 | Male,20,6,4,4,4,6,dependable
421 | Male,21,5,4,4,6,3,lively
422 | Female,18,6,1,7,6,5,dependable
423 | Male,19,3,3,4,4,3,responsible
424 | Female,20,4,5,2,6,2,responsible
425 | Female,20,4,4,4,4,6,responsible
426 | Male,24,7,2,4,3,4,serious
427 | Female,17,5,4,5,7,6,dependable
428 | Male,17,4,4,3,5,5,responsible
429 | Male,18,5,3,5,6,6,serious
430 | Female,19,4,2,1,5,6,serious
431 | Female,23,6,3,4,5,4,lively
432 | Female,24,5,3,5,5,5,serious
433 | Female,25,5,7,3,7,4,extraverted
434 | Male,18,4,5,6,5,5,responsible
435 | Male,19,5,4,5,1,3,responsible
436 | Female,19,6,1,3,6,6,extraverted
437 | Male,17,6,6,7,6,5,extraverted
438 | Female,18,4,6,3,5,4,serious
439 | Male,22,7,4,2,6,4,dependable
440 | Male,23,3,6,5,4,3,lively
441 | Female,21,4,2,3,5,6,responsible
442 | Female,20,4,4,6,4,3,lively
443 | Male,5,4,5,5,2,2,extraverted
444 | Male,25,5,5,5,4,6,extraverted
445 | Female,26,6,2,6,3,2,dependable
446 | Female,26,7,4,7,5,5,responsible
447 | Female,18,3,3,6,3,5,extraverted
448 | Male,19,2,4,7,6,6,responsible
449 | Male,20,2,2,4,7,3,extraverted
450 | Male,23,3,7,3,3,7,extraverted
451 | Male,18,5,4,5,5,1,lively
452 | Female,19,2,5,4,6,6,serious
453 | Male,17,3,6,6,1,6,serious
454 | Female,20,3,4,5,1,4,extraverted
455 | Female,25,4,6,4,5,6,dependable
456 | Male,24,5,6,3,3,4,responsible
457 | Male,26,5,6,6,2,3,lively
458 | Female,21,3,5,7,4,6,extraverted
459 | Female,5,2,5,3,2,7,responsible
460 | Male,23,5,7,1,3,4,extraverted
461 | Female,20,6,5,6,2,7,dependable
462 | Male,19,6,4,5,4,3,dependable
463 | Female,24,2,6,6,5,6,serious
464 | Male,24,4,5,5,6,4,responsible
465 | Male,27,6,6,5,3,6,dependable
466 | Male,28,1,5,6,2,5,serious
467 | Female,20,3,5,5,5,5,dependable
468 | Female,21,4,4,5,6,5,responsible
469 | Female,23,5,2,7,7,6,responsible
470 | Male,24,5,5,5,2,6,serious
471 | Female,25,3,2,4,4,3,lively
472 | Male,26,6,4,6,6,5,extraverted
473 | Male,27,7,5,5,1,5,dependable
474 | Male,19,4,6,4,2,7,extraverted
475 | Female,18,3,5,6,4,7,serious
476 | Female,20,4,5,5,2,5,serious
477 | Female,21,1,4,6,7,5,responsible
478 | Male,21,3,4,5,1,4,serious
479 | Male,21,3,4,5,2,7,serious
480 | Male,18,3,3,5,7,4,extraverted
481 | Female,23,5,1,1,5,5,extraverted
482 | Female,24,3,5,4,1,7,responsible
483 | Male,23,3,6,6,1,6,lively
484 | Male,25,7,2,5,5,6,responsible
485 | Male,19,3,3,3,5,4,dependable
486 | Female,19,2,2,5,4,4,extraverted
487 | Male,20,4,4,4,4,6,dependable
488 | Female,21,5,4,2,5,6,dependable
489 | Female,22,5,5,7,7,4,dependable
490 | Female,18,3,2,7,4,5,dependable
491 | Male,20,6,4,5,7,5,extraverted
492 | Male,23,7,5,4,6,4,lively
493 | Female,24,7,6,4,3,5,lively
494 | Female,26,4,7,5,7,3,extraverted
495 | Male,20,5,3,6,7,6,responsible
496 | Male,18,6,2,7,6,6,dependable
497 | Male,19,2,2,6,4,6,extraverted
498 | Female,21,5,3,4,5,6,dependable
499 | Male,21,1,1,3,6,6,serious
500 | Male,17,6,5,5,5,5,responsible
501 | Female,18,7,6,6,6,4,serious
502 | Female,23,5,2,7,6,6,extraverted
503 | Female,24,6,3,6,4,5,extraverted
504 | Male,23,5,2,3,4,6,serious
505 | Male,25,7,4,6,5,6,serious
506 | Female,19,5,4,6,4,6,lively
507 | Female,17,2,5,7,6,4,responsible
508 | Female,20,3,2,7,6,4,dependable
509 | Male,25,4,4,7,6,4,serious
510 | Male,20,5,2,4,5,7,lively
511 | Male,21,7,4,1,3,4,dependable
512 | Male,22,8,4,2,2,5,lively
513 | Female,20,7,7,7,7,2,extraverted
514 | Male,19,4,6,4,6,6,dependable
515 | Male,20,7,6,4,5,5,dependable
516 | Male,22,7,6,7,4,3,serious
517 | Female,19,4,4,5,5,4,lively
518 | Male,18,5,6,6,6,6,lively
519 | Female,17,5,6,5,7,4,extraverted
520 | Male,17,6,6,7,5,7,serious
521 | Male,21,5,7,5,6,7,lively
522 | Female,19,5,5,5,5,5,lively
523 | Male,22,6,7,5,6,3,serious
524 | Female,19,7,6,7,7,6,extraverted
525 | Male,21,6,6,6,6,6,serious
526 | Male,22,6,7,5,5,5,dependable
527 | Male,21,5,5,5,5,5,extraverted
528 | Male,17,4,6,7,3,3,extraverted
529 | Male,19,7,7,2,6,5,serious
530 | Female,21,6,7,4,4,2,responsible
531 | Male,19,5,6,6,4,3,responsible
532 | Female,21,4,6,3,3,3,extraverted
533 | Male,19,6,4,6,3,6,responsible
534 | Male,22,4,5,4,3,6,serious
535 | Female,21,5,5,5,5,5,responsible
536 | Male,17,5,3,3,4,4,extraverted
537 | Male,19,7,7,5,5,7,serious
538 | Male,19,7,5,6,6,5,serious
539 | Female,18,6,7,5,5,7,responsible
540 | Female,22,4,6,4,6,6,extraverted
541 | Female,26,6,5,6,4,5,lively
542 | Female,20,7,4,7,6,5,dependable
543 | Female,21,6,6,3,5,4,extraverted
544 | Male,23,6,5,5,6,3,extraverted
545 | Male,18,6,6,5,6,6,dependable
546 | Female,24,6,3,5,5,4,lively
547 | Male,18,5,7,3,6,4,extraverted
548 | Female,22,7,6,6,6,5,lively
549 | Male,18,1,6,6,7,5,responsible
550 | Female,20,7,7,5,7,3,dependable
551 | Female,21,7,3,7,7,3,dependable
552 | Female,18,6,5,4,5,5,serious
553 | Male,23,3,5,5,4,2,responsible
554 | Female,25,6,7,6,6,6,extraverted
555 | Female,18,7,5,6,6,4,lively
556 | Female,20,5,5,5,6,2,extraverted
557 | Male,23,6,5,7,6,4,dependable
558 | Male,21,5,6,5,5,3,serious
559 | Female,22,5,5,4,4,3,responsible
560 | Female,20,7,5,5,5,5,serious
561 | Male,18,6,4,3,6,2,lively
562 | Male,17,6,4,7,6,4,lively
563 | Female,19,3,4,5,5,1,responsible
564 | Female,18,4,4,4,6,1,extraverted
565 | Male,17,5,4,3,6,6,serious
566 | Male,23,7,7,4,4,5,extraverted
567 | Female,19,7,6,7,6,6,lively
568 | Male,18,7,5,6,4,3,serious
569 | Female,17,4,5,4,8,4,extraverted
570 | Male,22,6,6,5,4,4,dependable
571 | Female,19,7,8,5,4,7,lively
572 | Male,19,5,4,3,6,3,lively
573 | Male,19,3,7,2,6,5,serious
574 | Male,23,7,6,5,5,5,extraverted
575 | Female,19,7,7,4,5,2,responsible
576 | Male,19,6,6,4,8,6,dependable
577 | Female,18,7,5,5,4,4,lively
578 | Female,24,6,6,5,5,4,serious
579 | Female,17,7,6,5,4,4,responsible
580 | Female,19,5,6,6,7,4,dependable
581 | Male,19,6,5,5,6,4,lively
582 | Male,22,5,5,5,7,3,dependable
583 | Male,18,7,8,4,4,3,extraverted
584 | Male,18,7,6,8,5,7,extraverted
585 | Female,17,5,5,5,5,6,lively
586 | Male,24,5,5,4,4,4,dependable
587 | Female,18,6,6,5,6,4,responsible
588 | Female,18,7,4,7,7,4,serious
589 | Female,17,4,6,4,4,7,extraverted
590 | Male,24,7,4,5,5,5,dependable
591 | Female,19,5,5,5,5,6,lively
592 | Female,18,5,1,6,6,2,lively
593 | Male,18,3,6,3,3,7,responsible
594 | Male,22,7,5,7,5,2,lively
595 | Male,21,8,8,5,5,3,serious
596 | Female,21,6,5,4,7,2,responsible
597 | Female,18,6,4,4,6,5,lively
598 | Female,22,7,5,7,6,1,serious
599 | Female,19,6,3,7,4,4,dependable
600 | Female,18,4,6,4,4,4,serious
601 | Male,20,5,6,6,5,4,lively
602 | Female,20,6,7,6,5,4,responsible
603 | Female,18,5,5,5,4,6,dependable
604 | Male,18,6,5,4,4,3,extraverted
605 | Female,18,7,5,2,4,6,dependable
606 | Female,17,4,4,4,4,4,serious
607 | Male,21,5,8,5,6,4,lively
608 | Male,18,3,6,7,4,3,responsible
609 | Female,18,4,4,5,7,6,extraverted
610 | Male,23,5,5,4,6,3,lively
611 | Male,19,6,3,3,6,4,serious
612 | Male,23,5,5,2,2,1,responsible
613 | Male,18,6,6,3,6,2,responsible
614 | Female,19,6,5,4,5,3,lively
615 | Male,27,7,5,6,7,5,serious
616 | Female,19,6,5,4,7,5,dependable
617 | Female,21,5,5,3,5,2,lively
618 | Female,18,7,6,5,5,1,extraverted
619 | Female,17,7,4,7,3,5,serious
620 | Male,22,5,1,5,1,5,lively
621 | Female,18,5,7,3,2,3,extraverted
622 | Male,22,7,5,6,7,3,dependable
623 | Female,19,5,5,6,3,4,responsible
624 | Male,23,7,5,7,1,5,serious
625 | Female,17,6,6,4,6,4,lively
626 | Male,19,3,4,5,5,5,lively
627 | Male,18,2,6,6,7,7,dependable
628 | Male,23,6,2,6,5,5,responsible
629 | Female,19,5,5,5,1,4,dependable
630 | Male,19,4,6,5,7,5,dependable
631 | Female,28,6,4,6,5,6,lively
632 | Male,23,5,3,4,7,6,dependable
633 | Female,18,4,6,5,6,5,responsible
634 | Male,20,7,5,5,5,2,serious
635 | Female,18,4,5,5,6,4,dependable
636 | Male,22,4,6,6,5,6,lively
637 | Female,19,4,4,6,5,2,serious
638 | Male,28,7,3,5,5,3,extraverted
639 | Female,17,2,6,3,6,3,lively
640 | Female,22,5,7,7,6,2,extraverted
641 | Male,20,6,6,4,5,2,responsible
642 | Female,18,3,1,5,3,2,responsible
643 | Female,19,5,3,4,5,4,dependable
644 | Male,22,3,5,5,7,4,extraverted
645 | Female,21,4,6,3,3,5,responsible
646 | Female,18,5,5,5,6,3,serious
647 | Female,17,4,3,7,6,5,lively
648 | Male,20,4,7,6,5,3,serious
649 | Female,18,5,5,6,1,6,serious
650 | Male,22,2,6,7,2,6,extraverted
651 | Male,19,6,2,6,6,4,serious
652 | Male,21,7,5,6,2,6,dependable
653 | Female,17,6,6,6,6,4,dependable
654 | Female,19,6,2,6,7,3,lively
655 | Female,18,5,3,6,7,5,extraverted
656 | Male,19,5,5,6,2,5,dependable
657 | Female,18,6,5,5,1,6,responsible
658 | Male,19,3,5,6,8,5,serious
659 | Female,19,5,2,3,4,3,lively
660 | Female,22,5,3,6,7,4,serious
661 | Female,17,7,4,5,5,7,extraverted
662 | Male,23,5,3,6,6,5,serious
663 | Female,19,3,4,7,7,3,serious
664 | Male,20,7,5,4,1,5,dependable
665 | Female,17,4,1,6,5,5,responsible
666 | Female,18,3,6,3,7,4,serious
667 | Male,21,6,4,3,1,7,extraverted
668 | Female,19,7,3,2,2,4,dependable
669 | Female,19,2,2,5,5,4,serious
670 | Male,18,6,3,2,3,5,dependable
671 | Male,22,4,6,6,5,4,extraverted
672 | Male,19,6,5,4,6,2,lively
673 | Male,18,2,5,4,6,1,serious
674 | Female,19,4,7,5,4,4,responsible
675 | Male,21,4,7,4,7,3,dependable
676 | Female,19,5,5,5,5,6,lively
677 | Female,19,7,6,7,4,7,dependable
678 | Female,19,5,7,7,7,6,serious
679 | Female,22,6,7,5,4,1,dependable
680 | Female,19,6,6,4,4,6,responsible
681 | Male,27,5,5,7,5,7,lively
682 | Male,17,2,7,2,6,4,dependable
683 | Female,20,6,3,4,5,1,lively
684 | Female,18,5,5,5,3,2,extraverted
685 | Female,17,5,4,4,4,2,extraverted
686 | Male,19,5,3,1,3,5,lively
687 | Male,21,5,5,2,6,4,serious
688 | Female,19,6,6,2,4,2,extraverted
689 | Female,19,5,4,4,4,5,lively
690 | Male,18,7,7,1,1,4,dependable
691 | Male,22,6,2,2,7,4,extraverted
692 | Male,20,6,6,1,5,5,serious
693 | Female,19,5,7,5,5,6,serious
694 | Male,19,4,5,5,4,5,dependable
695 | Male,21,5,3,4,6,2,responsible
696 | Female,19,5,5,4,4,5,serious
697 | Female,27,5,2,5,5,5,extraverted
698 | Female,23,6,7,3,7,6,serious
699 | Female,18,6,5,1,7,4,lively
700 | Male,25,5,5,1,3,6,extraverted
701 | Female,18,6,7,5,5,6,serious
702 | Male,21,5,6,2,7,4,responsible
703 | Female,19,3,4,7,6,5,serious
704 | Male,17,5,5,7,6,5,lively
705 | Female,20,4,5,6,6,1,responsible
706 | Male,18,6,3,1,5,5,dependable
707 | Male,22,5,2,3,6,1,serious
708 | Male,19,5,6,5,7,5,extraverted
709 | Female,18,5,5,7,6,5,extraverted
710 | Female,20,7,9,9,5,5,dependable
711 | Male,17,5,4,5,2,4,serious
712 | Female,25,5,5,7,2,4,serious
713 | Female,18,6,2,7,4,7,serious
714 | Female,19,2,4,7,1,3,responsible
715 | Female,19,6,4,7,5,5,serious
716 | Female,24,1,2,7,4,6,extraverted
717 | Male,27,4,5,7,4,4,serious
718 | Male,20,6,4,5,6,6,serious
719 | Male,21,5,4,4,6,4,serious
720 | Male,20,6,1,7,6,5,serious
721 | Male,19,4,4,4,4,3,responsible
722 | Female,20,4,5,5,5,2,responsible
723 | Female,20,4,4,4,4,5,serious
724 | Female,19,7,2,4,3,4,lively
725 | Female,17,6,6,5,7,6,extraverted
726 | Male,17,5,4,6,6,5,serious
727 | Male,18,5,3,5,6,7,serious
728 | Male,23,4,2,1,5,6,serious
729 | Female,23,5,4,4,5,4,extraverted
730 | Female,24,5,3,7,3,5,serious
731 | Female,25,5,7,3,7,6,dependable
732 | Female,20,4,5,6,5,5,serious
733 | Male,19,6,6,5,1,3,extraverted
734 | Female,19,6,1,5,5,6,extraverted
735 | Male,17,6,6,7,6,4,serious
736 | Male,17,4,6,3,5,4,extraverted
737 | Male,22,6,8,2,6,4,dependable
738 | Male,23,3,6,6,7,3,serious
739 | Female,21,4,2,3,5,4,responsible
740 | Male,19,4,4,6,4,3,serious
741 | Male,24,6,2,5,2,2,lively
742 | Male,25,5,5,1,7,6,extraverted
743 | Female,26,6,2,6,3,3,lively
744 | Male,23,7,4,7,5,5,serious
745 | Female,18,4,4,6,3,5,serious
746 | Male,19,2,4,5,5,6,serious
747 | Male,20,2,2,4,7,5,serious
748 | Female,17,3,7,3,3,7,extraverted
749 | Female,21,5,4,6,1,5,serious
750 | Male,18,5,4,6,2,1,responsible
751 | Female,19,2,5,4,6,3,responsible
752 | Female,22,3,6,6,1,6,serious
753 | Female,20,8,2,5,1,4,extraverted
754 | Female,25,4,6,6,3,6,dependable
755 | Male,24,5,6,3,3,8,serious
756 | Female,17,5,6,6,2,3,responsible
757 | Female,21,5,6,7,4,6,dependable
758 | Female,25,2,5,4,4,7,serious
759 | Male,23,5,7,1,3,6,extraverted
760 | Male,17,6,5,6,2,7,serious
761 | Male,19,5,5,5,4,3,serious
762 | Female,24,2,6,7,4,6,serious
763 | Male,24,4,5,5,6,2,lively
764 | Female,19,6,6,5,3,6,extraverted
765 | Male,28,4,7,6,2,5,serious
766 | Female,20,3,5,3,8,5,extraverted
767 | Female,21,4,4,5,6,4,serious
768 | Male,19,5,2,7,7,6,serious
769 | Male,24,6,4,5,2,6,serious
770 | Female,25,3,2,7,2,3,responsible
771 | Male,26,6,4,6,6,4,serious
772 | Female,21,7,5,5,1,5,dependable
773 | Male,19,5,5,4,2,7,serious
774 | Female,18,3,5,4,8,7,serious
775 | Female,20,4,5,5,2,4,responsible
776 | Male,19,1,4,6,7,5,serious
777 | Male,21,5,6,5,1,4,serious
778 | Male,21,3,4,6,4,7,serious
779 | Male,18,3,3,5,7,5,serious
780 | Male,19,5,1,1,5,5,serious
781 | Female,24,6,4,4,1,7,serious
782 | Male,23,3,6,5,5,6,serious
783 | Male,25,7,2,5,5,5,serious
784 | Female,23,3,3,3,5,4,responsible
785 | Female,19,4,6,5,4,4,extraverted
786 | Male,20,4,4,5,7,6,serious
787 | Female,21,5,4,2,5,8,serious
788 | Male,19,5,5,7,7,4,serious
789 | Female,18,5,7,7,4,5,extraverted
790 | Male,20,6,4,7,6,5,serious
791 | Male,23,7,5,4,6,6,serious
792 | Male,19,7,6,4,3,5,extraverted
793 | Female,26,5,6,5,7,3,extraverted
794 | Male,20,5,3,7,8,6,serious
795 | Male,18,6,2,7,6,4,lively
796 | Female,23,2,2,6,4,6,serious
797 | Female,21,4,3,4,5,6,serious
798 | Male,21,1,1,6,5,6,serious
799 | Female,17,6,3,5,6,4,serious
800 | Male,24,4,4,4,5,6,dependable
801 | Female,19,6,3,2,4,3,responsible
802 | Female,22,5,5,5,5,6,responsible
803 | Female,21,5,3,6,8,6,serious
804 | Female,20,6,2,5,6,7,serious
805 | Male,23,3,6,6,4,3,serious
806 | Male,19,5,4,4,5,5,serious
807 | Female,23,5,6,6,6,3,extraverted
808 | Female,18,5,5,8,6,5,serious
809 | Female,18,4,5,6,5,6,serious
810 | Female,24,6,5,5,6,3,extraverted
811 | Female,18,2,7,1,4,8,extraverted
812 | Female,23,6,6,1,2,2,extraverted
813 | Female,18,7,4,3,6,1,extraverted
814 | Male,19,5,5,4,6,4,dependable
815 | Male,19,4,7,4,6,8,serious
816 | Female,22,6,2,1,6,6,serious
817 | Female,19,5,6,2,5,5,extraverted
818 | Male,18,7,2,7,3,6,dependable
819 | Male,19,3,4,3,6,5,serious
820 | Male,20,6,1,1,7,6,serious
821 | Female,18,4,6,7,7,7,serious
822 | Male,22,6,1,5,6,4,lively
823 | Male,19,5,1,1,2,8,serious
824 | Male,25,5,5,6,6,5,extraverted
825 | Female,17,6,6,4,7,5,extraverted
826 | Female,19,4,1,5,7,5,serious
827 | Male,18,4,3,3,7,4,serious
828 | Male,17,5,1,5,7,6,serious
829 | Female,23,6,7,5,7,6,extraverted
830 | Male,20,6,2,5,8,1,lively
831 | Female,25,6,1,4,6,3,lively
832 | Male,20,4,1,2,7,5,responsible
833 | Female,21,7,4,5,7,7,serious
834 | Male,22,5,4,7,5,3,lively
835 | Male,19,7,2,1,6,5,serious
836 | Male,20,6,1,3,7,5,serious
837 | Male,19,5,5,3,7,6,responsible
838 | Female,19,4,1,6,6,4,responsible
839 | Female,19,5,5,5,4,6,serious
840 | Female,22,5,1,5,6,6,dependable
841 | Female,19,6,6,7,6,5,dependable
842 | Male,24,5,1,2,5,4,serious
843 | Male,19,6,6,6,4,4,serious
844 | Male,19,6,7,7,4,4,dependable
845 | Female,18,4,5,5,4,5,responsible
846 | Female,22,3,4,3,1,5,responsible
847 | Female,19,5,5,2,7,7,extraverted
848 | Male,18,7,2,5,5,5,serious
849 | Female,19,6,5,5,4,7,serious
850 | Female,22,5,3,6,6,5,serious
851 | Male,19,5,5,5,6,6,serious
852 | Female,19,6,1,7,3,7,serious
853 | Female,19,5,1,3,7,6,serious
854 | Female,25,5,3,2,7,7,dependable
855 | Female,19,6,4,3,5,4,extraverted
856 | Male,19,3,4,5,6,6,serious
857 | Male,18,6,3,6,7,5,serious
858 | Male,26,6,4,5,5,5,serious
859 | Female,22,4,4,1,7,6,serious
860 | Female,17,7,3,5,3,6,serious
861 | Male,20,6,1,6,4,4,lively
862 | Female,23,5,7,6,5,6,extraverted
863 | Female,19,5,6,5,4,4,extraverted
864 | Male,19,6,5,4,5,7,responsible
865 | Male,22,3,4,3,4,3,responsible
866 | Female,21,5,7,2,6,5,extraverted
867 | Male,18,3,5,7,3,6,serious
868 | Female,19,5,6,4,2,7,serious
869 | Female,19,3,5,3,3,2,responsible
870 | Female,20,5,6,5,6,1,extraverted
871 | Female,19,5,4,3,5,5,serious
872 | Male,23,4,3,2,6,6,dependable
873 | Female,20,3,4,7,6,6,serious
874 | Female,17,2,6,6,2,5,responsible
875 | Male,18,4,4,4,4,4,lively
876 | Female,21,6,6,5,6,5,extraverted
877 | Male,22,7,7,2,5,7,responsible
878 | Female,19,4,7,7,3,5,extraverted
879 | Female,25,3,3,5,4,5,serious
880 | Female,26,1,5,5,5,5,serious
881 | Male,27,1,5,2,7,6,serious
882 | Female,18,4,2,3,5,5,responsible
883 | Female,17,5,5,3,1,5,responsible
884 | Female,19,6,1,5,5,6,serious
885 | Male,19,6,3,3,6,5,serious
886 | Female,23,7,2,4,6,4,lively
887 | Female,22,7,3,4,4,5,serious
888 | Male,23,3,3,5,4,7,responsible
889 | Male,21,4,4,1,6,4,serious
890 | Male,17,7,1,4,5,4,lively
891 | Male,20,5,6,6,3,4,serious
892 | Female,20,6,5,4,4,5,extraverted
893 | Female,18,4,4,1,5,6,extraverted
894 | Female,24,4,4,4,6,3,extraverted
895 | Male,19,7,3,3,5,6,serious
896 | Male,18,4,3,6,6,3,serious
897 | Female,19,6,6,2,3,5,extraverted
898 | Female,23,6,6,6,3,3,extraverted
899 | Male,21,5,5,2,7,5,serious
900 | Female,21,6,4,6,6,5,serious
901 | Male,25,7,7,5,6,6,extraverted
902 | Male,18,3,6,7,4,3,lively
903 | Male,17,7,5,7,5,1,lively
904 | Male,20,3,4,6,6,5,serious
905 | Female,18,5,5,5,7,4,extraverted
906 | Male,24,5,6,7,4,5,serious
907 | Female,19,6,6,6,5,5,extraverted
908 | Male,18,3,5,4,4,2,responsible
909 | Female,18,5,4,6,7,4,dependable
910 | Male,21,6,4,7,5,5,serious
911 | Male,18,4,6,3,6,5,serious
912 | Male,17,5,4,5,8,1,lively
913 | Female,17,5,4,6,7,5,extraverted
914 | Female,21,5,5,7,6,4,serious
915 | Male,20,7,5,5,4,5,serious
916 | Male,18,6,3,6,6,6,serious
917 | Female,19,3,5,3,5,5,extraverted
918 | Female,23,6,6,6,4,6,responsible
919 | Male,18,8,3,6,7,6,serious
920 | Female,18,2,7,6,6,4,extraverted
921 | Female,20,6,6,1,5,5,responsible
922 | Male,24,6,7,3,1,5,extraverted
923 | Female,20,5,8,2,5,7,extraverted
924 | Male,18,7,7,8,4,2,lively
925 | Male,18,6,6,3,6,6,dependable
926 | Male,23,6,6,3,6,3,extraverted
927 | Female,18,7,7,7,5,6,dependable
928 | Male,21,7,6,6,6,5,serious
929 | Male,21,6,7,7,4,5,dependable
930 | Male,22,4,6,3,5,4,lively
931 | Male,18,5,7,5,4,5,extraverted
932 | Female,19,6,6,5,4,4,dependable
933 | Male,19,2,5,5,3,7,serious
934 | Male,23,5,4,6,4,5,serious
935 | Male,19,7,8,7,4,3,extraverted
936 | Male,19,1,6,7,8,7,serious
937 | Female,20,3,7,3,2,5,extraverted
938 | Female,18,5,6,7,5,4,responsible
939 | Male,21,6,7,7,6,5,serious
940 | Female,20,2,6,5,5,3,extraverted
941 | Male,17,3,7,6,3,7,serious
942 | Male,22,3,7,6,6,7,serious
943 | Female,19,6,6,3,5,7,serious
944 | Female,17,6,7,4,4,5,extraverted
945 | Male,20,3,7,7,5,6,serious
946 | Male,22,4,4,5,2,3,serious
947 | Female,19,6,8,1,3,6,extraverted
948 | Male,19,6,5,6,7,5,serious
949 | Female,21,4,5,7,7,5,serious
950 | Male,18,7,5,7,5,5,serious
951 | Male,26,2,5,3,6,6,serious
952 | Female,26,3,6,6,6,5,extraverted
953 | Male,24,5,4,5,7,8,serious
954 | Female,18,2,6,6,7,6,extraverted
955 | Female,20,5,6,2,2,3,extraverted
956 | Male,18,6,5,5,5,7,serious
957 | Male,19,1,5,4,7,6,serious
958 | Female,22,3,3,2,6,4,responsible
959 | Female,17,6,6,3,6,5,extraverted
960 | Female,21,2,3,7,8,5,serious
961 | Male,20,4,7,3,5,4,responsible
962 | Male,19,7,3,4,7,5,serious
963 | Male,17,6,6,2,5,6,extraverted
964 | Male,20,6,4,8,5,5,serious
965 | Female,18,1,4,2,5,5,lively
966 | Female,22,5,3,4,5,2,responsible
967 | Female,19,6,8,6,4,4,extraverted
968 | Male,18,5,1,6,6,3,lively
969 | Male,20,7,4,7,6,7,serious
970 | Female,19,6,2,3,5,4,responsible
971 | Female,5,5,5,5,5,5,responsible
972 | Female,21,7,1,7,8,5,lively
973 | Male,22,6,2,2,4,4,dependable
974 | Male,19,4,4,5,4,5,serious
975 | Male,20,5,5,3,4,3,serious
976 | Female,18,5,4,4,6,6,serious
977 | Male,19,4,3,1,7,5,serious
978 | Female,22,7,4,4,3,6,responsible
979 | Male,18,6,6,3,2,6,serious
980 | Female,18,5,8,5,5,4,extraverted
981 | Male,20,1,7,6,3,7,serious
982 | Female,22,5,5,4,5,3,lively
983 | Male,17,3,2,7,4,6,serious
984 | Female,18,6,6,8,2,1,responsible
985 | Female,19,6,2,7,1,4,responsible
986 | Female,21,5,6,3,5,4,serious
987 | Male,24,4,6,5,6,2,extraverted
988 | Female,21,1,6,7,4,6,serious
989 | Male,20,4,6,6,3,6,serious
990 | Male,19,4,2,6,2,3,responsible
991 | Male,19,7,7,4,4,5,extraverted
992 | Male,17,6,5,5,5,5,responsible
993 | Female,17,7,6,5,5,5,extraverted
994 | Male,22,7,5,7,2,3,lively
995 | Female,17,6,7,7,4,5,responsible
996 | Male,18,6,6,7,6,5,serious
997 | Female,19,6,5,5,6,4,extraverted
998 | Female,23,6,5,7,4,3,extraverted
999 | Male,20,7,7,2,7,6,extraverted
1000 | Male,21,5,8,5,6,6,extraverted
1001 | Female,20,5,6,4,6,7,extraverted
1002 | Female,20,5,5,4,4,5,lively
1003 | Male,19,4,6,6,4,5,serious
1004 | Male,25,5,8,4,6,6,extraverted
1005 | Female,25,7,4,3,8,5,extraverted
1006 | Male,17,3,7,1,5,5,extraverted
1007 | Female,18,5,5,6,6,4,extraverted
1008 | Female,25,5,8,7,1,1,extraverted
1009 | Female,22,6,5,5,7,5,extraverted
1010 | Male,17,6,3,7,1,8,serious
1011 | Male,18,5,6,6,4,4,serious
1012 | Male,23,4,4,5,6,4,serious
1013 | Male,24,4,7,7,3,6,serious
1014 | Female,19,6,3,2,4,8,serious
1015 | Female,19,4,5,6,5,5,serious
1016 | Female,17,6,3,6,4,6,serious
1017 | Male,20,1,2,5,8,4,serious
1018 | Male,18,3,3,6,5,5,serious
1019 | Male,22,4,4,7,5,6,serious
1020 | Female,19,6,5,6,4,3,extraverted
1021 | Male,18,2,5,8,3,7,dependable
1022 | Male,18,7,5,6,2,7,serious
1023 | Male,23,6,7,5,4,3,extraverted
1024 | Female,18,5,7,3,5,6,extraverted
1025 |
--------------------------------------------------------------------------------