File size: 2,631 Bytes
a8ee0db
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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