Files
wish-pool/lib/content-moderation.ts
2025-07-19 02:12:37 +08:00

250 lines
6.1 KiB
TypeScript

// 內容審核 AI 系統
export interface ModerationResult {
isAppropriate: boolean
issues: string[]
suggestions: string[]
severity: "low" | "medium" | "high"
blockedWords: string[]
}
// 不雅詞彙和辱罵詞彙庫
const inappropriateWords = [
// 髒話和不雅詞彙
"幹",
"靠",
"操",
"媽的",
"他媽的",
"去死",
"死",
"滾",
"白痴",
"智障",
"腦殘",
"垃圾",
"廢物",
"混蛋",
"王八蛋",
"狗屎",
"屎",
"婊子",
"賤",
"爛",
"鳥",
"屌",
"雞掰",
"機掰",
"北七",
// 公司辱罵相關
"爛公司",
"垃圾公司",
"黑心公司",
"慣老闆",
"奴隸主",
"血汗工廠",
"剝削",
"壓榨",
"去你的",
"見鬼",
"該死",
"要死",
"找死",
"活該",
"報應",
"天殺的",
// 威脅性詞彙
"殺",
"打死",
"弄死",
"搞死",
"整死",
"報復",
"復仇",
"毀掉",
"搞垮",
// 歧視性詞彙
"歧視",
"種族",
"性別歧視",
"老不死",
"死老頭",
"死老太婆",
"殘廢",
"瘸子",
// 英文不雅詞彙
"fuck",
"shit",
"damn",
"bitch",
"asshole",
"bastard",
"crap",
"hell",
"wtf",
"stfu",
"bullshit",
"motherfucker",
"dickhead",
"piss",
]
// 負面但可接受的詞彙(會給予建議但不阻擋)
const negativeButAcceptableWords = [
"討厭",
"煩",
"累",
"辛苦",
"困難",
"挫折",
"失望",
"無奈",
"痛苦",
"壓力",
"不滿",
"抱怨",
"不爽",
"生氣",
"憤怒",
"沮喪",
"絕望",
"疲憊",
"厭倦",
]
// 建設性詞彙建議
const constructiveSuggestions = [
"建議使用更具體的描述來說明遇到的困難",
"可以嘗試描述期望的改善方向",
"分享具體的情況會更有助於找到解決方案",
"描述問題的影響程度會幫助我們更好地理解",
"可以說明這個問題對工作效率的具體影響",
]
export function moderateContent(content: string): ModerationResult {
const fullText = content.toLowerCase()
const issues: string[] = []
const suggestions: string[] = []
const blockedWords: string[] = []
let severity: "low" | "medium" | "high" = "low"
// 檢查不雅詞彙
inappropriateWords.forEach((word) => {
if (fullText.includes(word.toLowerCase())) {
blockedWords.push(word)
issues.push(`包含不適當詞彙: "${word}"`)
}
})
// 檢查負面但可接受的詞彙
const negativeWordCount = negativeButAcceptableWords.filter((word) => fullText.includes(word.toLowerCase())).length
// 判斷嚴重程度
if (blockedWords.length > 0) {
severity = "high"
issues.push("內容包含不雅或辱罵詞彙,無法提交")
suggestions.push("請使用更專業和建設性的語言描述遇到的困難")
suggestions.push("我們理解工作中的挫折,但希望能以正面的方式表達")
} else if (negativeWordCount > 3) {
severity = "medium"
issues.push("內容情緒較為負面")
suggestions.push("建議加入一些具體的改善建議或期望")
suggestions.push("描述具體情況會比情緒性詞彙更有幫助")
} else if (negativeWordCount > 1) {
severity = "low"
suggestions.push("可以嘗試更具體地描述遇到的挑戰")
}
// 內容長度檢查
if (content.trim().length < 10) {
issues.push("內容過於簡短,請提供更詳細的描述")
severity = severity === "low" ? "medium" : severity
}
// 重複字符檢查(可能是情緒性表達)
const repeatedChars = content.match(/(.)\1{4,}/g)
if (repeatedChars) {
issues.push("請避免使用過多重複字符")
suggestions.push("建議使用清楚的文字描述來表達感受")
}
// 全大寫檢查(可能是憤怒表達)
const upperCaseRatio = (content.match(/[A-Z]/g) || []).length / content.length
if (upperCaseRatio > 0.5 && content.length > 20) {
issues.push("請避免使用過多大寫字母")
suggestions.push("正常的大小寫會讓內容更容易閱讀")
}
// 如果沒有具體建議,添加通用建議
if (suggestions.length === 0 && severity !== "high") {
suggestions.push(...constructiveSuggestions.slice(0, 2))
}
return {
isAppropriate: blockedWords.length === 0,
issues,
suggestions,
severity,
blockedWords,
}
}
// 檢查整個表單內容
export function moderateWishForm(formData: {
title: string
currentPain: string
expectedSolution: string
expectedEffect: string
}): ModerationResult {
const allContent = `${formData.title} ${formData.currentPain} ${formData.expectedSolution} ${formData.expectedEffect}`
const result = moderateContent(allContent)
// 針對不同欄位給出具體建議
const fieldSpecificSuggestions: string[] = []
if (formData.title.length < 5) {
fieldSpecificSuggestions.push('標題建議更具體一些,例如:"資料整理效率低下" 而非 "很煩"')
}
if (formData.currentPain.length < 20) {
fieldSpecificSuggestions.push("困擾描述可以更詳細,包括具體情況和影響")
}
if (formData.expectedSolution.length < 15) {
fieldSpecificSuggestions.push("期望解決方式可以更具體,這有助於我們提供更好的建議")
}
return {
...result,
suggestions: [...result.suggestions, ...fieldSpecificSuggestions],
}
}
// 提供正面的表達建議
export function getSuggestedPhrases(originalText: string): string[] {
const suggestions: string[] = []
// 根據內容提供建議
if (originalText.includes("很煩") || originalText.includes("討厭")) {
suggestions.push('可以說:"這個流程讓我感到困擾,希望能夠簡化"')
}
if (originalText.includes("爛") || originalText.includes("垃圾")) {
suggestions.push('可以說:"這個系統存在一些問題,影響了工作效率"')
}
if (originalText.includes("老闆") && (originalText.includes("討厌") || originalText.includes("爛"))) {
suggestions.push('可以說:"希望能與主管有更好的溝通和協作"')
}
if (originalText.includes("同事")) {
suggestions.push('可以說:"團隊協作方面遇到一些挑戰"')
}
return suggestions
}