汉语名的性别量词

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回归模型的预测性能。

随机森林

MetricPerformancePerformance Std. Dev.
Accuracy0.94860.007072
F10.94700.007963
Precision0.95250.008399
Recall0.94170.012985
Logloss161.544.101283

l2正则logistic回归

MetricPerformancePerformance Std. Dev.
Accuracy0.89570.007327
F10.89200.007873
Precision0.88520.012238
Recall0.89910.008936
Logloss114.356.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回归相比,随机森林仍然更好。

模特训练

模块附带了培训数据。你可以自己训练这个模型。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java中NP、VP和PP短语的nlp分块(CoreNLP)   java从相同jarfile的多个实例记录到一个数据库,但使用log4j2跟踪哪个实例记录了什么   EclipseJava在启动新线程之前自动等待线程完成   java JVM无法启动“无法为对象保留足够的空间”   n个元素的java时间复杂性   JavaDbrider没有在新的测试类运行之前清理数据,我如何解决这个问题?   基于Java反射的泛型参数实例化发现   java使用mockito填充列表   java为什么我的while循环会冻结我的程序以及如何修复它?   爪哇ava。木卫一。IOException:打开失败:enoint(没有这样的文件或目录)   java如何检查类的<?>SomeInterface的对象实例   java从ArrayList中删除int[]   java使用FXML向形状添加上下文菜单   java我初始化它的目的是什么?   在java中仅从new Date()获取时区字段   在两个列表中查找相似但不相等实体的集合(Java)   加密如何使用AES生成实际的加密文件?[爪哇]   java Hadoop,Mahout实时处理替代方案