Dieser Artikel hat an der Veranstaltung „Newcomer Creation Ceremony“ teilgenommen, um gemeinsam den Weg der Goldschöpfung zu beginnen.
【Ressourcenlink】
Extraktionscode: nnx6
【Dateien einschließen】
1. Anforderungsbeschreibung
Python
Da das Projekt das Geschlecht nach dem Namen des im Internet gefundenen Pakets beurteilen muss NGender
, aber der Technologie-Stack des Projekts ist Java
, fällt mir als erstes jython-standalone
ein, den Python-Code auszuführen, der erfolgreich aufgerufen wird Idee, aber das Modul wird während des Deployments nicht gefunden, und das Deployment kann NGender
am Ende nicht gelöst werden.Das Problem ist daher die Java-Version von NGender :smile: Kleine Partner, die erfolgreich implementiert haben, können ihre Erfahrungen teilen. Java-Versionshinweise:
- 82 % Genauigkeit (wie Python-Version)
- Kann verwendet werden, um das Geschlecht zu erraten
- Kann verwendet werden, um zu bestimmen, wie männlich/weiblich ein Name ist
2. Code-Implementierung
2.1 Abhängigkeiten
Es wird zum Analysieren von Typdateien verwendet, csv
ist nicht erforderlich und kann selbst analysiert werden.
<!-- 用于解析csv文件 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.6.6</version>
</dependency>
复制代码
2.2 Quellcode
Der Quellcode wird aus Python-Code konvertiert und nicht optimiert.
@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");
}};
}
}
/**
* 计算性别可能性
*
* @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 Anruf
charfreq.csv
Es gibt 9943 Dateien, die zum Laden der gesamten Werkzeugklasse benötigt werden 88ms【仅测试一次】
.
Map<String, String> resultMap = genderUtils.guessGenderByName("刘芳芳");
// "female": "0.9835037905504539"
复制代码
3. Sonstiges
Python-Version von NGender Download-Adresse und Einführung.