基於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

(還沒寫完)

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