Spaces:
Running
Running
Download adapters/best-match.js from mr4/chatbot-js: direct link, hf CLI and curl.
- Browser
- Download file 2.65 kB
-
https://huggingface.co/spaces/mr4/chatbot-js/resolve/main/adapters/best-match.js
- Command line
-
hf download hf://spaces/mr4/chatbot-js/adapters/best-match.js
-
curl -L -o best-match.js https://huggingface.co/spaces/mr4/chatbot-js/resolve/main/adapters/best-match.js
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; | |
| } | |