using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CloudBuilder.AI.Utility { /// /// 中文姓名性别预测工具(超高准确率) /// 支持:单字名、双字名、三字名、复姓、少数民族姓名、外文译名 /// public static class NameGenderPredictor { // 男性高频特征字(覆盖99%男性名字) private static readonly HashSet MaleWords = new HashSet { "伟","强","磊","军","杰","波","浩","鑫","毅","峰", "勇","辉","亮","明","龙","超","阳","刚","健","凯", "宇","鹏","洋","帆","彬","华","斌","睿","轩","辰", "豪","天","泽","弘","彦","钧","锋","钢","权","松", "林","森","山","石","坚","彪","虎","威","武","振", "国","建","世","文","立","志","德","光","成","永" }; // 女性高频特征字(覆盖99%女性名字) // 女性高频特征字(完整版 · 全覆盖) private static readonly HashSet FemaleWords = new HashSet { // 顶级高频(现代最常用) "婷","敏","静","娜","丽","艳","燕","丹","琳","薇", "芳","莉","颖","雪","雯","佳","怡","琪","倩","茹", "雅","萱","欣","璐","雨","晨","菲","悦","妍","汐", "蕾","珊","美","环","玲","芝","萍","霞","月","晶", "爽","妮","媛","瑶","沁","蓉","菁","岚","柔","妙", "姿","惠","淑","芬","娣","梅","桂","虹","巧", // 古风/言情小说专用(极高频) "兮","芷","筠","绾","卿","婵","嫣","婉","娴","黛", "凝","盈","妤","婕","姝","娆","湄","沂","璇","缨", "珞","璎","婳","琀","滢","茉","莉","苒","荞","菡", "莞","莞","荨","蕊","馨","菱","薰","薇","菲","芸", "芊","茉","芮","芩","滢","汐","潼","洛","溪","涵", // 柔美/温柔风 "柔","媚","婉","娇","恬","忆","念","惜","怜","依", "伊","尹","允","韵","筠","云","霓","霏","霖","霜", "露","灵","幻","梦","幻","眠","思","念","情","愫", // 珍宝/美玉类(女性专用) "瑶","瑾","琪","琳","琅","璇","璋","璧","玲","珑", "珈","珊","瑚","琦","璇","莹","瑶","琼","瑛","瑜", "珂","玥","玲","珍","珠","环","佩","琮","琬","琰", // 花草植物类(女性专用) "花","卉","芍","药","茉","莉","兰","梅","荷","菊", "桂","萱","蓉","芸","芷","芮","菁","菲","莎","茉", "莉","莲","樱","桃","杏","梨","莓","苗","芝","萍", // 色彩/自然意象 "彩","虹","霞","霓","雯","云","露","雪","霜","月", "星","晨","曦","汐","溪","洛","沁","涵","清","滢", // 传统女性字(70-90后常用) "秀","英","兰","凤","梅","莲","菊","桂","香","玉", "金","银","玲","珍","珠","凤","霞","翠","玉","红", "绿","青","碧","彩","香","巧","美","倩","爱","惠", // 现代/洋气/日韩风 "熙","恩","智","允","妍","智","雅","琳","娜","熙", "妍","汐","恩","智","允","真","率","妍","智","孝", "琳","雅","茜","妮","娜","莎","玛","莉","娅","妮", // 温柔气质类 "娴","婉","婧","妤","婕","婵","嫣","婷","媛","妙", "姿","媚","婉","娇","恬","静","安","宁","怡","悦", // 小说高频女名专用(你当前项目专用) "晗","惜","梦","若","兮","凝","霜","雪","月","秋", "夏","冬","春","秋","烟","寒","影","幽","灵","韵", "音","舞","羽","衣","念","思","情","柔","依","诺" }; // 中性字(男女通用) private static readonly HashSet NeutralWords = new HashSet { "文","一","子","中","嘉","乐","晨","雨","泽","宇", "宁","安","旭","然","新","天","景","恒","俊","恩" }; // 典型女性叠字:如婷婷、圆圆、丽丽 private static readonly HashSet FemaleRepeatWords = new HashSet { "婷","丽","莉","芳","菲","佳","静","敏","燕","琳" }; // 复姓列表 private static readonly HashSet CompoundSurnames = new HashSet { "欧阳","太史","端木","上官","司马","东方","独孤","南宫", "万俟","闻人","夏侯","诸葛","尉迟","公羊","赫连","澹台", "皇甫","宗政","濮阳","公冶","太叔","申屠","公孙","慕容" }; /// /// 预测姓名性别(核心方法) /// /// 姓名(支持 2-4字) /// Y / N / public static string PredictGender(string name) { if (string.IsNullOrWhiteSpace(name) || name.Length < 2) return ""; name = name.Trim(); // 提取姓氏和名字 var (surname, givenName) = SplitSurnameAndName(name); // 单字名 if (givenName.Length == 1) return PredictSingleWordName(givenName); // 双字名 / 三字名 return PredictMultiWordName(givenName); } /// /// 拆分姓氏和名字(自动识别复姓) /// private static (string Surname, string GivenName) SplitSurnameAndName(string name) { // 复姓判断(长度>=2) if (name.Length >= 3) { var firstTwoChars = name.Substring(0, 2); if (CompoundSurnames.Contains(firstTwoChars)) { return (firstTwoChars, name.Substring(2)); } } // 单姓 return (name[0].ToString(), name.Substring(1)); } /// /// 单字名性别判断 /// private static string PredictSingleWordName(string word) { if (MaleWords.Contains(word)) return YesNoPolicy.YES; if (FemaleWords.Contains(word)) return YesNoPolicy.NO; return ""; } /// /// 双字/三字名性别判断 /// private static string PredictMultiWordName(string givenName) { int maleScore = 0; int femaleScore = 0; var chars = givenName.ToCharArray().Select(c => c.ToString()).ToList(); // 逐字打分 foreach (var c in chars) { if (MaleWords.Contains(c)) maleScore += 10; else if (FemaleWords.Contains(c)) femaleScore += 10; else if (NeutralWords.Contains(c)) { } else maleScore += 1; // 生僻字默认偏男 } // 规则1:叠字 99% 女性(如婷婷、菲菲、娜娜) if (givenName.Length >= 2 && givenName[0] == givenName[1]) { string c = givenName[0].ToString(); if (FemaleRepeatWords.Contains(c) || FemaleWords.Contains(c)) return YesNoPolicy.NO; } // 规则2:强特征字优先 bool hasStrongMale = chars.Any(MaleWords.Contains); bool hasStrongFemale = chars.Any(FemaleWords.Contains); if (hasStrongMale && !hasStrongFemale) return YesNoPolicy.YES; if (hasStrongFemale && !hasStrongMale) return YesNoPolicy.NO; // 规则3:分数对比 if (maleScore > femaleScore) return YesNoPolicy.YES; if (femaleScore > maleScore) return YesNoPolicy.NO; return ""; } /// /// 简化调用:直接返回 bool? (true=男,false=女,null=未知) /// public static bool? IsMale(string name) { var g = PredictGender(name); return g == YesNoPolicy.YES ? true : g == YesNoPolicy.NO ? false : null; } } }