208 lines
8.3 KiB
C#
208 lines
8.3 KiB
C#
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;
|
||
}
|
||
}
|
||
}
|