寫在前面
這是本人編寫的首個基於調庫的機器學習程序,算是一個簡單的練手項目。
本程序可以根據輸入的中文姓名推測其對應的性別
根據人的名字判斷人的性別是一個很有意思的工作,我們可以用樸素貝葉斯法,SVN法或神經網絡解決。Python有一個庫叫做ngender,它採用樸素貝葉斯進行預測,然而,該模型面對。
本人基於Pytorch,採用embedding+LSTM+Linear的神經網絡模型進行性別的預測,準確率達到了88%
代碼已經上傳至GitHub,[這是GitHub鏈接](AlphaINF/name2gender: Gender prediction of chinese name based on LSTM (github.com))
效果如圖
本人將在下文中,詳細介紹模型的結構和使用方法
文件結構
本程序包含以下幾個文件,文件結構如下圖所示
每個文件的用途如下表所示
文件名 | 用途 |
---|---|
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
(還沒寫完)