优化业务逻辑和基础库的大标题区间和字段的识别精度

This commit is contained in:
2026-07-31 16:39:04 +08:00
parent 8b996772ea
commit 0c8193d230
8 changed files with 210 additions and 183 deletions
+66 -2
View File
@@ -128,7 +128,7 @@ export function SidebarPanel({ sourceUrl, jobInfo, onClose }: SidebarPanelProps)
}
/** 开启循环扫描(每秒执行一次) */
const startScanLoop = (params: { siteMode?: "beisen"; sectionResults?: any[]; expandedResults?: any[] }) => {
const startScanLoop = (params: { siteMode?: "beisen"; sectionResults?: any[]; expandedResults?: any[]; excludeTexts?: Set<string> }) => {
stopScanLoop()
const hasFullData = !!(params.sectionResults && params.expandedResults)
// 立即执行一次
@@ -459,10 +459,33 @@ export function SidebarPanel({ sourceUrl, jobInfo, onClose }: SidebarPanelProps)
hideFillingOverlay() // 填写完成,移除遮罩
// 停止第一次循环扫描,开启第二次循环扫描(传入 sectionResults + expandedResults,分段精确)
// 构建排除集合:从简历数据中提取所有值,避免将已填值误认为标签
const scanExcludeTexts = new Set<string>()
const scanResumeData = fillResult.resumeData || resumeData
if (scanResumeData) {
const main = scanResumeData.main
if (main) {
for (const val of Object.values(main)) {
if (typeof val === "string" && val.trim()) scanExcludeTexts.add(val.trim())
if (Array.isArray(val)) val.forEach((v) => { if (typeof v === "string" && v.trim()) scanExcludeTexts.add(v.trim()) })
}
}
const expKeys: ("education" | "work" | "internship" | "project" | "competition")[] = ["education", "work", "internship", "project", "competition"]
for (const sec of expKeys) {
const items = scanResumeData[sec]
if (!Array.isArray(items)) continue
for (const item of items) {
for (const val of Object.values(item as Record<string, any>)) {
if (typeof val === "string" && val.trim()) scanExcludeTexts.add(val.trim())
}
}
}
}
startScanLoop({
siteMode: scanSiteMode,
sectionResults: fillResult.sectionResults,
expandedResults: fillResult.expandedResults,
excludeTexts: scanExcludeTexts,
})
} catch (e) {
@@ -487,8 +510,49 @@ export function SidebarPanel({ sourceUrl, jobInfo, onClose }: SidebarPanelProps)
const currentHost = window.location.hostname
const siteMode = currentHost.includes("zhiye.com") ? "beisen" as const : undefined
// 从简历数据和缓存数据中提取所有已填值,构建排除集合
// 避免 findLabelForInput 把这些值文字误认为是表单字段标签
const excludeTexts = new Set<string>()
if (resumeData) {
// 主表字段值
const main = resumeData.main
if (main) {
for (const val of Object.values(main)) {
if (typeof val === "string" && val.trim()) excludeTexts.add(val.trim())
if (Array.isArray(val)) val.forEach((v) => { if (typeof v === "string" && v.trim()) excludeTexts.add(v.trim()) })
}
}
// 5大经历字段值
const expSections: ("education" | "work" | "internship" | "project" | "competition")[] = ["education", "work", "internship", "project", "competition"]
for (const sec of expSections) {
const items = resumeData[sec]
if (!Array.isArray(items)) continue
for (const item of items) {
for (const val of Object.values(item as Record<string, any>)) {
if (typeof val === "string" && val.trim()) excludeTexts.add(val.trim())
}
}
}
}
// 缓存中已记住的表单字段值
if (cacheData.unfilledFormData) {
for (const sec of cacheData.unfilledFormData as any[]) {
const items = sec.formItems
if (!items) continue
if (sec.isExperience && Array.isArray(items)) {
for (const seg of items) {
if (Array.isArray(seg)) {
for (const f of seg) { if (f.value && typeof f.value === "string") excludeTexts.add(f.value.trim()) }
}
}
} else if (Array.isArray(items)) {
for (const f of items) { if (f.value && typeof f.value === "string") excludeTexts.add(f.value.trim()) }
}
}
}
// 调用 fillStats 扫描页面所有字段
const titleStats = scanPageFields({ siteMode })
const titleStats = scanPageFields({ siteMode, excludeTexts })
// 提取非简历格式字段(B2阶段字段)
const nonResumeData = extractNonResumeFields(titleStats)