网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
【资源链接】
链接: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;
@PostConstruct
private 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");
### 最后
不知道你们用的什么环境,我一般都是用的Python3.6环境和pycharm解释器,没有软件,或者没有资料,没人解答问题,都可以免费领取(包括今天的代码),过几天我还会做个视频教程出来,有需要也可以领取~
给大家准备的学习资料包括但不限于:
Python 环境、pycharm编辑器/永久激活/翻译插件
python 零基础视频教程
Python 界面开发实战教程
Python 爬虫实战教程
Python 数据分析实战教程
python 游戏开发实战教程
Python 电子书100本
Python 学习路线规划

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618317507)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**