Skip to content
Closed
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 8 additions & 7 deletions be_repo/modules/job_recommendation_system.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
# job_recommendation_system.py

import logging

from .neo4j_model import Neo4jModel
from .recommendation_generator import RecommendationGenerator
from .resume_processor import ResumeProcessor
from .retrieval_engine import RetrievalEngine
from .recommendation_generator import RecommendationGenerator
from .view import CLIView

import logging
import sys

def job_recommend(resume_text, user_id):
# Setup Logging
Expand All @@ -21,8 +20,8 @@ def job_recommend(resume_text, user_id):

# Neo4j Connection Details
NEO4J_URI = "neo4j+ssc://7bf5a48e.databases.neo4j.io" # Replace with your Neo4j URI
NEO4J_USERNAME = "neo4j" # Replace with your Neo4j username
NEO4J_PASSWORD = "oxsK7V5_86emZlYQlvCfQHfVWS95wXz29OhtU8GAdFc" # Replace with your Neo4j password
NEO4J_USERNAME = "neo4j" # Replace with your Neo4j username
NEO4J_PASSWORD = "oxsK7V5_86emZlYQlvCfQHfVWS95wXz29OhtU8GAdFc" # Replace with your Neo4j password

# Initialize Model
neo4j_model = Neo4jModel(
Expand All @@ -31,6 +30,8 @@ def job_recommend(resume_text, user_id):
password=NEO4J_PASSWORD
)

node_label = "JTitle" # Adjust as needed; could be dynamic based on user input or other criteria

# Initialize Controller Components
resume_processor = ResumeProcessor()
retrieval_engine = RetrievalEngine(resume_processor, neo4j_model)
Expand All @@ -40,7 +41,7 @@ def job_recommend(resume_text, user_id):
view = CLIView()

# Perform Mixed Retrieval
similar_docs, graph_results = retrieval_engine.perform_mixed_retrieval(resume_text, node_label='JTitle')
similar_docs, graph_results = retrieval_engine.perform_mixed_retrieval(resume_text, node_label=node_label)

if not similar_docs and not graph_results:
return 'No job recommendations found based on your resume.'
Expand Down
34 changes: 20 additions & 14 deletions be_repo/modules/recommendation_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,36 +9,42 @@ def merge_results(self, vector_docs, graph_results):

# Process vector similarity results
for doc in vector_docs:
comp = doc.metadata.get("comp", "")
resp = doc.metadata.get("resp", "")
job_title = f"{resp} at {comp}".strip()
if job_title:
combined_jobs[job_title] = combined_jobs.get(job_title, 0) + 1
# Exclude 'id' and get all other non-empty metadata properties
metadata = {k: v for k, v in doc.metadata.items() if k != 'id' and v}
# Create a description string from the non-empty properties
job_description = ', '.join(f"{k}: {v}" for k, v in metadata.items())
if job_description:
combined_jobs[job_description] = combined_jobs.get(job_description, 0) + 1

# Process graph traversal results
# Access the context from intermediate steps
intermediate_steps = graph_results.get('intermediate_steps', [])
if len(intermediate_steps) > 1:
context = intermediate_steps[1].get('context', [])
for job in context:
job_title = job.get('job_title', '')
company = job.get('company', '')
if job_title and company:
combined_job = f"{job_title} at {company}"
combined_jobs[combined_job] = combined_jobs.get(combined_job, 0) + 1
# Exclude 'id' and get all other non-empty properties
job_data = {k: v for k, v in job.items() if k != 'id' and v}
# Create a description string
job_description = ', '.join(f"{k}: {v}" for k, v in job_data.items())
if job_description:
combined_jobs[job_description] = combined_jobs.get(job_description, 0) + 1

# Include the 'result' from 'graph_results' directly
graph_result_text = graph_results.get('result', '').strip()
if graph_result_text:
combined_jobs[graph_result_text] = combined_jobs.get(graph_result_text, 0) + 1

# Convert to sorted list based on combined score
sorted_jobs = sorted(combined_jobs.items(), key=lambda item: item[1], reverse=True)
return [job for job, score in sorted_jobs]

def generate_recommendations(self, vector_docs, graph_results):
"""
Generate a ranked list of job recommendations by merging vector and graph results.

Parameters:
vector_docs (List[Document]): Documents from vector similarity search.
graph_results (dict): Results from graph traversal.

Returns:
List[str]: Ranked list of unique job recommendations.
"""
Expand Down