基于LSTM的中文姓名性别预测

写在前面

这是本人编写的首个基于调库的机器学习程序,算是一个简单的练手项目。

本程序可以根据输入的中文姓名推测其对应的性别

根据人的名字判断人的性别是一个很有意思的工作,我们可以用朴素贝叶斯法,SVN法或神经网络解决。Python有一个库叫做ngender,它采用朴素贝叶斯进行预测,然而,该模型面对。

本人基于Pytorch,采用embedding+LSTM+Linear的神经网络模型进行性别的预测,准确率达到了88%

代码已经上传至GitHub,[这是GitHub链接](AlphaINF/name2gender: Gender prediction of chinese name based on LSTM (github.com))

效果如图

1669276841879

本人将在下文中,详细介绍模型的结构和使用方法

文件结构

本程序包含以下几个文件,文件结构如下图所示

1669277697252

每个文件的用途如下表所示

文件名 用途
name2gender.py 用于保存模型的结构
main.py 直接运行即可输入名字进行性别预测
test.py 用于运行测试集的代码
finetune.py 用于训练的代码
utils.py 一些工具(比如csv的读取工具)
net.pth 训练好的神经网络
ccnc.csv 数据集1(采用ccnc_loader进行读取),包含有约350w组数据,每组数据的格式为(姓氏,名字,姓名,性别),采用换行和tab间隔
train.csv 数据集2(采用csv_loader进行读取),包含有约20w组数据,每组数据的格式为(姓名,性别),采用换行和逗号间隔
test.csv/ccnc-tiny.csv 测试集

模型结构

我们可以通过mane2gender.py来了解模型的结构

import torch.nn as nn

class name2gender(nn.Module):
    def __init__(self, input_size, embedding_size, rnn_hidden_size, hidden_size, output_size=2):
        super(name2gender, self).__init__()
        self.embeddings = nn.Embedding(input_size, embedding_size, padding_idx=0)
        self.drop = nn.Dropout(p=0.1)
        self.rnn = nn.LSTM(input_size=embedding_size, hidden_size=rnn_hidden_size, batch_first=True)
        self.linear1 = nn.Linear(rnn_hidden_size, hidden_size)
        self.activation = nn.ReLU()
        self.linear2 = nn.Linear(hidden_size, output_size)
        self.output_size = output_size
        self.softmax = nn.LogSoftmax(dim=1)
    def forward(self, name, length):
        now = self.embeddings(name)
        now = self.drop(now)
        input_packed = nn.utils.rnn.pack_padded_sequence(now, length, batch_first=True, enforce_sorted=False)
        _, (ht, _) = self.rnn(input_packed, None)

        out = self.linear1(ht)
        out = self.activation(out)
        out = self.linear2(out)

        out = out.view(-1, self.output_size)
        out = self.softmax(out)
        return out

(还没写完)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章