汉语名的性别量词
namesex的Python项目详细描述
名称ex
namexx是一个预测中文名字性别倾向的软件包。该模块提供了两个预测模型,分别针对10730个中文名字(繁体中文)和从公共数据中收集的可靠性别标签进行了训练。第一个预测模型是一个可以由predict()调用的随机林分类器。该模型采用了三种特征:给定名称、给定名称的唯一性和一个100大小的向量,这些向量是从tw.yahoo.com上收集的新闻语料中提取出来的。该新闻语料库包含87848812个汉字。
第二个预测模型是一个L2正则逻辑回归,可以通过predict_logic()调用。此模型仅使用给定名称和给定名称的Unigrams。这两种预测方法都采用一个名字列表,并输出预测的性别倾向(男性为1,女性为0)或成为男性名字的概率。
使用gensim训练跳转gram word2vec模型时,该方案不依赖gensim,因为训练后的模型被提取为字典结构,便于使用。然而,这个项目依赖于numpy、scipy和sklearn。在通过pip安装namexx之前,windows用户可能希望使用预编译的二进制软件包安装numpy、scipy和sklearn。如果你只想“工作”而不想安装sklearn,可以考虑使用姐妹项目nameex_light,它只依赖于numpy。namesex_light使用在同一数据集上训练的正则化logistic回归提供相同的生成函数。nameex_light应该比predict()快。然而,nameex_light的预测精度低于nameex中的predict()函数。
有关nameex和nameex_light的其他信息可以在in another document (in Chinese)中找到。
下面列出了通过十倍交叉验证评估的随机森林和logistic回归模型的预测性能。
随机森林
Metric | Performance | Performance Std. Dev. |
Accuracy | 0.9486 | 0.007072 |
F1 | 0.9470 | 0.007963 |
Precision | 0.9525 | 0.008399 |
Recall | 0.9417 | 0.012985 |
Logloss | 161.54 | 4.101283 |
l2正则logistic回归
Metric | Performance | Performance Std. Dev. |
Accuracy | 0.8957 | 0.007327 |
F1 | 0.8920 | 0.007873 |
Precision | 0.8852 | 0.012238 |
Recall | 0.8991 | 0.008936 |
Logloss | 114.35 | 6.413972 |
随机森林模型具有较高的精度和f1评分。我们还测试了k-最近邻(knn)模型(这里没有报道)。knn和logistic回归具有相似的性能水平,由于明显的原因被排除在外。
使用pip/pip3安装名称例如。
pip install namesex
要使用namexx,请传入要预测的给定名称的数组或列表()。对于输入列表中的每个元素,predict()对于男性或女性预测返回1或0。设置“predprob=true”返回成为男性姓名的概率。下面是一个简单的示例代码。
>>> import namesex >>> ns = namesex.namesex() >>> ns.predict(['民豪', '愛麗', '志明']) array([1, 0, 1]) >>> ns.predict(['民豪', '愛麗', '志明'], predprob=True) array([0.8245 , 0.25695238, 0.85 ])
注意namexx只接受中文名字训练。但是,它也可以用于对翻译后的名称进行分类:
>>> ns.predict(['莎拉波娃', '阿波羅', '雷', '艾美', '布蘭妮', '瑪麗亞']) array([0, 1, 1, 0, 0, 0])
这个模型只是用名字训练的。因此,为了获得最佳性能,应对输入数据进行预处理,以仅保留给定的名称。:
>>> ns.predict(['黃志明春嬌', '黃志明', '志明', '黃春嬌', '春嬌'], predprob = True) array([0.61825 , 0.79039286, 0.85 , 0.3646 , 0.3716 ])
在上面的例子中,姓氏对预测的影响很小。把男性和女性的名字连在一起,某种程度上抵消了(接近0.5)性别倾向。
测试数据集
这个包附带了一个小的测试数据集,它不用于模型培训。下面的示例代码演示了一个简单的用法。
>>> testdata = namesex.testdata() >>> ns = namesex.namesex() >>> pred = ns.predict(testdata.gname) >>> pred2 = ns.predict_logic(testdata.gname) >>> import numpy as np >>> accuracy = np.mean(pred == testdata.sex) >>> print(" Prediction accuracy (random forest) = {}".format(accuracy)) Prediction accuracy (random forest) = 0.8921568627450981 >>> accuracy2 = np.mean(pred2 == testdata.sex) >>> print(" Prediction accuracy (logistic reg) = {}".format(accuracy2)) Prediction accuracy (logistic reg) = 0.8627450980392157
这两种方法的准确度都略低于十倍交叉评估的准确度。与logistic回归相比,随机森林仍然更好。
模特训练
模块附带了培训数据。你可以自己训练这个模型。