diff --git a/internal/ingest/parse.go b/internal/ingest/parse.go new file mode 100644 index 0000000..eca6759 --- /dev/null +++ b/internal/ingest/parse.go @@ -0,0 +1,45 @@ +package ingest + +import "strings" + +// ParseCollection 从走秀标题解析出 collection_type 与 season。 +// +// 仅输出后端白名单枚举(与 backend_v2/internal/pkg/season.Derive 一致): +// collection_type ∈ {rtw, menswear, couture, resort, pre_fall} +// season ∈ {spring, fall}(resort/pre_fall 无 spring/fall 词,season 留空,由 Derive 按 collection 前缀补码) +// +// 常见 Vogue 标题形态: +// "Fall 2024 Ready-to-Wear" → (rtw, fall) +// "Spring 2024 Menswear" → (menswear, spring) +// "Fall 2024 Couture" → (couture, fall) +// "Resort 2024" → (resort, "") +// "Pre-Fall 2024" → (pre_fall, "") +// "Cruise" 视作 resort 的同义表述(Vogue 两词混用);未识别到系列词时兜底为 rtw(成衣)。 +func ParseCollection(title string) (collectionType, season string) { + t := strings.ToLower(title) + + // season:仅 spring / fall 两种 + switch { + case strings.Contains(t, "spring"): + season = "spring" + case strings.Contains(t, "fall"): + season = "fall" + } + + // collection_type:按关键字优先级匹配,最后兜底 rtw + switch { + case strings.Contains(t, "menswear"), strings.Contains(t, "men's"): + collectionType = "menswear" + case strings.Contains(t, "couture"): + collectionType = "couture" + case strings.Contains(t, "resort"), strings.Contains(t, "cruise"): + collectionType = "resort" + case strings.Contains(t, "pre-fall"), strings.Contains(t, "pre fall"), strings.Contains(t, "prefall"): + collectionType = "pre_fall" + case strings.Contains(t, "ready-to-wear"), strings.Contains(t, "ready to wear"), strings.Contains(t, "rtw"): + collectionType = "rtw" + default: + collectionType = "rtw" + } + return collectionType, season +}