feat: smart intent-based precedent re-ranking for beraat/bozma/tazminat outcomes
This commit is contained in:
@@ -61,6 +61,49 @@ SADECE anahtar kelimeleri aralarına boşluk koyarak yaz. Noktalama işareti, a
|
|||||||
}
|
}
|
||||||
|
|
||||||
const data = await mcpResponse.json();
|
const data = await mcpResponse.json();
|
||||||
|
|
||||||
|
// Hukuki niyet ve sonuç (örn. beraat, bozma) odaklı akıllı yeniden sıralama ve puanlama
|
||||||
|
let rawItems: any[] = data.decisions || data.results || data.data || data.hits || (Array.isArray(data) ? data : []);
|
||||||
|
|
||||||
|
if (Array.isArray(rawItems) && rawItems.length > 0) {
|
||||||
|
const searchTerms = phrase.toLowerCase().split(/\s+/).filter(Boolean);
|
||||||
|
const outcomeTerms = ['beraat', 'mahkumiyet', 'bozma', 'onanma', 'tazminat', 'tahliye', 'kabul', 'red', 'ispat', 'zamanaşımı'];
|
||||||
|
const targetOutcomes = searchTerms.filter((t: string) => outcomeTerms.some(o => t.includes(o)));
|
||||||
|
|
||||||
|
const scoredItems = rawItems.map((item: any) => {
|
||||||
|
const text = (item.ozet || item.kararMetni || item.summary || item.content || item.title || item.konu || item.birimAdi || '').toLowerCase();
|
||||||
|
|
||||||
|
let baseScore = 70;
|
||||||
|
|
||||||
|
// 1. Arama terimlerinin metindeki kapsama oranı
|
||||||
|
const matchCount = searchTerms.filter((term: string) => text.includes(term)).length;
|
||||||
|
const matchRatio = searchTerms.length > 0 ? matchCount / searchTerms.length : 1;
|
||||||
|
baseScore += Math.round(matchRatio * 15);
|
||||||
|
|
||||||
|
// 2. Kullanıcının aradığı net netice/karar türü terimleri var mı? (Örn. beraat)
|
||||||
|
if (targetOutcomes.length > 0) {
|
||||||
|
const hasTargetOutcome = targetOutcomes.some((outcome: string) => text.includes(outcome));
|
||||||
|
if (hasTargetOutcome) {
|
||||||
|
baseScore += 18;
|
||||||
|
} else {
|
||||||
|
baseScore -= 25; // Eğer beraat arayıp kararda beraat geçmiyorsa (örn sadece onanması varsa) sırayı düşür
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Skor 45 - 98 arasında sınırlandırılır
|
||||||
|
const finalScore = Math.max(45, Math.min(98, baseScore));
|
||||||
|
return { ...item, relevanceScore: finalScore, score: finalScore };
|
||||||
|
});
|
||||||
|
|
||||||
|
// En yüksek alakaya göre yeniden sırala
|
||||||
|
scoredItems.sort((a: any, b: any) => b.relevanceScore - a.relevanceScore);
|
||||||
|
|
||||||
|
if (data.results) data.results = scoredItems;
|
||||||
|
else if (data.decisions) data.decisions = scoredItems;
|
||||||
|
else if (data.data) data.data = scoredItems;
|
||||||
|
else if (Array.isArray(data)) data = scoredItems;
|
||||||
|
}
|
||||||
|
|
||||||
res.json(data);
|
res.json(data);
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
console.error('Search Precedents Error:', error);
|
console.error('Search Precedents Error:', error);
|
||||||
|
|||||||
Reference in New Issue
Block a user