fix
This commit is contained in:
@@ -32,9 +32,9 @@ func IsWeakPriorEnhanceDescription(priorDesc string, titles ...string) bool {
|
||||
}
|
||||
|
||||
// heuristicSynthesizePhrases are distinctive invent / formula-skeleton snippets from
|
||||
// synthesizeDescriptionFromTitle / synthesizeDescriptionFromFormula. These may look
|
||||
// "strong" enough to pass IsWeakPriorEnhanceDescription but must never hash-skip
|
||||
// enhance (would leave fallback copy forever on reprocess).
|
||||
// synthesizeDescriptionFromTitle / synthesizeDescriptionFromFormula / factualDescriptionIntro.
|
||||
// These may look "strong" enough to pass IsWeakPriorEnhanceDescription but must never
|
||||
// hash-skip enhance (would leave fallback copy forever on reprocess).
|
||||
var heuristicSynthesizePhrases = []string{
|
||||
"is a catalog product with the known attributes",
|
||||
"is listed in the ",
|
||||
@@ -43,23 +43,63 @@ var heuristicSynthesizePhrases = []string{
|
||||
"je izdelek v kategoriji",
|
||||
"je izdelek znamke",
|
||||
". ključne specifikacije:",
|
||||
// factualDescriptionIntro (post-phrase-avoidance invent)
|
||||
" — znamka ",
|
||||
", znamka ",
|
||||
" — katalogski izdelek",
|
||||
" — from ",
|
||||
" — catalog product",
|
||||
}
|
||||
|
||||
// LooksLikeHeuristicSynthesize reports invent / formula-skeleton fallback copy.
|
||||
func LooksLikeHeuristicSynthesize(desc string) bool {
|
||||
lower := strings.ToLower(desc)
|
||||
plain := strings.ToLower(plainTextForWeakCheck(desc))
|
||||
if plain == "" {
|
||||
return false
|
||||
}
|
||||
for _, p := range heuristicSynthesizePhrases {
|
||||
if p != "" && strings.Contains(lower, p) {
|
||||
if p != "" && strings.Contains(plain, p) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
// EN invent: "<title> is a <category> product from <brand>"
|
||||
if strings.Contains(lower, " is a ") && strings.Contains(lower, " product from ") {
|
||||
if strings.Contains(plain, " is a ") && strings.Contains(plain, " product from ") {
|
||||
return true
|
||||
}
|
||||
// SL/CS short invent: "<title> je … znamk|kategor|produkt …"
|
||||
if strings.Contains(plain, " je ") &&
|
||||
(strings.Contains(plain, "znamk") ||
|
||||
strings.Contains(plain, "kategor") ||
|
||||
strings.Contains(plain, "produkt") ||
|
||||
strings.Contains(plain, "televiz") ||
|
||||
strings.Contains(plain, "monitor")) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// plainTextForWeakCheck strips HTML tags so <p>thin invent</p> is judged on visible copy.
|
||||
func plainTextForWeakCheck(s string) string {
|
||||
s = strings.TrimSpace(s)
|
||||
if s == "" {
|
||||
return ""
|
||||
}
|
||||
var b strings.Builder
|
||||
b.Grow(len(s))
|
||||
inTag := false
|
||||
for _, r := range s {
|
||||
switch {
|
||||
case r == '<':
|
||||
inTag = true
|
||||
case r == '>':
|
||||
inTag = false
|
||||
case !inTag:
|
||||
b.WriteRune(r)
|
||||
}
|
||||
}
|
||||
return strings.TrimSpace(b.String())
|
||||
}
|
||||
|
||||
// EnhanceHashSkipBlockReason returns a stable reason when prior description must
|
||||
// not hash-skip the enhance LLM: "weak", "title-echo", "synth", or "".
|
||||
func EnhanceHashSkipBlockReason(priorDesc string, titles ...string) string {
|
||||
@@ -67,22 +107,26 @@ func EnhanceHashSkipBlockReason(priorDesc string, titles ...string) string {
|
||||
if priorDesc == "" || priorDesc == "<nil>" {
|
||||
return "weak"
|
||||
}
|
||||
if len([]rune(priorDesc)) < minUsableProductDescRunes {
|
||||
plain := plainTextForWeakCheck(priorDesc)
|
||||
if plain == "" || plain == "<nil>" {
|
||||
return "weak"
|
||||
}
|
||||
if len([]rune(plain)) < minUsableProductDescRunes {
|
||||
return "weak"
|
||||
}
|
||||
for _, title := range titles {
|
||||
if DescriptionEchoesTitle(priorDesc, title) {
|
||||
if DescriptionEchoesTitle(plain, title) || DescriptionEchoesTitle(priorDesc, title) {
|
||||
return "title-echo"
|
||||
}
|
||||
}
|
||||
if ContainsWeakFillerPhrase(priorDesc) {
|
||||
if ContainsWeakFillerPhrase(plain) || ContainsWeakFillerPhrase(priorDesc) {
|
||||
return "weak"
|
||||
}
|
||||
if LooksLikeHeuristicSynthesize(priorDesc) {
|
||||
return "synth"
|
||||
}
|
||||
if len([]rune(priorDesc)) <= shortBoilerplateDescRunes &&
|
||||
!descriptionOverlapsProductFacts(priorDesc, titles...) {
|
||||
if len([]rune(plain)) <= shortBoilerplateDescRunes &&
|
||||
!descriptionOverlapsProductFacts(plain, titles...) {
|
||||
return "weak"
|
||||
}
|
||||
return ""
|
||||
|
||||
@@ -13,6 +13,17 @@ func TestLooksLikeHeuristicSynthesize(t *testing.T) {
|
||||
if !LooksLikeHeuristicSynthesize(sl) {
|
||||
t.Fatalf("expected SL invent detected: %q", sl)
|
||||
}
|
||||
htmlInvent := "<p>QLED TV 55 je televizor znamke Samsung.</p>"
|
||||
if !LooksLikeHeuristicSynthesize(htmlInvent) {
|
||||
t.Fatalf("expected HTML-wrapped invent detected: %q", htmlInvent)
|
||||
}
|
||||
if !ShouldRefuseEnhanceHashSkip(htmlInvent, "QLED TV 55") {
|
||||
t.Fatalf("HTML invent must block hash skip")
|
||||
}
|
||||
factual := "QLED TV 55 — Televizorji, znamka Samsung."
|
||||
if !LooksLikeHeuristicSynthesize(factual) {
|
||||
t.Fatalf("expected factualDescriptionIntro invent detected: %q", factual)
|
||||
}
|
||||
good := "Vogel's WALL 3245 is a sturdy TV mount with clear load ratings and install guidance for wall displays."
|
||||
if LooksLikeHeuristicSynthesize(good) {
|
||||
t.Fatalf("retail copy must not look like invent: %q", good)
|
||||
|
||||
Reference in New Issue
Block a user