├── 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 |
20 |

Audio constraints options

21 |

22 | Echo cancellation: 23 |

24 |

25 | Noise Suppression: 26 |

27 |

28 | Auto gain control : 29 |

30 |
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 |
23 |
24 |
25 |

Applicant Name

26 | 27 | 28 | 29 | 30 |
31 | 32 |

Email

33 | 34 | 35 |

Age

36 | 37 | 38 |

Gender

39 | 43 | 47 | 48 |

Upload Resume

49 | 50 | 51 |
52 |

Give rating 1 to 10 to following questions

53 |
54 | 55 | 56 |

enjoy new experince or thing(openness)

57 | 58 |

how often you feel negativity(neuroticism)

59 | 60 |

wishing to do one's work well and thoroughhly(conscientiousness)

61 | 62 |

how much would you like work with your peers(agreeableness)

63 | 64 |

how outgoing and social interaction you like(extraversion)

65 | 66 | 67 | 68 | 69 |
70 |
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 | Tone Analysis 18 |

Tone Analysis

19 |
20 | 21 |
22 | Emotion Analysis 23 |

Face Emotion Analysis

24 |
25 |
26 | 27 |
28 |
29 |
30 |
42 |
43 | {{output['Name']}}

{{output['Age']}}

44 |
45 |
46 |
47 |
48 | 49 |
50 |
51 | 52 |
53 |
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 |
17 |
18 |

Technical Department

19 |

Software Development Engineer

20 |
21 |
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 | 25 | 30 |
31 |
32 | 60 | 87 |
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 | ![mysql](screenshots/mysql.PNG) 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 | ![s3-bucket](screenshots/s3.PNG) 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 | ![project](screenshots/structure.PNG) 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 | ![signup](screenshots/firstpg.png) 209 | 210 | ### Personality Prediction page 211 | 212 | ![basicinfo](screenshots/pred.png) 213 | 214 | ### Streaming Interview of the candidate 215 | 216 | ![video-stream](screenshots/stream.png) 217 | 218 | ### 'Thankyou for Taking Interview' Response page 219 | 220 | ![thankyou](screenshots/thank-resp.PNG) 221 | 222 | ### Interviewer Sign In page 223 | 224 | ![signin](screenshots/firstpg(2).png) 225 | 226 | ### Track candidates 227 | 228 | ![profiles](screenshots/profiles.PNG) 229 | 230 | ### Concise insights and summary of candidate profile 231 | 232 | ![summary](screenshots/info.PNG) 233 | 234 | ![summary](screenshots/info-2.PNG) 235 | 236 | ### One-click mail to candidate 237 | 238 | ![inform](screenshots/mailsent.png) 239 | 240 | ### Mail to candidate 241 | 242 | ![email](screenshots/email.PNG) 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 | --------------------------------------------------------------------------------