[Java-Code] Die Java-Version von NGender errät ihr Geschlecht und ihren männlichen/weiblichen Grad basierend auf dem chinesischen Namen (Adresse der Python-Version + Quellcode der Java-Version + grundlegende Daten)

Dieser Artikel hat an der Veranstaltung „Newcomer Creation Ceremony“ teilgenommen, um gemeinsam den Weg der Goldschöpfung zu beginnen.

【Ressourcenlink】

Link: pan.baidu.com/s/1NSH5T0qk…

Extraktionscode: nnx6

【Dateien einschließen】

Bildbeschreibung hier einfügen

1. Anforderungsbeschreibung

PythonDa 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-standaloneein, den Python-Code auszuführen, der erfolgreich aufgerufen wird Idee, aber das Modul wird während des Deployments nicht gefunden, und das Deployment kann NGenderam 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, csvist 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.csvEs 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.

Ich denke du magst

Origin juejin.im/post/7087402016871284743
Empfohlen
Rangfolge