Skip to content

Commit bd1412a

Browse files
committed
refactor(core): refactorisation de computeResponseScore()
1 parent 8aaa3e5 commit bd1412a

3 files changed

Lines changed: 36 additions & 16 deletions

File tree

app/js/core/interactions/helpers/findBestResponse/computeResponseScore.mjs

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,7 @@ const LEVENSHTEIN_THRESHOLD = 3; // Seuil de similarité (tolérance des fautes
99
const MATCH_SCORE_IDENTITY = 30; // Pour régler le fait de privilégier l'identité d'un keyword à la simple similarité
1010
const WORD_LENGTH_FACTOR = 0.1; // Prise en compte de la taille des keywords (plus les keywords sont grands, plus ils doivent avoir un poids important)
1111

12-
export function computeResponseScore({
13-
chatbot,
14-
userInput,
15-
response,
16-
responseIndex,
17-
}) {
18-
const next = chatbot.nextMessage;
19-
let bestDistanceScore = 0;
12+
function buildKeywordsList(next, response) {
2013
// Si on a la directive !Next, alors on ne teste pas la correspondance avec le titre, mais seulement avec les keywords (sauf s'il n'y a pas de keyword)
2114
// Sinon on inclut le titre
2215
// On met tout en minuscule
@@ -28,21 +21,45 @@ export function computeResponseScore({
2821
: response.keywords
2922
.concat(response.title)
3023
.map((keyword) => keyword.toLowerCase());
24+
return keywords;
25+
}
26+
27+
function calculateCosineSimilarityScore(
28+
chatbot,
29+
userInput,
30+
responseIndex,
31+
next,
32+
) {
33+
const vectorResponses = chatbot.vectorChatBotResponses;
34+
const cosSim = cosineSimilarity(userInput, vectorResponses[responseIndex], {
35+
boostIfKeywordsInTitle: next && next.goto,
36+
});
37+
return cosSim ? cosSim + 0.5 : 0;
38+
}
39+
3140
export function computeResponseScore({
3241
chatbot,
3342
userInput,
3443
response,
3544
responseIndex,
3645
yaml,
3746
}) {
47+
const next = chatbot.nextMessage;
48+
let bestDistanceScore = 0;
49+
// Si on a la directive !Next, alors on ne teste pas la correspondance avec le titre, mais seulement avec les keywords (sauf s'il n'y a pas de keyword)
50+
// Sinon on inclut le titre
51+
// On met tout en minuscule
52+
const keywords = buildKeywordsList(next, response);
3853
let matchScore = 0;
3954
let distanceScore = 0;
55+
// Si le YAML indique de faire une recherche dans le contenu avec la similarité vectorielle, on prend comme base de score le cosine similarity entre le message de l'utilisateur et le contenu vectoriel de la réponse
4056
if (yaml && yaml.searchInContent) {
41-
const vectorResponses = chatbot.vectorChatBotResponses;
42-
const cosSim = cosineSimilarity(userInput, vectorResponses[responseIndex], {
43-
boostIfKeywordsInTitle: next && next.goto,
44-
});
45-
matchScore = matchScore + cosSim + 0.5;
57+
matchScore = calculateCosineSimilarityScore(
58+
chatbot,
59+
userInput,
60+
responseIndex,
61+
next,
62+
);
4663
}
4764
for (let keyword of keywords) {
4865
// On prend en compte les keywords négatifs (on ne doit pas les voir dans la question de l'utilisateur)
@@ -101,7 +118,10 @@ export function computeResponseScore({
101118
if (distanceScore < 0) {
102119
matchScore = 0;
103120
}
104-
if ((matchScore == 0 || yaml.searchInContent) && !next.needsProcessing) {
121+
if (
122+
(matchScore == 0 || (yaml && yaml.searchInContent)) &&
123+
!next.needsProcessing
124+
) {
105125
// En cas de simple similarité : on monte quand même le score. Mais si on est dans le mode où on va directement à une réponse en testant la présence de keywords, la correspondance doit être stricte, on ne fait pas de calcul de similarité
106126
if (distanceScore > bestDistanceScore) {
107127
matchScore = matchScore + distanceScore;

app/script.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/script.min.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)