Spaces:
Sleeping
Sleeping
| import torch | |
| from transformers import pipeline | |
| from sentence_transformers import SentenceTransformer, util | |
| class MultiModelInterviewAnalyzer: | |
| def __init__(self): | |
| self.sentiment_analyzer = pipeline( | |
| "text-classification", | |
| model="astrosbd/french_emotion_camembert", | |
| return_all_scores=True, | |
| device=0 if torch.cuda.is_available() else -1, | |
| ) | |
| self.similarity_model = SentenceTransformer('all-MiniLM-L6-v2') | |
| self.intent_classifier = pipeline( | |
| "zero-shot-classification", | |
| model="joeddav/xlm-roberta-large-xnli" | |
| #device=0 if torch.cuda.is_available() else -1, | |
| ) | |
| def analyze_sentiment(self, messages): | |
| user_messages = [msg['content'] for msg in messages if msg['role'] == 'user'] | |
| if not user_messages: | |
| return [] | |
| sentiments = self.sentiment_analyzer(user_messages) | |
| return sentiments | |
| def compute_semantic_similarity(self, messages, job_requirements): | |
| user_answers = " ".join([msg['content'] for msg in messages if msg['role'] == 'user']) | |
| embedding_answers = self.similarity_model.encode(user_answers, convert_to_tensor=True) | |
| embedding_requirements = self.similarity_model.encode(job_requirements, convert_to_tensor=True) | |
| cosine_score = util.cos_sim(embedding_answers, embedding_requirements) | |
| return cosine_score.item() | |
| def classify_candidate_intent(self, messages): | |
| user_answers = [msg['content'] for msg in messages if msg['role'] == 'user'] | |
| if not user_answers: | |
| return [] | |
| candidate_labels = [ | |
| "parle de son expérience technique", | |
| "exprime sa motivation", | |
| "pose une question", | |
| "exprime de l’incertitude ou du stress" | |
| ] | |
| classifications = self.intent_classifier(user_answers, candidate_labels, multi_label=False) | |
| return classifications | |
| def run_full_analysis(self, conversation_history, job_requirements): | |
| sentiment_results = self.analyze_sentiment(conversation_history) | |
| similarity_score = self.compute_semantic_similarity(conversation_history, job_requirements) | |
| intent_results = self.classify_candidate_intent(conversation_history) | |
| analysis_output = { | |
| "overall_similarity_score": round(similarity_score, 2), | |
| "sentiment_analysis": sentiment_results, | |
| "intent_analysis": intent_results, | |
| "raw_transcript": conversation_history | |
| } | |
| return analysis_output |