【Java代码】Java版本的NGender根据中文姓名猜测其性别及男性化/女性化程度(Python版本地址+Java版本源码+基础数据)
生活随笔
收集整理的這篇文章主要介紹了
【Java代码】Java版本的NGender根据中文姓名猜测其性别及男性化/女性化程度(Python版本地址+Java版本源码+基础数据)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【資源鏈接】
鏈接:https://pan.baidu.com/s/1NSH5T0qkTTcOJbURd9Mq7A
提取碼:nnx6
【包含文件】
1.需求說明
由于項目需要通過姓名判斷性別,在網絡上找到了Python的NGender包,但項目的技術棧是Java,首先想到的是使用jython-standalone來執行 Python 代碼,在 idea 成功調用,在部署時卻無法找到NGender模塊,最終無法解決部署問題因此有了 Java 版本的 NGender 😄 有成功部署的小伙伴兒可以分享一下經驗。Java 版本說明:
- 82%的準確率(與python版本一致)
- 可用于猜測性別
- 可用于判斷名字的男性化/女性化程度
2.代碼實現
2.1 依賴
用于解析csv類型文件,非必須依賴,可自行解析。
<!-- 用于解析csv文件 --> <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.6.6</version> </dependency>2.2 源碼
源碼從 Python 代碼轉化,并未進行優化。
@Slf4j @Component public class GenderUtils {private Map<String, String> genderMap = new HashMap<>(9443);private int maleTotal = 0;private int femaleTotal = 0;private int genderTotal = 0;@PostConstructprivate void init() {// 加載文件File toFile = new File("data/ngender/charfreq.csv");// 解析CSV文件CsvData rows = CsvUtil.getReader().read(toFile);for (int i = 1, rowCount = rows.getRowCount(); i < rowCount; i++) {CsvRow row = rows.getRow(i);maleTotal += Integer.parseInt(row.get(1));femaleTotal += Integer.parseInt(row.get(2));}genderTotal = maleTotal + femaleTotal;// 封裝對象for (int i = 1, rowCount = rows.getRowCount(); i < rowCount; i++) {CsvRow row = rows.getRow(i);String nameChar = row.get(0);int maleNum = Integer.parseInt(row.get(1));int femaleNum = Integer.parseInt(row.get(2));genderMap.put(nameChar, 1.0 * femaleNum / femaleTotal + "," + 1.0 * maleNum / maleTotal);}}/*** 根據姓名判斷性別(僅支持中文)** @param nameString 姓名* @return 性別信息*/public Map<String, String> guessGenderByName(String nameString) {// 截取【名】的全部字符字符char[] nameChars = nameString.substring(1).toCharArray();// 獲取性別可能性數據double maleProb = getGenderProb(nameChars, 1);double femaleProb = getGenderProb(nameChars, 0);// 返回結果if (maleProb > femaleProb) {return new HashMap<String, String>(2) {{put("male", String.valueOf(maleProb / (maleProb + femaleProb)));}};} else if (femaleProb > maleProb) {return new HashMap<String, String>(2) {{put("female", String.valueOf(femaleProb / (maleProb + femaleProb)));}};} else {return new HashMap<String, String>(2) {{put("unknown", "0");}};}}/*** 計算性別可能性** @param nameChars 【名】的全部字符字符* @param genderFlag 0 female 1 male* @return 性別及可能性*/private double getGenderProb(char[] nameChars, int genderFlag) {double baseProb;if (genderFlag == 0) {baseProb = 1.0 * femaleTotal / genderTotal;} else {baseProb = 1.0 * maleTotal / genderTotal;}for (char nameChar : nameChars) {baseProb *= Double.parseDouble(MapUtils.getString(genderMap, nameChar + "", "0,0").split(",")[genderFlag]);}return baseProb;}}2.3 調用
charfreq.csv文件有9943條,整個工具類的加載需要88ms【僅測試一次】。
Map<String, String> resultMap = genderUtils.guessGenderByName("劉芳芳"); // "female": "0.9835037905504539"3.其他
Python 版本的 NGender 下載地址 及介紹。
總結
以上是生活随笔為你收集整理的【Java代码】Java版本的NGender根据中文姓名猜测其性别及男性化/女性化程度(Python版本地址+Java版本源码+基础数据)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Windows工具】BBDown.ex
- 下一篇: Python【算法中心 01】Web框架