chatbot-js / adapters /best-match.js
mr4's picture
Upload 26 files
91111e4 verified
Raw History Blame Contribute Delete
2.65 kB
// ============================================================
// Best Match Adapter — So khớp tương đồng chuỗi với tập Q&A
// Phụ thuộc: currentLang, _adapterPath, textSimilarity, removeVietnameseDiacritics,
// QA_DATASET, findBestMatchPreprocessed (optional)
// ============================================================
function bestMatchAdapter(rs, args) {
_adapterPath.push('best_match');
var input = (args || []).join(' ').trim();
var lang = currentLang || 'vi';
var threshold = 0.55;
if (input.length === 0) {
if (lang === 'en') return { answer: 'Please provide a question to search for.', score: 0 };
if (lang === 'ja') return { answer: '検索する質問を入力してください。', score: 0 };
return { answer: 'Vui lòng nhập câu hỏi để tìm kiếm.', score: 0 };
}
// Thử dùng preprocessed data trước (nhanh hơn)
if (typeof findBestMatchPreprocessed === 'function') {
var ppResult = findBestMatchPreprocessed(input, lang, threshold);
if (ppResult) return { answer: ppResult.answer, score: ppResult.score || threshold };
}
// Fallback: tính similarity thủ công từ QA_DATASET
var dataset = QA_DATASET[lang] || QA_DATASET['vi'];
var bestScore = -1;
var bestAnswer = '';
var inputLower = input.toLowerCase();
var inputNorm = (lang === 'vi' && typeof removeVietnameseDiacritics === 'function')
? removeVietnameseDiacritics(inputLower) : null;
for (var i = 0; i < dataset.length; i++) {
var qLower = dataset[i].q.toLowerCase();
var score = textSimilarity(inputLower, qLower);
if (inputNorm) {
var qNorm = removeVietnameseDiacritics(qLower);
var scoreNorm = textSimilarity(inputNorm, qNorm);
if (scoreNorm > score) score = scoreNorm;
}
if (score > bestScore) {
bestScore = score;
bestAnswer = dataset[i].a;
}
}
if (bestScore >= threshold) return { answer: bestAnswer, score: bestScore };
if (lang === 'en') return { answer: 'Sorry, I could not find a suitable answer for your question.', score: bestScore };
if (lang === 'ja') return { answer: '申し訳ありませんが、ご質問に適した回答が見つかりませんでした。', score: bestScore };
return { answer: 'Xin lỗi, mình không tìm được câu trả lời phù hợp cho câu hỏi của bạn.', score: bestScore };
}
// Node/test: export to globalThis
if (typeof module !== 'undefined' && module.exports) {
globalThis.bestMatchAdapter = bestMatchAdapter;
}