日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

【Java代码】Java版本的NGender根据中文姓名猜测其性别及男性化/女性化程度(Python版本地址+Java版本源码+基础数据)

發布時間:2024/10/6 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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版本源码+基础数据)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。