├── 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 |
5 |
6 |

Loading

7 |
8 | 9 |
10 |
11 |

Resume List

12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 |
No. {{element.position}} Name {{element.name}} Email {{element.email}} Experience ( Yrs) {{element.experience}}
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 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 |
No. {{element.position}} Name {{element.name}} Email {{element.email}} Contact No {{element.phoneNo}} Skill Match
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 |
6 | 7 |
8 |
9 |
10 |

Enter Your Requirement

11 |
12 |
13 | 14 |
15 | 16 |
17 | 18 |
19 |
20 |
21 |
22 | 23 | 24 |
25 |
26 |
27 | 28 |
29 |
30 |
31 | 32 |
33 |
34 | 35 |
36 |
37 | 38 | 39 |
40 |
41 |

No requirement found

42 |
43 | 44 |
45 |
46 |

Loading

47 |
48 | 49 | 50 | 51 |
52 | 53 |
54 |
55 |
56 | 57 |
58 | 65 | 66 |
67 | 68 | 69 |
70 |
71 | Skills Dashboard 72 |
73 |
74 |
75 |
76 | 77 |
78 |
79 | 80 |
81 | 88 | 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 | } --------------------------------------------------------------------------------