akshaybabu06 commited on
Commit
eb7a003
·
verified ·
1 Parent(s): aa31414
Files changed (10) hide show
  1. .dockerignore +10 -0
  2. .env.example +6 -0
  3. .gitignore +224 -0
  4. .pypirc +4 -0
  5. Dockerfile +17 -0
  6. LICENSE +21 -0
  7. pipeline.py +45 -0
  8. pyproject.toml +43 -0
  9. pytest.ini +11 -0
  10. requirements.txt +166 -0
.dockerignore ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ .github
2
+ .pytest_cache
3
+ __pycache__
4
+ .venv
5
+ build
6
+ jobauto.egg-info
7
+ test
8
+ feat_to_add.txt
9
+ pytest.ini
10
+ api
.env.example ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ JOBAUTO_API_URL = ""
2
+ JOBAUTO_API_KEY = "API_KEY_HERE"
3
+
4
+ TABLE_NAME = ""
5
+ SUPA_URL = ""
6
+ SUPA_KEY = "" # Service Key is required
.gitignore ADDED
@@ -0,0 +1,224 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[codz]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py.cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ .pybuilder/
76
+ target/
77
+
78
+ # Jupyter Notebook
79
+ .ipynb_checkpoints
80
+
81
+ # IPython
82
+ profile_default/
83
+ ipython_config.py
84
+
85
+ # pyenv
86
+ # For a library or package, you might want to ignore these files since the code is
87
+ # intended to run in multiple environments; otherwise, check them in:
88
+ # .python-version
89
+
90
+ # pipenv
91
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
93
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
94
+ # install all needed dependencies.
95
+ # Pipfile.lock
96
+
97
+ # UV
98
+ # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
99
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
100
+ # commonly ignored for libraries.
101
+ # uv.lock
102
+
103
+ # poetry
104
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
105
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
106
+ # commonly ignored for libraries.
107
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
108
+ # poetry.lock
109
+ # poetry.toml
110
+
111
+ # pdm
112
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
113
+ # pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
114
+ # https://pdm-project.org/en/latest/usage/project/#working-with-version-control
115
+ # pdm.lock
116
+ # pdm.toml
117
+ .pdm-python
118
+ .pdm-build/
119
+
120
+ # pixi
121
+ # Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
122
+ # pixi.lock
123
+ # Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
124
+ # in the .venv directory. It is recommended not to include this directory in version control.
125
+ .pixi
126
+
127
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
128
+ __pypackages__/
129
+
130
+ # Celery stuff
131
+ celerybeat-schedule
132
+ celerybeat.pid
133
+
134
+ # Redis
135
+ *.rdb
136
+ *.aof
137
+ *.pid
138
+
139
+ # RabbitMQ
140
+ mnesia/
141
+ rabbitmq/
142
+ rabbitmq-data/
143
+
144
+ # ActiveMQ
145
+ activemq-data/
146
+
147
+ # SageMath parsed files
148
+ *.sage.py
149
+
150
+ # Environments
151
+ .env
152
+ .envrc
153
+ .venv
154
+ env/
155
+ venv/
156
+ ENV/
157
+ env.bak/
158
+ venv.bak/
159
+ api_tok.csv
160
+
161
+ # Spyder project settings
162
+ .spyderproject
163
+ .spyproject
164
+
165
+ # Rope project settings
166
+ .ropeproject
167
+
168
+ # mkdocs documentation
169
+ /site
170
+
171
+ # mypy
172
+ .mypy_cache/
173
+ .dmypy.json
174
+ dmypy.json
175
+
176
+ # Pyre type checker
177
+ .pyre/
178
+
179
+ # pytype static type analyzer
180
+ .pytype/
181
+
182
+ # Cython debug symbols
183
+ cython_debug/
184
+
185
+ # PyCharm
186
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
187
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
188
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
189
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
190
+ # .idea/
191
+
192
+ # Abstra
193
+ # Abstra is an AI-powered process automation framework.
194
+ # Ignore directories containing user credentials, local state, and settings.
195
+ # Learn more at https://abstra.io/docs
196
+ .abstra/
197
+
198
+ # Visual Studio Code
199
+ # Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
200
+ # that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
201
+ # and can be added to the global gitignore or merged into this file. However, if you prefer,
202
+ # you could uncomment the following to ignore the entire vscode folder
203
+ .vscode/
204
+ settings.json
205
+ # Temporary file for partial code execution
206
+ tempCodeRunnerFile.py
207
+
208
+ # Ruff stuff:
209
+ .ruff_cache/
210
+
211
+ # PyPI configuration file
212
+ .pypirc
213
+
214
+ # Marimo
215
+ marimo/_static/
216
+ marimo/_lsp/
217
+ __marimo__/
218
+
219
+ # Streamlit
220
+ .streamlit/secrets.toml
221
+
222
+ logs
223
+ .pipeline_runs
224
+ feat_to_add.txt
.pypirc ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ [pypi]
2
+ username = __token__
3
+ password = pypi-AgEIcHlwaS5vcmcCJGNjMWYwZGU1LTg1ZDQtNDMwOC05MmIxLWEyMGIzZjkyN2I3YQACKlszLCI3YzhmZjEyNi1hMzJlLTRhMzYtYTE3ZC00OWIzNGI2ZWU2MDAiXQAABiB1qPdzQSxWCnokcPpAFHgAReDSeC1nEP7nBWgztR2U8w
4
+
Dockerfile ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.12-slim
2
+
3
+ ENV PYTHONDONTWRITEBYTECODE=1
4
+ ENV PYTHONUNBUFFERED=1
5
+
6
+ WORKDIR /Job-Description-Analysis
7
+
8
+ RUN apt-get update && apt-get install -y --no-install-recommends build-essential && rm -rf /var/lib/apt/lists/*
9
+
10
+ COPY ./requirements.txt /Job-Description-Analysis/requirements.txt
11
+ RUN pip install --no-cache-dir -r requirements.txt
12
+
13
+ COPY . /Job-Description-Analysis
14
+
15
+ EXPOSE 5500
16
+
17
+ # CMD ["streamlit", "run", "app.py", "--server.port=5500", "--server.address=0.0.0.0"]
LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Akshay_Babu
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
pipeline.py ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ pipeline.py - Main training pipeline, run this to retrain the model
3
+ """
4
+
5
+ import subprocess as sub
6
+ from pathlib import Path
7
+
8
+ REPO_ROOT = Path(__file__).resolve().parent
9
+
10
+ try :
11
+ import nbformat
12
+ from nbconvert.preprocessors import ExecutePreprocessor
13
+ except ModuleNotFoundError :
14
+ print("Please Install nbconvert using pip or uv")
15
+ nbformat = None
16
+ ExecutePreprocessor = None
17
+
18
+ def run_notebook(notebook_path: str, kernel_name: str = "python3") -> None:
19
+ if nbformat is None or ExecutePreprocessor is None:
20
+ print(f"Skipping {notebook_path} (nbformat/nbconvert not installed)")
21
+ return
22
+
23
+ print(f"Starting: {notebook_path}")
24
+
25
+ with open(notebook_path, "r", encoding="utf-8") as f:
26
+ nb = nbformat.read(f, as_version=4)
27
+
28
+ ep = ExecutePreprocessor(timeout=600, kernel_name=kernel_name)
29
+
30
+ ep.preprocess(nb, {"metadata": {"path": "./"}})
31
+
32
+ with open(notebook_path, "w", encoding="utf-8") as f:
33
+ nbformat.write(nb, f)
34
+
35
+ print(f"Finished: {notebook_path}\n")
36
+
37
+ def run_scripts(script_path: str, shell_name: str = "python") -> None:
38
+ print(f"Running scripts from {script_path}")
39
+
40
+ sub.run([f"{shell_name}", f"{script_path}"], cwd=REPO_ROOT, check=True)
41
+
42
+ run_notebook("notebooks/01_EDA.ipynb")
43
+ run_notebook("notebooks/02_Data_Engineering.ipynb")
44
+ run_scripts("model/prep/data_prep.py")
45
+ run_scripts("model/Model.py")
pyproject.toml ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [project]
2
+ name = "JobSelect"
3
+ version = "0.11.6"
4
+ dependencies = [
5
+ "rich==15.0.0",
6
+ "pyfiglet==1.0.4",
7
+ "scikit-learn==1.9.0",
8
+ "uvicorn==0.50.2",
9
+ "pydantic==2.13.4",
10
+ "requests==2.34.2",
11
+ "torch==2.12.1"
12
+ ]
13
+ authors = [
14
+ { name="Akshay Babu", email="akshaysureshbabu100@gmail.com" },
15
+ ]
16
+ description = "A CLI Based AI Skill Classifier for Job Descriptions Build by Akshay Babu"
17
+ readme = "README.md"
18
+ requires-python = ">=3.12"
19
+ classifiers = [
20
+ "Programming Language :: Python :: 3",
21
+ "Operating System :: OS Independent",
22
+ ]
23
+ license = "MIT"
24
+ license-files = ["LICEN[CS]E*"]
25
+
26
+ [project.urls]
27
+ Homepage = "https://github.com/Ak47xdd/Job-Description-Analysis"
28
+
29
+ # CLI entrypoint
30
+ [project.scripts]
31
+ jobselect = "cli.jobselect:cli"
32
+
33
+ [tool.setuptools]
34
+ package-dir = {"" = "."}
35
+
36
+ [tool.setuptools.packages.find]
37
+ where = ["."]
38
+ include = ["cli*", "model*", "model_out*"]
39
+ exclude = ["data*", "notebooks*", "test*"]
40
+
41
+ [tool.setuptools.package-data]
42
+ "model.prep" = ["label_vocab.json", "vectorizer.pkl", "prepared_data.npz"]
43
+ "model_out" = ["skill_classifier.pt", "training_history.json"]
pytest.ini ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [pytest]
2
+ minversion = 8.0
3
+ testpaths = test
4
+ addopts = -ra --strict-markers --strict-config --import-mode=importlib --tb=short
5
+ markers =
6
+ slow: Marks tests as slow
7
+ integration: Marks tests requiring external systems
8
+ smoke: Core functionality checks
9
+ log_cli = true
10
+ log_cli_level = INFO
11
+ log_cli_format = %(asctime)s [%(levelname)8s] %(message)s (%(filename)s:%(lineno)s)
requirements.txt ADDED
@@ -0,0 +1,166 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ aiofile==3.11.1
2
+ annotated-doc==0.0.4
3
+ annotated-types==0.7.0
4
+ anyio==4.14.1
5
+ asttokens==3.0.1
6
+ attrs==26.1.0
7
+ Authlib==1.7.2
8
+ beartype==0.22.9
9
+ beautifulsoup4==4.15.0
10
+ bleach==6.4.0
11
+ build==1.5.0
12
+ cachetools==7.1.4
13
+ caio==0.9.25
14
+ certifi==2026.6.17
15
+ cffi==2.1.0
16
+ charset-normalizer==3.4.8
17
+ click==8.4.2
18
+ colorama==0.4.6
19
+ comm==0.2.3
20
+ cryptography==49.0.0
21
+ cyclopts==4.21.1
22
+ debugpy==1.8.21
23
+ decorator==5.3.1
24
+ defusedxml==0.7.1
25
+ Deprecated==1.3.1
26
+ deprecation==2.1.0
27
+ dnspython==2.8.0
28
+ docstring_parser==0.18.0
29
+ docutils==0.23
30
+ dotenv==0.9.9
31
+ email-validator==2.3.0
32
+ exceptiongroup==1.3.1
33
+ executing==2.2.1
34
+ fastapi==0.139.0
35
+ fastjsonschema==2.21.2
36
+ fastmcp==3.4.4
37
+ fastmcp-slim==3.4.4
38
+ filelock==3.29.4
39
+ fsspec==2026.6.0
40
+ griffelib==2.1.0
41
+ h11==0.16.0
42
+ h2==4.3.0
43
+ hpack==4.2.0
44
+ httpcore==1.0.9
45
+ httpx==0.28.1
46
+ httpx-sse==0.4.3
47
+ hyperframe==6.1.0
48
+ id==1.6.1
49
+ idna==3.18
50
+ iniconfig==2.3.0
51
+ ipykernel==7.3.0
52
+ ipython==9.15.0
53
+ ipython_pygments_lexers==1.1.1
54
+ jaraco.classes==3.4.0
55
+ jaraco.context==6.1.2
56
+ jaraco.functools==4.5.0
57
+ jedi==0.20.0
58
+ Jinja2==3.1.6
59
+ joblib==1.5.3
60
+ joserfc==1.7.3
61
+ jsonref==1.1.0
62
+ jsonschema==4.26.0
63
+ jsonschema-path==0.5.0
64
+ jsonschema-specifications==2025.9.1
65
+ jupyter_client==8.9.1
66
+ jupyter_core==5.9.1
67
+ jupyterlab_pygments==0.3.0
68
+ keyboard==0.13.5
69
+ keyring==25.7.0
70
+ limits==5.8.0
71
+ linkify-it-py==2.1.0
72
+ markdown-it-py==4.2.0
73
+ MarkupSafe==3.0.3
74
+ matplotlib-inline==0.2.2
75
+ mcp==1.28.1
76
+ mdit-py-plugins==0.6.1
77
+ mdurl==0.1.2
78
+ mistune==3.3.2
79
+ more-itertools==11.1.0
80
+ mpmath==1.3.0
81
+ multidict==6.7.1
82
+ narwhals==2.22.1
83
+ nbclient==0.11.0
84
+ nbconvert==7.17.1
85
+ nbformat==5.10.4
86
+ nest-asyncio2==1.7.2
87
+ networkx==3.6.1
88
+ nh3==0.3.6
89
+ numpy==2.4.6
90
+ openapi-pydantic==0.5.1
91
+ opentelemetry-api==1.44.0
92
+ packaging==26.2
93
+ pandas==3.0.3
94
+ pandocfilters==1.5.1
95
+ parso==0.8.7
96
+ pathable==0.6.0
97
+ platformdirs==4.10.0
98
+ pluggy==1.6.0
99
+ postgrest==2.31.0
100
+ prompt_toolkit==3.0.52
101
+ propcache==0.5.2
102
+ psutil==7.2.2
103
+ pure_eval==0.2.3
104
+ py-key-value-aio==0.4.5
105
+ pycparser==3.0
106
+ pydantic==2.13.4
107
+ pydantic-settings==2.14.2
108
+ pydantic_core==2.46.4
109
+ pyfiglet==1.0.4
110
+ Pygments==2.20.0
111
+ PyJWT==2.13.0
112
+ pyperclip==1.11.0
113
+ pyproject_hooks==1.2.0
114
+ pytest==9.1.1
115
+ python-dateutil==2.9.0.post0
116
+ python-dotenv==1.2.2
117
+ python-multipart==0.0.32
118
+ pywin32==312
119
+ pywin32-ctypes==0.2.3
120
+ PyYAML==6.0.3
121
+ pyzmq==27.1.0
122
+ readme_renderer==45.0
123
+ realtime==2.31.0
124
+ referencing==0.37.0
125
+ requests==2.34.2
126
+ requests-toolbelt==1.0.0
127
+ rfc3986==2.0.0
128
+ rich==15.0.0
129
+ rich-rst==2.1.0
130
+ rpds-py==2026.5.1
131
+ scikit-learn==1.9.0
132
+ scipy==1.17.1
133
+ setuptools==81.0.0
134
+ six==1.17.0
135
+ sk==0.0.1
136
+ slowapi==0.1.10
137
+ soupsieve==2.8.4
138
+ sse-starlette==3.4.5
139
+ stack-data==0.6.3
140
+ starlette==1.3.1
141
+ storage3==2.31.0
142
+ StrEnum==0.4.15
143
+ supabase==2.31.0
144
+ supabase-auth==2.31.0
145
+ supabase-functions==2.31.0
146
+ sympy==1.14.0
147
+ textual==8.2.8
148
+ threadpoolctl==3.6.0
149
+ tinycss2==1.5.1
150
+ torch==2.12.1
151
+ tornado==6.5.7
152
+ traitlets==5.15.1
153
+ twine==6.2.0
154
+ typing-inspection==0.4.2
155
+ typing_extensions==4.15.0
156
+ tzdata==2026.2
157
+ uc-micro-py==2.0.0
158
+ uncalled-for==0.3.2
159
+ urllib3==2.7.0
160
+ uvicorn==0.50.2
161
+ watchfiles==1.2.0
162
+ wcwidth==0.8.1
163
+ webencodings==0.5.1
164
+ websockets==15.0.1
165
+ wrapt==2.2.2
166
+ yarl==1.24.2