CloudBuilder/CloudBuilder.AI/Utility/NameGenderPredictor.cs
owenchen 996bb243df ow
2026-06-22 17:02:13 +08:00

210 lines
8.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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