├── Dockerfile
├── web
├── src
│ ├── assets
│ │ ├── .gitkeep
│ │ └── images
│ │ │ └── login.jpg
│ ├── app
│ │ ├── app.component.css
│ │ ├── components
│ │ │ ├── signup
│ │ │ │ ├── signup.component.css
│ │ │ │ ├── signup.component.html
│ │ │ │ ├── signup.component.ts
│ │ │ │ └── signup.component.spec.ts
│ │ │ ├── navbar
│ │ │ │ ├── navbar.component.css
│ │ │ │ ├── navbar.component.ts
│ │ │ │ ├── navbar.component.spec.ts
│ │ │ │ └── navbar.component.html
│ │ │ ├── dashboard
│ │ │ │ ├── table
│ │ │ │ │ ├── table.component.css
│ │ │ │ │ ├── table.component.spec.ts
│ │ │ │ │ ├── table.component.ts
│ │ │ │ │ └── table.component.html
│ │ │ │ ├── dashboard.component.spec.ts
│ │ │ │ ├── dashboard.component.css
│ │ │ │ ├── dashboard.component.ts
│ │ │ │ └── dashboard.component.html
│ │ │ ├── login
│ │ │ │ ├── login.component.ts
│ │ │ │ ├── login.component.spec.ts
│ │ │ │ ├── login.component.css
│ │ │ │ └── login.component.html
│ │ │ └── show-resume
│ │ │ │ ├── show-resume.component.spec.ts
│ │ │ │ ├── show-resume.component.css
│ │ │ │ ├── show-resume.component.html
│ │ │ │ └── show-resume.component.ts
│ │ ├── app.component.html
│ │ ├── app.component.ts
│ │ ├── services
│ │ │ ├── resume-api.service.spec.ts
│ │ │ └── resume-api.service.ts
│ │ ├── app-routing.module.ts
│ │ ├── app.component.spec.ts
│ │ ├── app.module.ts
│ │ └── material.module.ts
│ ├── environments
│ │ ├── environment.prod.ts
│ │ └── environment.ts
│ ├── favicon.ico
│ ├── styles.css
│ ├── main.ts
│ ├── test.ts
│ ├── index.html
│ └── polyfills.ts
├── e2e
│ ├── tsconfig.json
│ ├── src
│ │ ├── app.po.ts
│ │ └── app.e2e-spec.ts
│ └── protractor.conf.js
├── .editorconfig
├── tsconfig.app.json
├── tsconfig.spec.json
├── browserslist
├── tsconfig.json
├── .gitignore
├── README.md
├── karma.conf.js
├── package.json
├── tslint.json
└── angular.json
├── .gitignore
├── backend
├── .babelrc
├── .env
├── routes
│ ├── index.js
│ └── resume.js
├── schema
│ └── resume.js
├── app.js
└── package.json
├── dataset
├── Vidit.pdf
├── Profile (1).pdf
├── Profile (2).pdf
├── Profile (3).pdf
├── Profile (4).pdf
├── Profile (5).pdf
├── Profile (6).pdf
├── Profile (7).pdf
├── Profile (8).pdf
├── Profile (9).pdf
├── Profile (10).pdf
├── Profile (11).pdf
├── Profile (12).pdf
├── Profile (13).pdf
├── Profile (14).pdf
├── Profile (15).pdf
├── Profile (16).pdf
├── Profile (17).pdf
├── Profile (18).pdf
├── Profile (19).pdf
├── Profile (20).pdf
├── Profile (21).pdf
├── Profile (22).pdf
├── Profile (23).pdf
├── Profile (24).pdf
├── Profile (25).pdf
├── Profile (26).pdf
├── Profile (27).pdf
├── Profile (28).pdf
├── Profile (29).pdf
├── Profile (30).pdf
├── Profile (31).pdf
├── Profile (32).pdf
├── Profile (33).pdf
├── Profile (34).pdf
├── Profile (35).pdf
├── Profile (36).pdf
├── Profile (37).pdf
├── Profile (38).pdf
├── Profile (39).pdf
├── Profile (40).pdf
├── Profile (41).pdf
├── Profile (42).pdf
├── Profile (43).pdf
├── Profile (44).pdf
├── Profile (45).pdf
├── Profile (46).pdf
├── Profile (47).pdf
├── Profile (48).pdf
├── Profile (49).pdf
├── Profile (50).pdf
├── Profile (51).pdf
├── Profile (52).pdf
├── Profile (53).pdf
├── Profile (54).pdf
├── Profile (55).pdf
├── linsam _ CakeResume.pdf
├── Justin Yang _ CakeResume.pdf
└── Richard Chen _ CakeResume.pdf
├── researchPaper.docx
├── nlp
├── __pycache__
│ ├── resumeParser.cpython-36.pyc
│ └── resumeParser.cpython-37.pyc
├── clustering
│ ├── __pycache__
│ │ ├── clustering.cpython-36.pyc
│ │ └── clustering.cpython-37.pyc
│ ├── vector.py
│ └── clustering.py
├── requirements.txt
├── db.py
├── app.py
└── resumeParser.py
├── upload.py
├── README.md
└── testJob Description
/Dockerfile:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/src/assets/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/src/app/app.component.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/src/app/components/signup/signup.component.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/src/app/app.component.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/src/app/components/signup/signup.component.html:
--------------------------------------------------------------------------------
1 |
signup works!
2 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | backend/node_modules
2 | nlp/clustering/2
3 | web/node_modules
4 | backend/.env
--------------------------------------------------------------------------------
/backend/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | "@babel/preset-env"
4 | ]
5 | }
6 |
--------------------------------------------------------------------------------
/web/src/app/components/navbar/navbar.component.css:
--------------------------------------------------------------------------------
1 | .user-cont{
2 | padding-right: 10px;
3 | }
--------------------------------------------------------------------------------
/dataset/Vidit.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Vidit.pdf
--------------------------------------------------------------------------------
/researchPaper.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/researchPaper.docx
--------------------------------------------------------------------------------
/web/src/environments/environment.prod.ts:
--------------------------------------------------------------------------------
1 | export const environment = {
2 | production: true
3 | };
4 |
--------------------------------------------------------------------------------
/web/src/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/web/src/favicon.ico
--------------------------------------------------------------------------------
/backend/.env:
--------------------------------------------------------------------------------
1 | DBURI=mongodb+srv://M44:admin123@cluster0-nfbuw.mongodb.net/resume?retryWrites=true&w=majority
2 |
--------------------------------------------------------------------------------
/dataset/Profile (1).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (1).pdf
--------------------------------------------------------------------------------
/dataset/Profile (2).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (2).pdf
--------------------------------------------------------------------------------
/dataset/Profile (3).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (3).pdf
--------------------------------------------------------------------------------
/dataset/Profile (4).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (4).pdf
--------------------------------------------------------------------------------
/dataset/Profile (5).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (5).pdf
--------------------------------------------------------------------------------
/dataset/Profile (6).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (6).pdf
--------------------------------------------------------------------------------
/dataset/Profile (7).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (7).pdf
--------------------------------------------------------------------------------
/dataset/Profile (8).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (8).pdf
--------------------------------------------------------------------------------
/dataset/Profile (9).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (9).pdf
--------------------------------------------------------------------------------
/dataset/Profile (10).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (10).pdf
--------------------------------------------------------------------------------
/dataset/Profile (11).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (11).pdf
--------------------------------------------------------------------------------
/dataset/Profile (12).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (12).pdf
--------------------------------------------------------------------------------
/dataset/Profile (13).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (13).pdf
--------------------------------------------------------------------------------
/dataset/Profile (14).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (14).pdf
--------------------------------------------------------------------------------
/dataset/Profile (15).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (15).pdf
--------------------------------------------------------------------------------
/dataset/Profile (16).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (16).pdf
--------------------------------------------------------------------------------
/dataset/Profile (17).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (17).pdf
--------------------------------------------------------------------------------
/dataset/Profile (18).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (18).pdf
--------------------------------------------------------------------------------
/dataset/Profile (19).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (19).pdf
--------------------------------------------------------------------------------
/dataset/Profile (20).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (20).pdf
--------------------------------------------------------------------------------
/dataset/Profile (21).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (21).pdf
--------------------------------------------------------------------------------
/dataset/Profile (22).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (22).pdf
--------------------------------------------------------------------------------
/dataset/Profile (23).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (23).pdf
--------------------------------------------------------------------------------
/dataset/Profile (24).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (24).pdf
--------------------------------------------------------------------------------
/dataset/Profile (25).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (25).pdf
--------------------------------------------------------------------------------
/dataset/Profile (26).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (26).pdf
--------------------------------------------------------------------------------
/dataset/Profile (27).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (27).pdf
--------------------------------------------------------------------------------
/dataset/Profile (28).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (28).pdf
--------------------------------------------------------------------------------
/dataset/Profile (29).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (29).pdf
--------------------------------------------------------------------------------
/dataset/Profile (30).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (30).pdf
--------------------------------------------------------------------------------
/dataset/Profile (31).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (31).pdf
--------------------------------------------------------------------------------
/dataset/Profile (32).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (32).pdf
--------------------------------------------------------------------------------
/dataset/Profile (33).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (33).pdf
--------------------------------------------------------------------------------
/dataset/Profile (34).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (34).pdf
--------------------------------------------------------------------------------
/dataset/Profile (35).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (35).pdf
--------------------------------------------------------------------------------
/dataset/Profile (36).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (36).pdf
--------------------------------------------------------------------------------
/dataset/Profile (37).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (37).pdf
--------------------------------------------------------------------------------
/dataset/Profile (38).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (38).pdf
--------------------------------------------------------------------------------
/dataset/Profile (39).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (39).pdf
--------------------------------------------------------------------------------
/dataset/Profile (40).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (40).pdf
--------------------------------------------------------------------------------
/dataset/Profile (41).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (41).pdf
--------------------------------------------------------------------------------
/dataset/Profile (42).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (42).pdf
--------------------------------------------------------------------------------
/dataset/Profile (43).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (43).pdf
--------------------------------------------------------------------------------
/dataset/Profile (44).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (44).pdf
--------------------------------------------------------------------------------
/dataset/Profile (45).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (45).pdf
--------------------------------------------------------------------------------
/dataset/Profile (46).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (46).pdf
--------------------------------------------------------------------------------
/dataset/Profile (47).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (47).pdf
--------------------------------------------------------------------------------
/dataset/Profile (48).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (48).pdf
--------------------------------------------------------------------------------
/dataset/Profile (49).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (49).pdf
--------------------------------------------------------------------------------
/dataset/Profile (50).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (50).pdf
--------------------------------------------------------------------------------
/dataset/Profile (51).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (51).pdf
--------------------------------------------------------------------------------
/dataset/Profile (52).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (52).pdf
--------------------------------------------------------------------------------
/dataset/Profile (53).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (53).pdf
--------------------------------------------------------------------------------
/dataset/Profile (54).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (54).pdf
--------------------------------------------------------------------------------
/dataset/Profile (55).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Profile (55).pdf
--------------------------------------------------------------------------------
/dataset/linsam _ CakeResume.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/linsam _ CakeResume.pdf
--------------------------------------------------------------------------------
/web/src/assets/images/login.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/web/src/assets/images/login.jpg
--------------------------------------------------------------------------------
/dataset/Justin Yang _ CakeResume.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Justin Yang _ CakeResume.pdf
--------------------------------------------------------------------------------
/dataset/Richard Chen _ CakeResume.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/dataset/Richard Chen _ CakeResume.pdf
--------------------------------------------------------------------------------
/nlp/__pycache__/resumeParser.cpython-36.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/nlp/__pycache__/resumeParser.cpython-36.pyc
--------------------------------------------------------------------------------
/nlp/__pycache__/resumeParser.cpython-37.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/nlp/__pycache__/resumeParser.cpython-37.pyc
--------------------------------------------------------------------------------
/nlp/clustering/__pycache__/clustering.cpython-36.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/nlp/clustering/__pycache__/clustering.cpython-36.pyc
--------------------------------------------------------------------------------
/nlp/clustering/__pycache__/clustering.cpython-37.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/viditkhemka63/Resume-screening/HEAD/nlp/clustering/__pycache__/clustering.cpython-37.pyc
--------------------------------------------------------------------------------
/web/src/styles.css:
--------------------------------------------------------------------------------
1 | /* You can add global styles to this file, and also import other style files */
2 |
3 | html, body { height: 100%; }
4 | body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; }
5 |
--------------------------------------------------------------------------------
/backend/routes/index.js:
--------------------------------------------------------------------------------
1 | import express from 'express';
2 | var router = express.Router();
3 |
4 | /* GET home page. */
5 | router.get('/', function(req, res, next) {
6 | res.json({"message": "Hello World"})
7 |
8 | });
9 |
10 | module.exports = router;
11 |
--------------------------------------------------------------------------------
/web/src/app/app.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-root',
5 | templateUrl: './app.component.html',
6 | styleUrls: ['./app.component.css']
7 | })
8 | export class AppComponent {
9 | title = 'web';
10 | }
11 |
--------------------------------------------------------------------------------
/web/src/app/components/dashboard/table/table.component.css:
--------------------------------------------------------------------------------
1 | table {
2 | width: 100%;
3 | }
4 |
5 | th.mat-sort-header-sorted {
6 | color: black;
7 | }
8 |
9 | .menu-container{
10 | padding-left: 20px;
11 | }
12 |
13 | .my-primary{
14 | color: #00695C;
15 | }
--------------------------------------------------------------------------------
/web/e2e/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../tsconfig.json",
3 | "compilerOptions": {
4 | "outDir": "../out-tsc/e2e",
5 | "module": "commonjs",
6 | "target": "es5",
7 | "types": [
8 | "jasmine",
9 | "jasminewd2",
10 | "node"
11 | ]
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/web/.editorconfig:
--------------------------------------------------------------------------------
1 | # Editor configuration, see https://editorconfig.org
2 | root = true
3 |
4 | [*]
5 | charset = utf-8
6 | indent_style = space
7 | indent_size = 2
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
11 | [*.md]
12 | max_line_length = off
13 | trim_trailing_whitespace = false
14 |
--------------------------------------------------------------------------------
/web/e2e/src/app.po.ts:
--------------------------------------------------------------------------------
1 | import { browser, by, element } from 'protractor';
2 |
3 | export class AppPage {
4 | navigateTo() {
5 | return browser.get(browser.baseUrl) as Promise;
6 | }
7 |
8 | getTitleText() {
9 | return element(by.css('app-root .content span')).getText() as Promise;
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/nlp/requirements.txt:
--------------------------------------------------------------------------------
1 | numpy==1.16.5
2 | scipy==1.3.1
3 | tensorflow==1.14.0
4 | tensorflow_hub==0.7.0
5 | wget==3.2
6 | requests==2.22.0
7 | pymongo==3.10.1
8 | pdfx==1.3.0
9 | Flask==1.1.1
10 | pdfminer2==20151206
11 | pyresparser==1.0.6
12 | Flask_RESTful==0.3.8
13 | tornado==6.0.3
14 | nltk==3.4.5
15 | pandas==0.25.1
16 | pdfminer==20191125
17 | tensorflow==2.1.0
18 |
--------------------------------------------------------------------------------
/web/tsconfig.app.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "./tsconfig.json",
3 | "compilerOptions": {
4 | "outDir": "./out-tsc/app",
5 | "types": []
6 | },
7 | "files": [
8 | "src/main.ts",
9 | "src/polyfills.ts"
10 | ],
11 | "include": [
12 | "src/**/*.ts"
13 | ],
14 | "exclude": [
15 | "src/test.ts",
16 | "src/**/*.spec.ts"
17 | ]
18 | }
19 |
--------------------------------------------------------------------------------
/web/tsconfig.spec.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "./tsconfig.json",
3 | "compilerOptions": {
4 | "outDir": "./out-tsc/spec",
5 | "types": [
6 | "jasmine",
7 | "node"
8 | ]
9 | },
10 | "files": [
11 | "src/test.ts",
12 | "src/polyfills.ts"
13 | ],
14 | "include": [
15 | "src/**/*.spec.ts",
16 | "src/**/*.d.ts"
17 | ]
18 | }
19 |
--------------------------------------------------------------------------------
/web/src/app/components/login/login.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-login',
5 | templateUrl: './login.component.html',
6 | styleUrls: ['./login.component.css']
7 | })
8 | export class LoginComponent implements OnInit {
9 |
10 | constructor() { }
11 |
12 | ngOnInit() {
13 | }
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/web/src/app/components/navbar/navbar.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-navbar',
5 | templateUrl: './navbar.component.html',
6 | styleUrls: ['./navbar.component.css']
7 | })
8 | export class NavbarComponent implements OnInit {
9 |
10 | constructor() { }
11 |
12 | ngOnInit() {
13 | }
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/web/src/app/components/signup/signup.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-signup',
5 | templateUrl: './signup.component.html',
6 | styleUrls: ['./signup.component.css']
7 | })
8 | export class SignupComponent implements OnInit {
9 |
10 | constructor() { }
11 |
12 | ngOnInit() {
13 | }
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/web/src/app/services/resume-api.service.spec.ts:
--------------------------------------------------------------------------------
1 | import { TestBed } from '@angular/core/testing';
2 |
3 | import { ResumeAPIService } from './resume-api.service';
4 |
5 | describe('ResumeAPIService', () => {
6 | beforeEach(() => TestBed.configureTestingModule({}));
7 |
8 | it('should be created', () => {
9 | const service: ResumeAPIService = TestBed.get(ResumeAPIService);
10 | expect(service).toBeTruthy();
11 | });
12 | });
13 |
--------------------------------------------------------------------------------
/web/src/main.ts:
--------------------------------------------------------------------------------
1 | import 'hammerjs';
2 | import { enableProdMode } from '@angular/core';
3 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
4 |
5 | import { AppModule } from './app/app.module';
6 | import { environment } from './environments/environment';
7 |
8 | if (environment.production) {
9 | enableProdMode();
10 | }
11 |
12 | platformBrowserDynamic().bootstrapModule(AppModule)
13 | .catch(err => console.error(err));
14 |
--------------------------------------------------------------------------------
/web/browserslist:
--------------------------------------------------------------------------------
1 | # This file is used by the build system to adjust CSS and JS output to support the specified browsers below.
2 | # For additional information regarding the format and rule options, please see:
3 | # https://github.com/browserslist/browserslist#queries
4 |
5 | # You can see what browsers were selected by your queries by running:
6 | # npx browserslist
7 |
8 | > 0.5%
9 | last 2 versions
10 | Firefox ESR
11 | not dead
12 | not IE 9-11 # For IE 9-11 support, remove 'not'.
--------------------------------------------------------------------------------
/upload.py:
--------------------------------------------------------------------------------
1 | import requests
2 | import os
3 | import json
4 | from pprint import pprint
5 | import time
6 |
7 | f = []
8 | for (dirpath, dirnames, filenames) in os.walk('./dataset/'):
9 | f.extend(filenames)
10 |
11 | print(f)
12 |
13 |
14 | url = 'http://localhost:3000/insert'
15 | for i in range(56):
16 | myobj = {
17 | "url": str(i)
18 | }
19 | data = json.dumps(myobj)
20 | print(data)
21 | x = requests.post(url, data = myobj)
22 | print(x.json())
23 |
24 |
--------------------------------------------------------------------------------
/backend/schema/resume.js:
--------------------------------------------------------------------------------
1 | import mongoose from 'mongoose';
2 |
3 | const { Schema } = mongoose;
4 |
5 | var resumeSchema = new Schema({
6 | name: { type: String },
7 | email: { type: String },
8 | mobile_number: {type: String},
9 | skills: {type: String},
10 | college_name: {type: String},
11 | degree : {type: String},
12 | designation: {type: String},
13 | experience: {type: String},
14 | company_names: {type: String},
15 | no_of_pages: {type: String},
16 | total_experience: {type: String},
17 | resume: {type: String}
18 | });
19 |
20 | module.exports = mongoose.model('Resume', resumeSchema);
--------------------------------------------------------------------------------
/web/src/app/services/resume-api.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { HttpClient } from '@angular/common/http'
3 |
4 | interface Config {
5 | skills: any[];
6 | result: any[];
7 | Experience: any[];
8 | }
9 |
10 |
11 | @Injectable({
12 | providedIn: 'root'
13 | })
14 | export class ResumeAPIService {
15 |
16 | uri = 'http://localhost:3000';
17 | uri2 = 'http://127.0.0.1:5000/'
18 |
19 | constructor(private http: HttpClient) { }
20 |
21 | getAll() {
22 | return this.http.get(`${this.uri}/getAll`);
23 | }
24 |
25 | predict(data){
26 | return this.http.post(`${this.uri2}`, data)
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/web/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compileOnSave": false,
3 | "compilerOptions": {
4 | "baseUrl": "./",
5 | "outDir": "./dist/out-tsc",
6 | "sourceMap": true,
7 | "declaration": false,
8 | "downlevelIteration": true,
9 | "experimentalDecorators": true,
10 | "module": "esnext",
11 | "moduleResolution": "node",
12 | "importHelpers": true,
13 | "target": "es2015",
14 | "typeRoots": [
15 | "node_modules/@types"
16 | ],
17 | "lib": [
18 | "es2018",
19 | "dom"
20 | ]
21 | },
22 | "angularCompilerOptions": {
23 | "fullTemplateTypeCheck": true,
24 | "strictInjectionParameters": true
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/web/src/test.ts:
--------------------------------------------------------------------------------
1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files
2 |
3 | import 'zone.js/dist/zone-testing';
4 | import { getTestBed } from '@angular/core/testing';
5 | import {
6 | BrowserDynamicTestingModule,
7 | platformBrowserDynamicTesting
8 | } from '@angular/platform-browser-dynamic/testing';
9 |
10 | declare const require: any;
11 |
12 | // First, initialize the Angular testing environment.
13 | getTestBed().initTestEnvironment(
14 | BrowserDynamicTestingModule,
15 | platformBrowserDynamicTesting()
16 | );
17 | // Then we find all the tests.
18 | const context = require.context('./', true, /\.spec\.ts$/);
19 | // And load the modules.
20 | context.keys().map(context);
21 |
--------------------------------------------------------------------------------
/web/src/environments/environment.ts:
--------------------------------------------------------------------------------
1 | // This file can be replaced during build by using the `fileReplacements` array.
2 | // `ng build --prod` replaces `environment.ts` with `environment.prod.ts`.
3 | // The list of file replacements can be found in `angular.json`.
4 |
5 | export const environment = {
6 | production: false
7 | };
8 |
9 | /*
10 | * For easier debugging in development mode, you can import the following file
11 | * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`.
12 | *
13 | * This import should be commented out in production mode because it will have a negative impact
14 | * on performance if an error is thrown.
15 | */
16 | // import 'zone.js/dist/zone-error'; // Included with Angular CLI.
17 |
--------------------------------------------------------------------------------
/web/e2e/src/app.e2e-spec.ts:
--------------------------------------------------------------------------------
1 | import { AppPage } from './app.po';
2 | import { browser, logging } from 'protractor';
3 |
4 | describe('workspace-project App', () => {
5 | let page: AppPage;
6 |
7 | beforeEach(() => {
8 | page = new AppPage();
9 | });
10 |
11 | it('should display welcome message', () => {
12 | page.navigateTo();
13 | expect(page.getTitleText()).toEqual('web app is running!');
14 | });
15 |
16 | afterEach(async () => {
17 | // Assert that there are no errors emitted from the browser
18 | const logs = await browser.manage().logs().get(logging.Type.BROWSER);
19 | expect(logs).not.toContain(jasmine.objectContaining({
20 | level: logging.Level.SEVERE,
21 | } as logging.Entry));
22 | });
23 | });
24 |
--------------------------------------------------------------------------------
/web/src/app/components/login/login.component.spec.ts:
--------------------------------------------------------------------------------
1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing';
2 |
3 | import { LoginComponent } from './login.component';
4 |
5 | describe('LoginComponent', () => {
6 | let component: LoginComponent;
7 | let fixture: ComponentFixture;
8 |
9 | beforeEach(async(() => {
10 | TestBed.configureTestingModule({
11 | declarations: [ LoginComponent ]
12 | })
13 | .compileComponents();
14 | }));
15 |
16 | beforeEach(() => {
17 | fixture = TestBed.createComponent(LoginComponent);
18 | component = fixture.componentInstance;
19 | fixture.detectChanges();
20 | });
21 |
22 | it('should create', () => {
23 | expect(component).toBeTruthy();
24 | });
25 | });
26 |
--------------------------------------------------------------------------------
/web/src/app/components/navbar/navbar.component.spec.ts:
--------------------------------------------------------------------------------
1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing';
2 |
3 | import { NavbarComponent } from './navbar.component';
4 |
5 | describe('NavbarComponent', () => {
6 | let component: NavbarComponent;
7 | let fixture: ComponentFixture;
8 |
9 | beforeEach(async(() => {
10 | TestBed.configureTestingModule({
11 | declarations: [ NavbarComponent ]
12 | })
13 | .compileComponents();
14 | }));
15 |
16 | beforeEach(() => {
17 | fixture = TestBed.createComponent(NavbarComponent);
18 | component = fixture.componentInstance;
19 | fixture.detectChanges();
20 | });
21 |
22 | it('should create', () => {
23 | expect(component).toBeTruthy();
24 | });
25 | });
26 |
--------------------------------------------------------------------------------
/web/src/app/components/signup/signup.component.spec.ts:
--------------------------------------------------------------------------------
1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing';
2 |
3 | import { SignupComponent } from './signup.component';
4 |
5 | describe('SignupComponent', () => {
6 | let component: SignupComponent;
7 | let fixture: ComponentFixture;
8 |
9 | beforeEach(async(() => {
10 | TestBed.configureTestingModule({
11 | declarations: [ SignupComponent ]
12 | })
13 | .compileComponents();
14 | }));
15 |
16 | beforeEach(() => {
17 | fixture = TestBed.createComponent(SignupComponent);
18 | component = fixture.componentInstance;
19 | fixture.detectChanges();
20 | });
21 |
22 | it('should create', () => {
23 | expect(component).toBeTruthy();
24 | });
25 | });
26 |
--------------------------------------------------------------------------------
/web/src/app/components/dashboard/table/table.component.spec.ts:
--------------------------------------------------------------------------------
1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing';
2 |
3 | import { TableComponent } from './table.component';
4 |
5 | describe('TableComponent', () => {
6 | let component: TableComponent;
7 | let fixture: ComponentFixture;
8 |
9 | beforeEach(async(() => {
10 | TestBed.configureTestingModule({
11 | declarations: [ TableComponent ]
12 | })
13 | .compileComponents();
14 | }));
15 |
16 | beforeEach(() => {
17 | fixture = TestBed.createComponent(TableComponent);
18 | component = fixture.componentInstance;
19 | fixture.detectChanges();
20 | });
21 |
22 | it('should create', () => {
23 | expect(component).toBeTruthy();
24 | });
25 | });
26 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Resume-screening
2 | Resume screening is the process of determining whether a candidate is qualified for a role based his or her education, experience, and other information captured on their resume. In a nutshell, it's a form of pattern matching between a job's requirements and the qualifications of a candidate based on their resume
3 |
4 | # How to Run
5 |
6 | ```
7 |
8 | cd backend
9 | npm install
10 | npm start
11 |
12 |
13 | cd web
14 | npm install
15 | ng s -o
16 |
17 |
18 | cd nlp
19 | pip3 install -r requirements.txt
20 | python3 app.py
21 |
22 |
23 | cd clustering
24 | python3 vector.py
25 | ```
26 | ### Note: Download the model from https://tfhub.dev/google/universal-sentence-encoder/2 and store in /nlp/clustering/2/
27 |
--------------------------------------------------------------------------------
/web/src/app/components/dashboard/dashboard.component.spec.ts:
--------------------------------------------------------------------------------
1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing';
2 |
3 | import { DashboardComponent } from './dashboard.component';
4 |
5 | describe('DashboardComponent', () => {
6 | let component: DashboardComponent;
7 | let fixture: ComponentFixture;
8 |
9 | beforeEach(async(() => {
10 | TestBed.configureTestingModule({
11 | declarations: [ DashboardComponent ]
12 | })
13 | .compileComponents();
14 | }));
15 |
16 | beforeEach(() => {
17 | fixture = TestBed.createComponent(DashboardComponent);
18 | component = fixture.componentInstance;
19 | fixture.detectChanges();
20 | });
21 |
22 | it('should create', () => {
23 | expect(component).toBeTruthy();
24 | });
25 | });
26 |
--------------------------------------------------------------------------------
/web/src/app/components/show-resume/show-resume.component.spec.ts:
--------------------------------------------------------------------------------
1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing';
2 |
3 | import { ShowResumeComponent } from './show-resume.component';
4 |
5 | describe('ShowResumeComponent', () => {
6 | let component: ShowResumeComponent;
7 | let fixture: ComponentFixture;
8 |
9 | beforeEach(async(() => {
10 | TestBed.configureTestingModule({
11 | declarations: [ ShowResumeComponent ]
12 | })
13 | .compileComponents();
14 | }));
15 |
16 | beforeEach(() => {
17 | fixture = TestBed.createComponent(ShowResumeComponent);
18 | component = fixture.componentInstance;
19 | fixture.detectChanges();
20 | });
21 |
22 | it('should create', () => {
23 | expect(component).toBeTruthy();
24 | });
25 | });
26 |
--------------------------------------------------------------------------------
/web/.gitignore:
--------------------------------------------------------------------------------
1 | # See http://help.github.com/ignore-files/ for more about ignoring files.
2 |
3 | # compiled output
4 | /dist
5 | /tmp
6 | /out-tsc
7 | # Only exists if Bazel was run
8 | /bazel-out
9 |
10 | # dependencies
11 | /node_modules
12 |
13 | # profiling files
14 | chrome-profiler-events*.json
15 | speed-measure-plugin*.json
16 |
17 | # IDEs and editors
18 | /.idea
19 | .project
20 | .classpath
21 | .c9/
22 | *.launch
23 | .settings/
24 | *.sublime-workspace
25 |
26 | # IDE - VSCode
27 | .vscode/*
28 | !.vscode/settings.json
29 | !.vscode/tasks.json
30 | !.vscode/launch.json
31 | !.vscode/extensions.json
32 | .history/*
33 |
34 | # misc
35 | /.sass-cache
36 | /connect.lock
37 | /coverage
38 | /libpeerconnection.log
39 | npm-debug.log
40 | yarn-error.log
41 | testem.log
42 | /typings
43 |
44 | # System Files
45 | .DS_Store
46 | Thumbs.db
47 |
--------------------------------------------------------------------------------
/web/src/app/app-routing.module.ts:
--------------------------------------------------------------------------------
1 | import { ShowResumeComponent } from './components/show-resume/show-resume.component';
2 | import { DashboardComponent } from './components/dashboard/dashboard.component';
3 | import { LoginComponent } from './components/login/login.component';
4 | import { NgModule } from '@angular/core';
5 | import { Routes, RouterModule } from '@angular/router';
6 | import { SignupComponent } from './components/signup/signup.component';
7 |
8 |
9 | const routes: Routes = [
10 | {path: '', component: DashboardComponent},
11 | {path: 'login', component: LoginComponent},
12 | {path: 'signup', component: SignupComponent},
13 | {path: 'dashboard', component: DashboardComponent},
14 | {path: 'showResume', component: ShowResumeComponent}
15 |
16 | ];
17 |
18 | @NgModule({
19 | imports: [RouterModule.forRoot(routes)],
20 | exports: [RouterModule]
21 | })
22 | export class AppRoutingModule { }
23 |
--------------------------------------------------------------------------------
/web/e2e/protractor.conf.js:
--------------------------------------------------------------------------------
1 | // @ts-check
2 | // Protractor configuration file, see link for more information
3 | // https://github.com/angular/protractor/blob/master/lib/config.ts
4 |
5 | const { SpecReporter } = require('jasmine-spec-reporter');
6 |
7 | /**
8 | * @type { import("protractor").Config }
9 | */
10 | exports.config = {
11 | allScriptsTimeout: 11000,
12 | specs: [
13 | './src/**/*.e2e-spec.ts'
14 | ],
15 | capabilities: {
16 | browserName: 'chrome'
17 | },
18 | directConnect: true,
19 | baseUrl: 'http://localhost:4200/',
20 | framework: 'jasmine',
21 | jasmineNodeOpts: {
22 | showColors: true,
23 | defaultTimeoutInterval: 30000,
24 | print: function() {}
25 | },
26 | onPrepare() {
27 | require('ts-node').register({
28 | project: require('path').join(__dirname, './tsconfig.json')
29 | });
30 | jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
31 | }
32 | };
--------------------------------------------------------------------------------
/web/src/app/components/login/login.component.css:
--------------------------------------------------------------------------------
1 | .bg {
2 | /* The image used */
3 | background-image: url("src/assets/images/login.jpg");
4 |
5 | /* Full height */
6 | height: auto;
7 | min-height: 100vh;
8 |
9 | /* Center and scale the image nicely */
10 | background-position: center;
11 | background-repeat: no-repeat;
12 | background-size: cover;
13 |
14 | }
15 |
16 | .page-header {
17 | padding: 15vh 0!important;
18 | }
19 |
20 | .myfront {
21 | background: linear-gradient(60deg,#ec407a,#d81b60);
22 | }
23 |
24 | .card {
25 | margin: 0 15px;
26 | padding: 0;
27 | position: relative;
28 | min-height: 50px;
29 |
30 | position: relative;
31 | display: flex;
32 | flex-direction: column;
33 | min-width: 0;
34 | word-wrap: break-word;
35 | background-color: #fff;
36 | background-clip: border-box;
37 | border: 1px solid #eee;
38 | border-radius: .25rem;
39 | }
40 |
41 |
42 |
--------------------------------------------------------------------------------
/backend/app.js:
--------------------------------------------------------------------------------
1 | import express from 'express';
2 | import mongoose from 'mongoose';
3 | import logger from 'morgan';
4 | import path from 'path';
5 | import bodyParser from 'body-parser';
6 | import cors from 'cors';
7 | import 'dotenv/config';
8 |
9 | import indexRouter from './routes/index';
10 | import resumeRouter from './routes/resume';
11 |
12 |
13 | var app = express();
14 | app.use(cors());
15 | app.use(logger('dev'));
16 | app.use(bodyParser.urlencoded({ extended: false }))
17 | app.use(bodyParser.json())
18 |
19 | // app.use(function (req, res) {
20 | // res.setHeader('Content-Type', 'text/plain')
21 | // res.write('you posted:\n')
22 | // res.end(JSON.stringify(req.body, null, 2))
23 | // })
24 |
25 | mongoose.connect(process.env.DBURI,(err) => {
26 | if(err) throw err;
27 |
28 | console.log('database connected ');
29 | })
30 |
31 | app.use('/', indexRouter);
32 | app.use('/', resumeRouter);
33 |
34 |
35 |
36 | const port = 3000
37 |
38 | app.get('/', (req, res) => res.send('Hello World!'))
39 |
40 | app.listen(port, () => console.log(`Example app listening on port ${port}!`))
--------------------------------------------------------------------------------
/backend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "version": "1.0.0",
4 | "description": "backend server ",
5 | "main": "app.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1",
8 | "start": "nodemon --exec babel-node app.js"
9 | },
10 | "repository": {
11 | "type": "git",
12 | "url": "git+https://github.com/viditkhemka63/Resume-screening.git"
13 | },
14 | "keywords": [
15 | "nodejs"
16 | ],
17 | "author": "Vidit Khemka",
18 | "license": "ISC",
19 | "bugs": {
20 | "url": "https://github.com/viditkhemka63/Resume-screening/issues"
21 | },
22 | "homepage": "https://github.com/viditkhemka63/Resume-screening#readme",
23 | "dependencies": {
24 | "axios": "^0.19.2",
25 | "body-parser": "^1.19.0",
26 | "cors": "^2.8.5",
27 | "dotenv": "^8.2.0",
28 | "express": "^4.17.1",
29 | "mongoose": "^5.9.4",
30 | "morgan": "^1.9.1",
31 | "path": "^0.12.7"
32 | },
33 | "devDependencies": {
34 | "@babel/core": "^7.8.7",
35 | "@babel/node": "^7.8.7",
36 | "@babel/preset-env": "^7.8.7",
37 | "nodemon": "^2.0.2"
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/web/README.md:
--------------------------------------------------------------------------------
1 | # Web
2 |
3 | This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.3.23.
4 |
5 | ## Development server
6 |
7 | Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files.
8 |
9 | ## Code scaffolding
10 |
11 | Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.
12 |
13 | ## Build
14 |
15 | Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build.
16 |
17 | ## Running unit tests
18 |
19 | Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
20 |
21 | ## Running end-to-end tests
22 |
23 | Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/).
24 |
25 | ## Further help
26 |
27 | To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md).
28 |
--------------------------------------------------------------------------------
/web/karma.conf.js:
--------------------------------------------------------------------------------
1 | // Karma configuration file, see link for more information
2 | // https://karma-runner.github.io/1.0/config/configuration-file.html
3 |
4 | module.exports = function (config) {
5 | config.set({
6 | basePath: '',
7 | frameworks: ['jasmine', '@angular-devkit/build-angular'],
8 | plugins: [
9 | require('karma-jasmine'),
10 | require('karma-chrome-launcher'),
11 | require('karma-jasmine-html-reporter'),
12 | require('karma-coverage-istanbul-reporter'),
13 | require('@angular-devkit/build-angular/plugins/karma')
14 | ],
15 | client: {
16 | clearContext: false // leave Jasmine Spec Runner output visible in browser
17 | },
18 | coverageIstanbulReporter: {
19 | dir: require('path').join(__dirname, './coverage/web'),
20 | reports: ['html', 'lcovonly', 'text-summary'],
21 | fixWebpackSourcePaths: true
22 | },
23 | reporters: ['progress', 'kjhtml'],
24 | port: 9876,
25 | colors: true,
26 | logLevel: config.LOG_INFO,
27 | autoWatch: true,
28 | browsers: ['Chrome'],
29 | singleRun: false,
30 | restartOnFileChange: true
31 | });
32 | };
33 |
--------------------------------------------------------------------------------
/nlp/db.py:
--------------------------------------------------------------------------------
1 | import pymongo
2 | import pandas as pd
3 | import json
4 |
5 | url = "mongodb+srv://M44:admin123@cluster0-nfbuw.mongodb.net/test?retryWrites=true&w=majority"
6 |
7 | def serializeJSON(json_data):
8 | result = {}
9 |
10 | for key in list(json_data.keys()):
11 | if type(json_data[key]) == type([]):
12 | result[key] = "$".join(json_data[key])
13 | else:
14 | result[key] = str(json_data[key])
15 |
16 | return result
17 |
18 | def getURL():
19 | df = pd.read_json('/content/env.json', typ='series')
20 | return df['mongodbUrl']
21 |
22 | def connect():
23 | myclient = pymongo.MongoClient(url)
24 | mydb = myclient["resume"]
25 | return mydb
26 |
27 | def insertOne(mydb, data):
28 | mycol = mydb["resume"]
29 | data = serializeJSON(data)
30 | data = json.dumps(data)
31 | data = json.loads(data)
32 | print(type(data))
33 | print(data)
34 | x = mycol.insert_many(data)
35 | return x
36 |
37 | def getAll(mycol):
38 | result = mycol.find()
39 | return result
40 |
41 | def getbyAtt(mycol, key, value):
42 | result = mycol.find({key: value})
43 | return result
44 |
45 |
--------------------------------------------------------------------------------
/web/src/app/components/navbar/navbar.component.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/src/app/app.component.spec.ts:
--------------------------------------------------------------------------------
1 | import { TestBed, async } from '@angular/core/testing';
2 | import { RouterTestingModule } from '@angular/router/testing';
3 | import { AppComponent } from './app.component';
4 |
5 | describe('AppComponent', () => {
6 | beforeEach(async(() => {
7 | TestBed.configureTestingModule({
8 | imports: [
9 | RouterTestingModule
10 | ],
11 | declarations: [
12 | AppComponent
13 | ],
14 | }).compileComponents();
15 | }));
16 |
17 | it('should create the app', () => {
18 | const fixture = TestBed.createComponent(AppComponent);
19 | const app = fixture.debugElement.componentInstance;
20 | expect(app).toBeTruthy();
21 | });
22 |
23 | it(`should have as title 'web'`, () => {
24 | const fixture = TestBed.createComponent(AppComponent);
25 | const app = fixture.debugElement.componentInstance;
26 | expect(app.title).toEqual('web');
27 | });
28 |
29 | it('should render title', () => {
30 | const fixture = TestBed.createComponent(AppComponent);
31 | fixture.detectChanges();
32 | const compiled = fixture.debugElement.nativeElement;
33 | expect(compiled.querySelector('.content span').textContent).toContain('web app is running!');
34 | });
35 | });
36 |
--------------------------------------------------------------------------------
/web/src/app/components/show-resume/show-resume.component.css:
--------------------------------------------------------------------------------
1 | .space{
2 | margin-top: 100px;
3 | }
4 |
5 | table {
6 | width: 100%;
7 | }
8 |
9 | /* Spinner */
10 | html, body {
11 | background: #347fc3;
12 | width: 100%;
13 | overflow-x: hidden;
14 | overflow-y: hidden;
15 | }
16 |
17 | .bar {
18 | position: relative;
19 | height: 2px;
20 | width: 500px;
21 | margin: 0 auto;
22 | background: #ffffff;
23 | margin-top: 150px;
24 | }
25 |
26 | .circle {
27 | position: absolute;
28 | top: -30px;
29 | margin-left: -30px;
30 | height: 60px;
31 | width: 60px;
32 | left: 0;
33 | background: #347fc3;
34 | border-radius: 30%;
35 | -webkit-animation: move 5s infinite;
36 | }
37 |
38 | p {
39 | position: absolute;
40 | top: -35px;
41 | right: -85px;
42 | text-transform: uppercase;
43 | color: #347fc3;
44 | font-family: helvetica, sans-serif;
45 | font-weight: bold;
46 | }
47 |
48 | @-webkit-keyframes move {
49 | 0% {left: 0;}
50 | 50% {left: 100%; -webkit-transform: rotate(450deg); width: 150px; height: 150px;}
51 | 75% {left: 100%; -webkit-transform: rotate(450deg); width: 150px; height: 150px;}
52 | 100 {right: 100%;}
53 | }
--------------------------------------------------------------------------------
/web/src/app/app.module.ts:
--------------------------------------------------------------------------------
1 | import { MaterialModule } from './material.module';
2 | import { BrowserModule } from '@angular/platform-browser';
3 | import { NgModule } from '@angular/core';
4 | import { HttpClientModule } from '@angular/common/http';
5 |
6 | import { AppRoutingModule } from './app-routing.module';
7 | import { AppComponent } from './app.component';
8 | import { NavbarComponent } from './components/navbar/navbar.component';
9 | import { DashboardComponent } from './components/dashboard/dashboard.component';
10 | import { TableComponent } from './components/dashboard/table/table.component';
11 | import { LoginComponent } from './components/login/login.component';
12 | import { SignupComponent } from './components/signup/signup.component';
13 | import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
14 | import { ChartsModule } from 'ng2-charts';
15 | import { ShowResumeComponent } from './components/show-resume/show-resume.component';
16 | import { ReactiveFormsModule, FormsModule } from '@angular/forms';
17 |
18 | @NgModule({
19 | declarations: [
20 | AppComponent,
21 | NavbarComponent,
22 | DashboardComponent,
23 | TableComponent,
24 | LoginComponent,
25 | SignupComponent,
26 | ShowResumeComponent,
27 | ],
28 | imports: [
29 | BrowserModule,
30 | AppRoutingModule,
31 | BrowserAnimationsModule,
32 | MaterialModule,
33 | ChartsModule,
34 | HttpClientModule,
35 | ReactiveFormsModule,
36 | FormsModule
37 | ],
38 | providers: [],
39 | bootstrap: [AppComponent]
40 | })
41 | export class AppModule { }
42 |
--------------------------------------------------------------------------------
/web/src/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Web
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/nlp/clustering/vector.py:
--------------------------------------------------------------------------------
1 |
2 | import tornado.ioloop
3 | import tornado.web
4 | import json
5 |
6 | # import tensorflow as tf
7 | import tensorflow.compat.v1 as tf
8 | tf.disable_v2_behavior()
9 | import tensorflow_hub as hub
10 |
11 | module_url = "./2/" #@param ["https://tfhub.dev/google/universal-sentence-encoder/2", "https://tfhub.dev/google/universal-sentence-encoder-large/3"]
12 | embed_fn = None
13 |
14 | def loadModel():
15 | global embed_fn
16 | embed_fn = embed_useT(module_url)
17 | print('rule engine loaded')
18 |
19 | def embed_useT(module):
20 | with tf.Graph().as_default():
21 | sentences = tf.placeholder(tf.string)
22 | embed = hub.Module(module)
23 | embeddings = embed(tf.squeeze(tf.cast(sentences, tf.string)), signature="default", as_dict=True )["default"]
24 | session = tf.train.MonitoredSession()
25 | return lambda x: session.run(embeddings, {sentences: x})
26 |
27 | class MainHandler(tornado.web.RequestHandler):
28 | def get(self):
29 | self.write("Hello, world")
30 | def post(self):
31 | data = self.request.body
32 | data = json.loads(data.decode('utf-8'))
33 | print( data['sentences'])
34 | global embed_fn
35 | parsedSentence = embed_fn(['test'] + data['sentences'])
36 | vector = {'vector': parsedSentence.tolist()[1:]}
37 | self.write(vector)
38 |
39 |
40 | application = tornado.web.Application([
41 | (r"/", MainHandler),
42 | ])
43 |
44 | if __name__ == "__main__":
45 | loadModel()
46 | application.listen(5010)
47 | tornado.ioloop.IOLoop.instance().start()
48 |
49 |
--------------------------------------------------------------------------------
/web/src/app/components/dashboard/dashboard.component.css:
--------------------------------------------------------------------------------
1 | .page-title {
2 | font-size: 24px;
3 | font-weight: 300;
4 | color: #313b3d;
5 | letter-spacing: 0;
6 | margin-right: 30px;
7 | }
8 |
9 | .chart-container{
10 | padding-left: 100px;
11 | padding-top: 100px;
12 | padding-right: 50px;
13 | }
14 |
15 | .my-container{
16 | padding-left: 50px;
17 | padding-top: 20px;
18 | padding-right: 50px;
19 | }
20 |
21 |
22 | .col-4 {
23 | flex: 0 0 33.33333%;
24 | max-width: 50.33333%;
25 | }
26 |
27 |
28 | /* Spinner */
29 | html, body {
30 | background: #347fc3;
31 | width: 100%;
32 | overflow-x: hidden;
33 | overflow-y: hidden;
34 | }
35 |
36 | .bar {
37 | position: relative;
38 | height: 2px;
39 | width: 500px;
40 | margin: 0 auto;
41 | background: #ffffff;
42 | margin-top: 150px;
43 | }
44 |
45 | .circle {
46 | position: absolute;
47 | top: -30px;
48 | margin-left: -30px;
49 | height: 60px;
50 | width: 60px;
51 | left: 0;
52 | background: #347fc3;
53 | border-radius: 30%;
54 | -webkit-animation: move 5s infinite;
55 | }
56 |
57 | p {
58 | position: absolute;
59 | top: -35px;
60 | right: -85px;
61 | text-transform: uppercase;
62 | color: #347fc3;
63 | font-family: helvetica, sans-serif;
64 | font-weight: bold;
65 | }
66 |
67 | @-webkit-keyframes move {
68 | 0% {left: 0;}
69 | 50% {left: 100%; -webkit-transform: rotate(450deg); width: 150px; height: 150px;}
70 | 75% {left: 100%; -webkit-transform: rotate(450deg); width: 150px; height: 150px;}
71 | 100 {right: 100%;}
72 | }
--------------------------------------------------------------------------------
/web/src/app/components/login/login.component.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "web",
3 | "version": "0.0.0",
4 | "scripts": {
5 | "ng": "ng",
6 | "start": "ng serve",
7 | "build": "ng build",
8 | "test": "ng test",
9 | "lint": "ng lint",
10 | "e2e": "ng e2e"
11 | },
12 | "private": true,
13 | "dependencies": {
14 | "@amcharts/amcharts4": "^4.9.9",
15 | "@angular/animations": "~8.2.14",
16 | "@angular/cdk": "^8.2.3",
17 | "@angular/common": "~8.2.14",
18 | "@angular/compiler": "~8.2.14",
19 | "@angular/core": "~8.2.14",
20 | "@angular/forms": "~8.2.14",
21 | "@angular/material": "^8.2.3",
22 | "@angular/platform-browser": "~8.2.14",
23 | "@angular/platform-browser-dynamic": "~8.2.14",
24 | "@angular/router": "~8.2.14",
25 | "@swimlane/ngx-charts": "^13.0.2",
26 | "canvasjs": "^1.8.3",
27 | "chart.js": "^2.9.3",
28 | "hammerjs": "^2.0.8",
29 | "ng2-charts": "^2.2.4",
30 | "rxjs": "~6.4.0",
31 | "tslib": "^1.10.0",
32 | "zone.js": "~0.9.1"
33 | },
34 | "devDependencies": {
35 | "@angular-devkit/build-angular": "~0.803.23",
36 | "@angular/cli": "~8.3.23",
37 | "@angular/compiler-cli": "~8.2.14",
38 | "@angular/language-service": "~8.2.14",
39 | "@types/node": "~8.9.4",
40 | "@types/jasmine": "~3.3.8",
41 | "@types/jasminewd2": "~2.0.3",
42 | "codelyzer": "^5.0.0",
43 | "jasmine-core": "~3.4.0",
44 | "jasmine-spec-reporter": "~4.2.1",
45 | "karma": "~4.1.0",
46 | "karma-chrome-launcher": "~2.2.0",
47 | "karma-coverage-istanbul-reporter": "~2.0.1",
48 | "karma-jasmine": "~2.0.1",
49 | "karma-jasmine-html-reporter": "^1.4.0",
50 | "protractor": "~5.4.0",
51 | "ts-node": "~7.0.0",
52 | "tslint": "~5.15.0",
53 | "typescript": "~3.5.3"
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/testJob Description:
--------------------------------------------------------------------------------
1 | As a part of Machine Learning team you will be responsible for applying machine learning to different business problems. You will be taking care of all steps starting from dataset preparation, feature generation, training algorithms and deploying to make predictions. Projects will range from simpler prediction problems with linear/logistic regression to complex problems in NLP and computer vision.
2 |
3 | Role & Responsibilities :
4 |
5 | - Collect and integrate data from various data sources. This could involve writing crawlers, connecting to databases to extracting data.
6 |
7 | - Create datasets for training algorithms. This will involve writing scripts to join different structured and unstructured datasets, create features supporting hypothesis.
8 |
9 | - Training Machine learning algorithms, perform iterative experiments with different techniques and features to discover best performing algorithm.
10 |
11 | - Collaborate with data engineering team to create data pipelines for regular feed into trained algorithms to make predictions. You will need to ensure data feeds are consistent with features used during training algorithms.
12 |
13 | - Monitor algorithm performance and suggest measures for improvement.
14 |
15 | - Document your work starting with data collection, feature documentation, algorithm performance results.
16 |
17 | Technical skills
18 |
19 | ML libs: Python- Scikit, Tensorflow, Keras, NLP
20 |
21 | Cloud ML Platforms: Google ML, AWS ML, Azure ML
22 |
23 | Algorithms: Linear/Logistic Regression, Random Forest, SVM, Neural Network, CNN, RNN, LSTM
24 |
25 | Programming Languages: Python, SQL
26 |
27 | Experience: 1-3 years
28 |
29 | *************************************************************************************************************
30 |
31 |
--------------------------------------------------------------------------------
/nlp/clustering/clustering.py:
--------------------------------------------------------------------------------
1 | import json
2 | import requests
3 | import numpy as np
4 | from scipy import spatial
5 |
6 |
7 |
8 | url = 'http://localhost:5010'
9 |
10 | def cosineSimilarity(x1, x2):
11 | return spatial.distance.cosine(x1, x2)
12 |
13 |
14 | def getVector(array, ids):
15 | myobj = {"sentences":array }
16 | data = json.dumps(myobj)
17 |
18 | resultVec = []
19 |
20 | x = requests.post(url, data = data)
21 | vector = x.json()['vector']
22 | for i in range(len(array)):
23 | if i == 0:
24 | resultVec.append([array[i], vector[i]])
25 | else:
26 | resultVec.append([ids[i-1], vector[i]])
27 |
28 | return resultVec
29 |
30 | # Locate the most similar neighbors
31 | def get_neighbors(train, test_row, num_neighbors):
32 | distances = list()
33 | for train_row in train:
34 | dist = cosineSimilarity(test_row[1], train_row[1])
35 | distances.append((train_row, dist))
36 | distances.sort(key=lambda tup: tup[1])
37 |
38 | neighbors = list()
39 | for i in range(num_neighbors):
40 | neighbors.append(distances[i])
41 | return neighbors
42 |
43 |
44 | def predict_classification(train, test_row, num_neighbors):
45 | neighbors = get_neighbors(train, test_row, num_neighbors)
46 | print(neighbors[1][1])
47 | output_values = [row[0][0] for row in neighbors]
48 | cosineList = [1 - row[1] for row in neighbors]
49 |
50 | result = [ [output_values[i], cosineList[i]] for i in range(len(output_values)) ]
51 |
52 | return result
53 |
54 |
55 | # sent = ['I love machine learning', 'machine learning is fun', 'covid-19 is very dangerous', 'deep learning requires more data']
56 | # vec = getVector(sent)
57 | # print(predict_classification(vec[1:], vec[0], 2))
58 |
--------------------------------------------------------------------------------
/backend/routes/resume.js:
--------------------------------------------------------------------------------
1 | import express from 'express';
2 | var router = express.Router();
3 | import Resume from '../schema/resume';
4 | import axios from 'axios';
5 |
6 |
7 | const parserResume = async(url) => {
8 | console.log(url)
9 | const resp = await axios.post('http://localhost:5000/prediction', {
10 | "url": url
11 | })
12 | console.log(resp.data);
13 | return resp.data
14 | }
15 |
16 |
17 | router.post('/insert', async(req, res) => {
18 | console.log(req.body)
19 | let data = await parserResume(req.body.url);
20 | console.log('data is ')
21 | console.log(data)
22 | const { name,
23 | email,
24 | mobile_number,
25 | skills,
26 | college_name,
27 | degree,
28 | designation,
29 | experience,
30 | no_of_pages,
31 | company_names,
32 | total_experience,
33 | resume} = data
34 | console.log(data.email)
35 | console.log(name)
36 |
37 |
38 | var myresume = new Resume({
39 | name,
40 | email,
41 | mobile_number,
42 | skills,
43 | college_name,
44 | degree,
45 | designation,
46 | experience,
47 | no_of_pages,
48 | company_names,
49 | total_experience,
50 | resume
51 | })
52 | const result = await myresume.save()
53 | console.log('result is ')
54 | console.log(result)
55 | res.json(result)
56 | })
57 |
58 | router.get('/getAll', async(req, res) => {
59 | const data = await Resume.find({});
60 | console.log(data.length)
61 | res.json(data)
62 | })
63 |
64 |
65 | router.post('/query', async(req, res) => {
66 | console.log(req.body)
67 | const {query, value} = req.body;
68 |
69 |
70 | const data = await Resume.find({[query]: value});
71 | console.log(data)
72 | res.json(data)
73 | })
74 |
75 |
76 | module.exports = router;
77 |
--------------------------------------------------------------------------------
/web/src/app/components/show-resume/show-resume.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
8 |
9 |
10 |
11 |
Resume List
12 |
13 |
14 |
15 |
16 |
17 |
18 | | No. |
19 | {{element.position}} |
20 |
21 |
22 |
23 |
24 | Name |
25 | {{element.name}} |
26 |
27 |
28 |
29 |
30 | Email |
31 | {{element.email}} |
32 |
33 |
34 |
35 |
36 | Experience ( Yrs) |
37 | {{element.experience}} |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
--------------------------------------------------------------------------------
/web/src/app/components/dashboard/table/table.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit, ViewChild, Input } from '@angular/core';
2 | import {MatSort} from '@angular/material/sort';
3 | import {MatTableDataSource} from '@angular/material/table';
4 |
5 | export interface PeriodicElement {
6 | name: string;
7 | position: number;
8 | email: string;
9 | phoneNo: number;
10 | performance: number;
11 | }
12 |
13 | const ELEMENT_DATA: PeriodicElement[] = [
14 | {position: 1, name: 'Vidit Khemka', email: 'viditkhemka63@gmail.com', phoneNo: 8800714404, performance: 100},
15 | {position: 2, name: 'Anchal Gupta', email: 'viditkhemka63@gmail.com', phoneNo: 8800714404 , performance: 80},
16 | {position: 3, name: 'Shweta Mamgain', email: 'viditkhemka63@gmail.com', phoneNo: 8800714404, performance: 0},
17 | {position: 4, name: 'Bharat bhalla', email: 'viditkhemka63@gmail.com', phoneNo: 8800714404, performance: 20}
18 | ];
19 |
20 |
21 | @Component({
22 | selector: 'app-table',
23 | templateUrl: './table.component.html',
24 | styleUrls: ['./table.component.css']
25 | })
26 | export class TableComponent implements OnInit {
27 |
28 | @Input() Data;
29 | displayedColumns: string[] = ['position', 'name', 'email', 'phoneNo', 'performance'];
30 | dataSource;
31 |
32 | @ViewChild(MatSort, {static: true}) sort: MatSort;
33 |
34 | constructor() { }
35 |
36 | ngOnInit() {
37 | console.log(this.Data);
38 | this.filterData();
39 | this.dataSource.sort = this.sort;
40 | }
41 |
42 | filterData(){
43 | let temp = []
44 | let count = 1
45 | this.Data.forEach(element => {
46 | temp.push({
47 | position: count,
48 | name: element.name,
49 | email: element.name + '@gmail.com',
50 | phoneNo: parseInt(element.total_experience) || 0,
51 | performance: element.score * 100
52 | })
53 | count++;
54 | });
55 | this.Data =temp;
56 | this.dataSource = new MatTableDataSource(this.Data);
57 | }
58 |
59 | }
60 |
--------------------------------------------------------------------------------
/web/src/app/components/show-resume/show-resume.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit, ViewChild, OnDestroy } from '@angular/core';
2 | import {MatSort} from '@angular/material/sort';
3 | import {MatTableDataSource} from '@angular/material/table';
4 |
5 | import { ResumeAPIService } from '../../services/resume-api.service';
6 | import { Subscription } from 'rxjs';
7 |
8 | export interface PeriodicElement {
9 | name: string;
10 | position: number;
11 | email: string;
12 | experience: number;
13 | }
14 |
15 |
16 |
17 | @Component({
18 | selector: 'app-show-resume',
19 | templateUrl: './show-resume.component.html',
20 | styleUrls: ['./show-resume.component.css']
21 | })
22 | export class ShowResumeComponent implements OnInit, OnDestroy {
23 |
24 | show: boolean = true;
25 | subscription: Subscription;
26 | resumeList
27 | DATA: PeriodicElement[] = [];
28 |
29 | displayedColumns: string[] = ['position', 'name', 'email', 'experience'];
30 | dataSource
31 |
32 | @ViewChild(MatSort, {static: true}) sort: MatSort;
33 |
34 | constructor(private resumeAPI: ResumeAPIService) { }
35 |
36 | ngOnInit() {
37 |
38 | this.subscription = this.resumeAPI.getAll().subscribe(data => {
39 | this.resumeList = data;
40 | console.log(data)
41 | this.filterData(this.resumeList)
42 | this.dataSource = new MatTableDataSource(this.DATA)
43 | this.show = false;
44 | })
45 | }
46 |
47 | ngOnDestroy() {
48 | if (this.subscription !== undefined){
49 | this.subscription.unsubscribe();
50 | }
51 | }
52 |
53 | isLoading(){
54 | return this.show;
55 | }
56 |
57 | filterData(resumeList){
58 | let count = 1;
59 |
60 | resumeList.forEach(ele => {
61 | let tempName = ele.name || 'test'
62 | let myobj = {
63 | position: count,
64 | name: tempName,
65 | email: tempName + '@gmail.com',
66 | experience: parseInt(ele.total_experience) || 0,
67 | }
68 |
69 | this.DATA.push(myobj);
70 | count++;
71 | });
72 | console.log(this.DATA)
73 | }
74 |
75 | }
76 |
77 |
78 |
--------------------------------------------------------------------------------
/web/tslint.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "tslint:recommended",
3 | "rules": {
4 | "array-type": false,
5 | "arrow-parens": false,
6 | "deprecation": {
7 | "severity": "warning"
8 | },
9 | "component-class-suffix": true,
10 | "contextual-lifecycle": true,
11 | "directive-class-suffix": true,
12 | "directive-selector": [
13 | true,
14 | "attribute",
15 | "app",
16 | "camelCase"
17 | ],
18 | "component-selector": [
19 | true,
20 | "element",
21 | "app",
22 | "kebab-case"
23 | ],
24 | "import-blacklist": [
25 | true,
26 | "rxjs/Rx"
27 | ],
28 | "interface-name": false,
29 | "max-classes-per-file": false,
30 | "max-line-length": [
31 | true,
32 | 140
33 | ],
34 | "member-access": false,
35 | "member-ordering": [
36 | true,
37 | {
38 | "order": [
39 | "static-field",
40 | "instance-field",
41 | "static-method",
42 | "instance-method"
43 | ]
44 | }
45 | ],
46 | "no-consecutive-blank-lines": false,
47 | "no-console": [
48 | true,
49 | "debug",
50 | "info",
51 | "time",
52 | "timeEnd",
53 | "trace"
54 | ],
55 | "no-empty": false,
56 | "no-inferrable-types": [
57 | true,
58 | "ignore-params"
59 | ],
60 | "no-non-null-assertion": true,
61 | "no-redundant-jsdoc": true,
62 | "no-switch-case-fall-through": true,
63 | "no-var-requires": false,
64 | "object-literal-key-quotes": [
65 | true,
66 | "as-needed"
67 | ],
68 | "object-literal-sort-keys": false,
69 | "ordered-imports": false,
70 | "quotemark": [
71 | true,
72 | "single"
73 | ],
74 | "trailing-comma": false,
75 | "no-conflicting-lifecycle": true,
76 | "no-host-metadata-property": true,
77 | "no-input-rename": true,
78 | "no-inputs-metadata-property": true,
79 | "no-output-native": true,
80 | "no-output-on-prefix": true,
81 | "no-output-rename": true,
82 | "no-outputs-metadata-property": true,
83 | "template-banana-in-box": true,
84 | "template-no-negated-async": true,
85 | "use-lifecycle-interface": true,
86 | "use-pipe-transform-interface": true
87 | },
88 | "rulesDirectory": [
89 | "codelyzer"
90 | ]
91 | }
--------------------------------------------------------------------------------
/web/src/app/components/dashboard/table/table.component.html:
--------------------------------------------------------------------------------
1 | Resume Performance
2 |
3 |
4 |
21 |
22 |
23 |
24 |
25 |
26 |
27 | | No. |
28 | {{element.position}} |
29 |
30 |
31 |
32 |
33 | Name |
34 | {{element.name}} |
35 |
36 |
37 |
38 |
39 | Email |
40 | {{element.email}} |
41 |
42 |
43 |
44 |
45 | Contact No |
46 | {{element.phoneNo}} |
47 |
48 |
49 |
50 |
51 | Skill Match |
52 | |
53 |
54 |
55 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/web/src/polyfills.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * This file includes polyfills needed by Angular and is loaded before the app.
3 | * You can add your own extra polyfills to this file.
4 | *
5 | * This file is divided into 2 sections:
6 | * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
7 | * 2. Application imports. Files imported after ZoneJS that should be loaded before your main
8 | * file.
9 | *
10 | * The current setup is for so-called "evergreen" browsers; the last versions of browsers that
11 | * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),
12 | * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
13 | *
14 | * Learn more in https://angular.io/guide/browser-support
15 | */
16 |
17 | /***************************************************************************************************
18 | * BROWSER POLYFILLS
19 | */
20 |
21 | /** IE10 and IE11 requires the following for NgClass support on SVG elements */
22 | // import 'classlist.js'; // Run `npm install --save classlist.js`.
23 |
24 | /**
25 | * Web Animations `@angular/platform-browser/animations`
26 | * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari.
27 | * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0).
28 | */
29 | // import 'web-animations-js'; // Run `npm install --save web-animations-js`.
30 |
31 | /**
32 | * By default, zone.js will patch all possible macroTask and DomEvents
33 | * user can disable parts of macroTask/DomEvents patch by setting following flags
34 | * because those flags need to be set before `zone.js` being loaded, and webpack
35 | * will put import in the top of bundle, so user need to create a separate file
36 | * in this directory (for example: zone-flags.ts), and put the following flags
37 | * into that file, and then add the following code before importing zone.js.
38 | * import './zone-flags.ts';
39 | *
40 | * The flags allowed in zone-flags.ts are listed here.
41 | *
42 | * The following flags will work for all browsers.
43 | *
44 | * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame
45 | * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick
46 | * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames
47 | *
48 | * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js
49 | * with the following flag, it will bypass `zone.js` patch for IE/Edge
50 | *
51 | * (window as any).__Zone_enable_cross_context_check = true;
52 | *
53 | */
54 |
55 | /***************************************************************************************************
56 | * Zone JS is required by default for Angular itself.
57 | */
58 | import 'zone.js/dist/zone'; // Included with Angular CLI.
59 |
60 |
61 | /***************************************************************************************************
62 | * APPLICATION IMPORTS
63 | */
64 |
--------------------------------------------------------------------------------
/web/src/app/components/dashboard/dashboard.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit, OnDestroy } from '@angular/core';
2 | import { ChartOptions, ChartType, ChartDataSets } from 'chart.js';
3 | import { SingleDataSet, Label, monkeyPatchChartJsLegend, monkeyPatchChartJsTooltip } from 'ng2-charts';
4 |
5 | import { ResumeAPIService } from '../../services/resume-api.service';
6 | import { Subscription } from 'rxjs';
7 | import { FormGroup, FormBuilder, Validators } from '@angular/forms';
8 |
9 | @Component({
10 | selector: 'app-dashboard',
11 | templateUrl: './dashboard.component.html',
12 | styleUrls: ['./dashboard.component.css']
13 | })
14 | export class DashboardComponent implements OnInit, OnDestroy {
15 |
16 | subscription: Subscription;
17 | requirementForm: FormGroup;
18 | skills;
19 | resumeList;
20 | expList
21 |
22 | isdataFetch:boolean = false;
23 | isrequirementFetch: boolean = false;
24 | nothingtoShow: boolean = true;
25 |
26 |
27 |
28 | public barChartOptions: ChartOptions = {
29 | responsive: true,
30 | };
31 | public barChartLabels: Label[] = ['Skills'];
32 | public barChartType: ChartType = 'bar';
33 | public barChartLegend = true;
34 | public barChartPlugins = [];
35 |
36 | public barChartData: ChartDataSets[] =[]
37 | // Pie
38 | public pieChartOptions: ChartOptions = {
39 | responsive: true,
40 | };
41 | public pieChartLabels: Label[] = []
42 | public pieChartData: SingleDataSet = [];
43 | public pieChartType: ChartType = 'pie';
44 | public pieChartLegend = true;
45 | public pieChartPlugins = [];
46 |
47 |
48 | constructor(
49 | private resumeAPI: ResumeAPIService,
50 | private fb: FormBuilder
51 | ) {
52 | monkeyPatchChartJsTooltip();
53 | monkeyPatchChartJsLegend();
54 | }
55 |
56 | ngOnInit() {
57 |
58 | this.requirementForm = this.fb.group({
59 | requirement: ['', Validators.required],
60 | noOfResume: ['', Validators.required]
61 | })
62 |
63 | }
64 |
65 |
66 | onSubmit(){
67 | if (this.requirementForm.valid){
68 | this.nothingtoShow = false;
69 | this.isdataFetch = false;
70 | this.isrequirementFetch = true;
71 | console.log(this.requirementForm.value)
72 | this.resumeAPI.predict(this.requirementForm.value).subscribe(data => {
73 | console.log(data)
74 | this.skills = data.skills;
75 | this.expList = data.Experience;
76 | this.resumeList = data.result
77 | this.update()
78 | })
79 | }
80 | }
81 |
82 | update(){
83 | this.isrequirementFetch = false;
84 | this.isdataFetch = true;
85 | this.updateBarChart();
86 | this.updatePieChart();
87 |
88 | }
89 |
90 | updateBarChart(){
91 | this.barChartData = []
92 | this.skills.forEach(element => {
93 | this.barChartData.push({
94 | data: [element.value],
95 | label: element.key
96 | })
97 | });
98 | this.barChartData.push({
99 | data:[0],
100 | label: ''
101 | })
102 | console.log(this.barChartData);
103 | }
104 |
105 | updatePieChart(){
106 | this.pieChartLabels = []
107 | this.pieChartData = []
108 | this.expList.forEach(element => {
109 | this.pieChartLabels.push(element.key + " Yr")
110 | this.pieChartData.push(element.value)
111 | });
112 | }
113 |
114 | ngOnDestroy() {
115 | if (this.subscription !== undefined){
116 | this.subscription.unsubscribe();
117 | }
118 |
119 | }
120 |
121 | calculateSkills(resumeList){
122 |
123 | }
124 | }
125 |
--------------------------------------------------------------------------------
/web/src/app/material.module.ts:
--------------------------------------------------------------------------------
1 | import {NgModule} from '@angular/core';
2 | import {A11yModule} from '@angular/cdk/a11y';
3 | import {DragDropModule} from '@angular/cdk/drag-drop';
4 | import {PortalModule} from '@angular/cdk/portal';
5 | import {ScrollingModule} from '@angular/cdk/scrolling';
6 | import {CdkStepperModule} from '@angular/cdk/stepper';
7 | import {CdkTableModule} from '@angular/cdk/table';
8 | import {CdkTreeModule} from '@angular/cdk/tree';
9 | import {MatAutocompleteModule} from '@angular/material/autocomplete';
10 | import {MatBadgeModule} from '@angular/material/badge';
11 | import {MatBottomSheetModule} from '@angular/material/bottom-sheet';
12 | import {MatButtonModule} from '@angular/material/button';
13 | import {MatButtonToggleModule} from '@angular/material/button-toggle';
14 | import {MatCardModule} from '@angular/material/card';
15 | import {MatCheckboxModule} from '@angular/material/checkbox';
16 | import {MatChipsModule} from '@angular/material/chips';
17 | import {MatStepperModule} from '@angular/material/stepper';
18 | import {MatDatepickerModule} from '@angular/material/datepicker';
19 | import {MatDialogModule} from '@angular/material/dialog';
20 | import {MatDividerModule} from '@angular/material/divider';
21 | import {MatExpansionModule} from '@angular/material/expansion';
22 | import {MatGridListModule} from '@angular/material/grid-list';
23 | import {MatIconModule} from '@angular/material/icon';
24 | import {MatInputModule} from '@angular/material/input';
25 | import {MatListModule} from '@angular/material/list';
26 | import {MatMenuModule} from '@angular/material/menu';
27 | import {MatNativeDateModule, MatRippleModule} from '@angular/material/core';
28 | import {MatPaginatorModule} from '@angular/material/paginator';
29 | import {MatProgressBarModule} from '@angular/material/progress-bar';
30 | import {MatProgressSpinnerModule} from '@angular/material/progress-spinner';
31 | import {MatRadioModule} from '@angular/material/radio';
32 | import {MatSelectModule} from '@angular/material/select';
33 | import {MatSidenavModule} from '@angular/material/sidenav';
34 | import {MatSliderModule} from '@angular/material/slider';
35 | import {MatSlideToggleModule} from '@angular/material/slide-toggle';
36 | import {MatSnackBarModule} from '@angular/material/snack-bar';
37 | import {MatSortModule} from '@angular/material/sort';
38 | import {MatTableModule} from '@angular/material/table';
39 | import {MatTabsModule} from '@angular/material/tabs';
40 | import {MatToolbarModule} from '@angular/material/toolbar';
41 | import {MatTooltipModule} from '@angular/material/tooltip';
42 | import {MatTreeModule} from '@angular/material/tree';
43 |
44 | @NgModule({
45 | exports: [
46 | A11yModule,
47 | CdkStepperModule,
48 | CdkTableModule,
49 | CdkTreeModule,
50 | DragDropModule,
51 | MatAutocompleteModule,
52 | MatBadgeModule,
53 | MatBottomSheetModule,
54 | MatButtonModule,
55 | MatButtonToggleModule,
56 | MatCardModule,
57 | MatCheckboxModule,
58 | MatChipsModule,
59 | MatStepperModule,
60 | MatDatepickerModule,
61 | MatDialogModule,
62 | MatDividerModule,
63 | MatExpansionModule,
64 | MatGridListModule,
65 | MatIconModule,
66 | MatInputModule,
67 | MatListModule,
68 | MatMenuModule,
69 | MatNativeDateModule,
70 | MatPaginatorModule,
71 | MatProgressBarModule,
72 | MatProgressSpinnerModule,
73 | MatRadioModule,
74 | MatRippleModule,
75 | MatSelectModule,
76 | MatSidenavModule,
77 | MatSliderModule,
78 | MatSlideToggleModule,
79 | MatSnackBarModule,
80 | MatSortModule,
81 | MatTableModule,
82 | MatTabsModule,
83 | MatToolbarModule,
84 | MatTooltipModule,
85 | MatTreeModule,
86 | PortalModule,
87 | ScrollingModule,
88 | ]
89 | })
90 | export class MaterialModule {}
91 |
--------------------------------------------------------------------------------
/nlp/app.py:
--------------------------------------------------------------------------------
1 | from flask import Flask,request,jsonify
2 | from flask_restful import reqparse,Resource,Api
3 | import numpy as np
4 | import json
5 | import time
6 | import pandas as pd
7 | import requests
8 | from clustering.clustering import getVector,predict_classification
9 | from resumeParser import parseResume
10 | from flask_cors import CORS
11 |
12 |
13 | # import hindi modules
14 |
15 | #creating a flask app
16 | app=Flask(__name__)
17 | CORS(app)
18 | api=Api(app)
19 | uri = 'http://localhost:3000/getAll'
20 | STOPWORDS = ['Engineering', 'English', 'Programming', 'Computer science', 'Research', 'Technical', 'System', "Java"]
21 |
22 |
23 | class JsonAccumulator(Resource):
24 |
25 | def post(self):
26 | print('post function called')
27 | json_data = request.get_json(force=True)
28 | # print(json_data)
29 |
30 | url = json_data['url']
31 | result = parseResume(url)
32 |
33 | return result
34 |
35 |
36 | class JsonGetResumeGivenConstraints(Resource):
37 | def get(self):
38 | return "hello"
39 | def post(self):
40 | json_data = request.get_json(force=True)
41 |
42 | requirement = json_data['requirement']
43 |
44 | nresume= json_data['noOfResume']
45 | nresume = int(nresume)
46 |
47 | resume = requests.get(uri)
48 | resume = resume.json()
49 | mydict = {}
50 | keys = list(list(resume[0].keys()))
51 | for key in keys:
52 | mydict[key] = []
53 |
54 |
55 |
56 | for res in list(resume):
57 | for key in keys:
58 | mydict[key].append(res[key])
59 |
60 | df = pd.DataFrame(mydict)
61 |
62 | if nresume > df.shape[0]:
63 | nresume = df.shape[0] -1
64 |
65 | ids = df['_id'].values.tolist()
66 | rawResume = df['resume'].values.tolist()
67 |
68 | vec = getVector([requirement] + rawResume, ids)
69 |
70 | result = predict_classification(vec[1:], vec[0], nresume)
71 |
72 | finalResult = {}
73 |
74 | df['skills'] = df['skills'].apply(lambda x: x.split('$'))
75 | skillsList = df['skills'].values.tolist()
76 |
77 | skillDict = createDict(skillsList)
78 |
79 | finalResult['skills'] = skillDict
80 |
81 | df['total_experience'] = df['total_experience'].apply(lambda x: int(float(x)))
82 | expDict = createDict(df['total_experience'].values.tolist(), False)
83 |
84 | finalResult['Experience'] = expDict
85 |
86 | finalResume = []
87 | for item in result:
88 | temp = df[df['_id'] == item[0] ].to_dict()
89 | temp = cleanDict(temp)
90 | temp['score'] = item[1]
91 |
92 | finalResume.append(temp)
93 | finalResult['result'] = finalResume
94 |
95 | return finalResult
96 |
97 |
98 | def cleanDict(mydict):
99 | cleanDict = {}
100 | keys = list(mydict.keys())
101 | for key in keys:
102 | cleanDict[key] = list(mydict[key].values())[0]
103 |
104 | return cleanDict
105 |
106 |
107 | def createDict(array, flag =True):
108 | if flag ==True:
109 | array = [item for sublist in array for item in sublist]
110 | array = [w for w in array if not w in STOPWORDS]
111 |
112 | mydict = {}
113 | for item in array:
114 | if item in list(mydict.keys()):
115 | mydict[item] = mydict[item] + 1
116 | else:
117 | mydict[item] = 1
118 |
119 | newDict = sorted(mydict.items(), key=lambda x: x[1], reverse=True)
120 | newDict = list(newDict)
121 | if flag == True:
122 | newDict = newDict[:5]
123 |
124 | result = []
125 | for item in newDict:
126 | temp = {
127 | "key": item[0],
128 | "value": item[1]
129 | }
130 | result.append(temp)
131 |
132 | return result
133 |
134 | api.add_resource(JsonAccumulator,'/prediction')
135 | api.add_resource(JsonGetResumeGivenConstraints,"/")
136 |
137 | if __name__=='__main__':
138 | app.run(debug=True)
--------------------------------------------------------------------------------
/nlp/resumeParser.py:
--------------------------------------------------------------------------------
1 | from pyresparser import ResumeParser
2 |
3 | import io
4 | import os
5 | import re
6 | import nltk
7 | from pdfminer.converter import TextConverter
8 | from pdfminer.pdfinterp import PDFPageInterpreter
9 | from pdfminer.pdfinterp import PDFResourceManager
10 | from pdfminer.layout import LAParams
11 | from pdfminer.pdfpage import PDFPage
12 | from pdfminer.pdfparser import PDFSyntaxError
13 | import wget
14 | import pdfx
15 |
16 |
17 | url = 'https://viditkhemka00.s3.amazonaws.com/Vidit.pdf'
18 |
19 | def extractLink(path):
20 | pdf = pdfx.PDFx(path)
21 | urls = pdf.get_references_as_dict()
22 | if 'url' in list(urls.keys()):
23 | return urls[url]
24 | return []
25 |
26 | def serializeJSON(json_data):
27 | result = {}
28 |
29 | for key in list(json_data.keys()):
30 | if type(json_data[key]) == type([]):
31 | result[key] = "$".join(json_data[key])
32 | else:
33 | result[key] = str(json_data[key])
34 |
35 | return result
36 |
37 | def parseResume(url):
38 | fileName = downloadFile(url)
39 | data = extractInfo(fileName)
40 | data['resume'] = pdf_to_text(fileName)
41 | data = serializeJSON(data)
42 | os.remove(fileName)
43 | return data
44 |
45 | def downloadFile(url):
46 | filename = url.split('/')[-1]
47 | wget.download(url, filename)
48 | return filename
49 |
50 |
51 | def extractInfo(path):
52 | data = ResumeParser(path).get_extracted_data()
53 | return data
54 |
55 | def pdf_to_text(path):
56 | mygen = extract_text_from_pdf(path)
57 | resume = []
58 | for item in mygen:
59 | resume.append(item)
60 |
61 | return ' '.join(resume)
62 |
63 | def extract_text_from_pdf(pdf_path):
64 |
65 | if not isinstance(pdf_path, io.BytesIO):
66 | # extract text from local pdf file
67 | with open(pdf_path, 'rb') as fh:
68 | try:
69 | for page in PDFPage.get_pages(
70 | fh,
71 | caching=True,
72 | check_extractable=True
73 | ):
74 | resource_manager = PDFResourceManager()
75 | fake_file_handle = io.StringIO()
76 | converter = TextConverter(
77 | resource_manager,
78 | fake_file_handle,
79 |
80 | laparams=LAParams()
81 | )
82 | page_interpreter = PDFPageInterpreter(
83 | resource_manager,
84 | converter
85 | )
86 | page_interpreter.process_page(page)
87 |
88 | text = fake_file_handle.getvalue()
89 | yield text
90 |
91 | # close open handles
92 | converter.close()
93 | fake_file_handle.close()
94 | except PDFSyntaxError:
95 | return
96 | else:
97 | # extract text from remote pdf file
98 | try:
99 | for page in PDFPage.get_pages(
100 | pdf_path,
101 | caching=True,
102 | check_extractable=True
103 | ):
104 | resource_manager = PDFResourceManager()
105 | fake_file_handle = io.StringIO()
106 | converter = TextConverter(
107 | resource_manager,
108 | fake_file_handle,
109 | laparams=LAParams()
110 | )
111 | page_interpreter = PDFPageInterpreter(
112 | resource_manager,
113 | converter
114 | )
115 | page_interpreter.process_page(page)
116 |
117 | text = fake_file_handle.getvalue()
118 | yield text
119 |
120 | # close open handles
121 | converter.close()
122 | fake_file_handle.close()
123 | except PDFSyntaxError:
124 | return
125 |
126 |
127 |
--------------------------------------------------------------------------------
/web/src/app/components/dashboard/dashboard.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
36 |
37 |
38 |
39 |
40 |
41 |
No requirement found
42 |
43 |
44 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
66 |
67 |
68 |
69 |
70 |
71 | Skills Dashboard
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
89 |
90 |
91 |
92 |
93 |
94 |
95 | Experience Dashboard
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
--------------------------------------------------------------------------------
/web/angular.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
3 | "version": 1,
4 | "newProjectRoot": "projects",
5 | "projects": {
6 | "web": {
7 | "projectType": "application",
8 | "schematics": {},
9 | "root": "",
10 | "sourceRoot": "src",
11 | "prefix": "app",
12 | "architect": {
13 | "build": {
14 | "builder": "@angular-devkit/build-angular:browser",
15 | "options": {
16 | "outputPath": "dist/web",
17 | "index": "src/index.html",
18 | "main": "src/main.ts",
19 | "polyfills": "src/polyfills.ts",
20 | "tsConfig": "tsconfig.app.json",
21 | "aot": false,
22 | "assets": [
23 | "src/favicon.ico",
24 | "src/assets"
25 | ],
26 | "styles": [
27 | "./node_modules/@angular/material/prebuilt-themes/indigo-pink.css",
28 | "src/styles.css"
29 | ],
30 | "scripts": []
31 | },
32 | "configurations": {
33 | "production": {
34 | "fileReplacements": [
35 | {
36 | "replace": "src/environments/environment.ts",
37 | "with": "src/environments/environment.prod.ts"
38 | }
39 | ],
40 | "optimization": true,
41 | "outputHashing": "all",
42 | "sourceMap": false,
43 | "extractCss": true,
44 | "namedChunks": false,
45 | "aot": true,
46 | "extractLicenses": true,
47 | "vendorChunk": false,
48 | "buildOptimizer": true,
49 | "budgets": [
50 | {
51 | "type": "initial",
52 | "maximumWarning": "2mb",
53 | "maximumError": "5mb"
54 | },
55 | {
56 | "type": "anyComponentStyle",
57 | "maximumWarning": "6kb",
58 | "maximumError": "10kb"
59 | }
60 | ]
61 | }
62 | }
63 | },
64 | "serve": {
65 | "builder": "@angular-devkit/build-angular:dev-server",
66 | "options": {
67 | "browserTarget": "web:build"
68 | },
69 | "configurations": {
70 | "production": {
71 | "browserTarget": "web:build:production"
72 | }
73 | }
74 | },
75 | "extract-i18n": {
76 | "builder": "@angular-devkit/build-angular:extract-i18n",
77 | "options": {
78 | "browserTarget": "web:build"
79 | }
80 | },
81 | "test": {
82 | "builder": "@angular-devkit/build-angular:karma",
83 | "options": {
84 | "main": "src/test.ts",
85 | "polyfills": "src/polyfills.ts",
86 | "tsConfig": "tsconfig.spec.json",
87 | "karmaConfig": "karma.conf.js",
88 | "assets": [
89 | "src/favicon.ico",
90 | "src/assets"
91 | ],
92 | "styles": [
93 | "./node_modules/@angular/material/prebuilt-themes/indigo-pink.css",
94 | "src/styles.css"
95 | ],
96 | "scripts": []
97 | }
98 | },
99 | "lint": {
100 | "builder": "@angular-devkit/build-angular:tslint",
101 | "options": {
102 | "tsConfig": [
103 | "tsconfig.app.json",
104 | "tsconfig.spec.json",
105 | "e2e/tsconfig.json"
106 | ],
107 | "exclude": [
108 | "**/node_modules/**"
109 | ]
110 | }
111 | },
112 | "e2e": {
113 | "builder": "@angular-devkit/build-angular:protractor",
114 | "options": {
115 | "protractorConfig": "e2e/protractor.conf.js",
116 | "devServerTarget": "web:serve"
117 | },
118 | "configurations": {
119 | "production": {
120 | "devServerTarget": "web:serve:production"
121 | }
122 | }
123 | }
124 | }
125 | }
126 | },
127 | "defaultProject": "web"
128 | }
--------------------------------------------------------------------------------