R基于Bayes理论实现中文人员特性的性别判定
参见 基于中文人员特征的性别判定方法 理论,告诉一个名字,来猜猜是男是女,多多少少有点算命的味道。此命题是一种有监督的学习方法,从标注好的训练数据学习到一个预测模型,然后对未标注的数据进行预测。
1、首先,有监督的学习方法,就需要这样一批标注数据:大量的人名,以及其性别。训练数据集参考 SofaSofa-数据科学社区 及其它网页爬取的数据:
2、对下载的数据进行清洗及特征提取,其流程如下:
- 根据姓氏辞典把姓氏去掉,留下不带姓氏的名字;
- 参见上一篇论文,特征有三个维度,分别用X1,X2,X3(=X1X2)表示。如果是单字名,则X1为空格,X2为单字名,X3就是前两者拼接X1X2,清洗后的数据如下,gname (1:男,0:女)

- 数据清洗示例代码:
remove(list = ls())
space_path <- c("E:\\Teld_Work\\15_UserProfile\\srccode")
setwd(space_path)
Sys.setlocale(category = "LC_ALL",local="chinese") ##读取本地数据
##数据下载地址:http://sofasofa.io/competition.php?id=3& 及其它网络地址爬取
tbl1 <- read.table(file = "train.txt",header = TRUE,sep = ",",fill = TRUE,encoding = "UTF-8")
df <- data.frame(tbl1) ##将数据转入SqlServer进行清洗
chl <- odbcConnect("testsql", uid = "sqladmin", pwd = "123456a?")
sqlSave(chl,df,tablename = "U_demo")
close(chl) ##获取清洗完成的数据
library(RODBC)
chl <- odbcConnect("testsql", uid = "sqladmin", pwd = "123456a?")
df <- sqlQuery(chl,"select fn1,fn2,fn,gname from U_SexByNameSample")
close(chl) ##将数据转存为本地rda文件
save(df,file = "sexbyname.rda")- 始于贝叶斯公式,对于名字X1X2,工程实现中,在预测阶段,可能会遇到一些特征在训练样本中没有,则需要做一下平滑(比如分子加一个很小的值),不然男女概率都为0,无法预测。
- P(男|X1X2)=P(男)*P(X1|男)*P(X2|男)*P(X1X2|男)
- P(女|X1X2)=P(女)*P(X1|女)*P(X2|女)*P(X1X2|女)
- 特别注意的是,P(X1|男)表示的是训练样本中,男性用户中,名字第一个字出现X1的概率,如果第二个字出现X1,不算在这里。
- 示例代码如下:
remove(list = ls())
space_path <- c("E:\\Teld_Work\\15_UserProfile\\srccode")
setwd(space_path) ##姓名拆分
buildVe <- function(name)
{
len <- nchar(name)
f2 <- substr(name,len,len)
f1 <- c("")
if (len > 2)
{
f1 <- substr(name,len-1,len-1)
}
fn <- paste0(f1,f2) return(c(f1,f2,fn))
} #模型
naive.bayes.prediction <- function(name)
{
if (exists("sexDf") == FALSE)
{
load("sexbyname.rda")
} smv <- 0.001; #解决特征在样本中没有的场景
vec <- buildVe(name); #计算先验概率
sex.M <- (sum(sexDf[,4] == "") + smv)/ length(sexDf[,4]);
sex.F <- (sum(sexDf[,4] == "") + smv)/ length(sexDf[,4]); # 计算 name 是男性概率
pred.M <-
(sum((sexDf[,1] == vec[1]) & (sexDf[,4] == "")) + smv) / sum(sexDf[,4] == "") *
(sum((sexDf[,2] == vec[2]) & (sexDf[,4] == "")) + smv) / sum(sexDf[,4] == "") *
(sum((sexDf[,3] == vec[3]) & (sexDf[,4] == "")) + smv) / sum(sexDf[,4] == "") *
sex.M; # 计算 name 是女性概率
pred.F <-
(sum((sexDf[,1] == vec[1]) & (sexDf[,4] == ""))+ smv) / sum(sexDf[,4] == "") *
(sum((sexDf[,2] == vec[2]) & (sexDf[,4] == ""))+ smv) / sum(sexDf[,4] == "") *
(sum((sexDf[,3] == vec[3]) & (sexDf[,4] == ""))+ smv) / sum(sexDf[,4] == "") *
sex.F; ## return(list(post.pred.M = pred.M,
## post.pred.F = pred.F,
## prediction = ifelse(pred.M >= pred.F, "男", "女")));
return(paste0("pred.M:",pred.M,",pred.F:",pred.F,"; --prediction:",ifelse(pred.M >= pred.F, "男", "女")))
}- 在实际应用中,这个模型适合于我们知道用户姓名但是不知道性别的情况,比如某电商网站,一般情况用户订单中填的收货人姓名都是真实的,注册信息中可能带有性别但是不靠谱可能是乱填的,随便写俩人员通过模型预估结果如下:
> naive.bayes.prediction("刘德华")
[1] "pred.M:2.03045549425324e-09,pred.F:1.68712051662787e-11; --prediction:男"
> naive.bayes.prediction("张学友")
[1] "pred.M:2.24279371989392e-11,pred.F:2.30827962001087e-16; --prediction:男"
> naive.bayes.prediction("金星")
[1] "pred.M:6.28564627624871e-09,pred.F:7.02613664124613e-10; --prediction:男"
> naive.bayes.prediction("李玉刚")
[1] "pred.M:6.06865747851669e-11,pred.F:1.22259348253025e-15; --prediction:男"
> naive.bayes.prediction("李冰冰")
[1] "pred.M:4.61521485457943e-11,pred.F:1.35846175847352e-10; --prediction:女"
> naive.bayes.prediction("章子怡")
[1] "pred.M:4.51645469372974e-09,pred.F:5.16427477696052e-09; --prediction:女"
>
R基于Bayes理论实现中文人员特性的性别判定的更多相关文章
- R学习:《机器学习与数据科学基于R的统计学习方法》中文PDF+代码
当前,机器学习和数据科学都是很重要和热门的相关学科,需要深入地研究学习才能精通. <机器学习与数据科学基于R的统计学习方法>试图指导读者掌握如何完成涉及机器学习的数据科学项目.为数据科学家 ...
- Chinese-Text-Classification,用卷积神经网络基于 Tensorflow 实现的中文文本分类。
用卷积神经网络基于 Tensorflow 实现的中文文本分类 项目地址: https://github.com/fendouai/Chinese-Text-Classification 欢迎提问:ht ...
- 基于LeNet网络的中文验证码识别
基于LeNet网络的中文验证码识别 由于公司需要进行了中文验证码的图片识别开发,最近一段时间刚忙完上线,好不容易闲下来就继上篇<基于Windows10 x64+visual Studio2013 ...
- 基于MMSeg算法的中文分词类库
原文:基于MMSeg算法的中文分词类库 最近在实现基于lucene.net的搜索方案,涉及中文分词,找了很多,最终选择了MMSeg4j,但MMSeg4j只有Java版,在博客园上找到了*王员外*(ht ...
- Atitit atiplat_reader 基于url阅读器的新特性
Atitit atiplat_reader 基于url阅读器的新特性 1.1. feature功能特性1 1.2. note1 1.1. feature功能特性 支持url数据源,实际就是只支持一层连 ...
- 基于深度学习的中文语音识别系统框架(pluse)
目录 声学模型 GRU-CTC DFCNN DFSMN 语言模型 n-gram CBHG 数据集 本文搭建一个完整的中文语音识别系统,包括声学模型和语言模型,能够将输入的音频信号识别为汉字. 声学模型 ...
- 基于Text-CNN模型的中文文本分类实战 流川枫 发表于AI星球订阅
Text-CNN 1.文本分类 转眼学生生涯就结束了,在家待就业期间正好有一段空闲期,可以对曾经感兴趣的一些知识点进行总结. 本文介绍NLP中文本分类任务中核心流程进行了系统的介绍,文末给出一个基于T ...
- 基于Text-CNN模型的中文文本分类实战
Text-CNN 1.文本分类 转眼学生生涯就结束了,在家待就业期间正好有一段空闲期,可以对曾经感兴趣的一些知识点进行总结. 本文介绍NLP中文本分类任务中核心流程进行了系统的介绍,文末给出一个基于T ...
- 《基于SD-SEIR模型的实验室人员不安全行为传播研究》
My Focus:基于SD-SEIR模型的实验室人员不安全行为的传播; 建模与实验仿真 Title: Study on Porpagation of Unsafe Bhavior of Laborat ...
随机推荐
- Python基础2 字符编码和逻辑运算符
编码 AscII码 :标准ASCII码是采用7位二进制码来编码的,最高为0,没有0000 0000,所以就是2**7-1=127个字符 , 当用1个字节(8位二进制码)来表示ASCII码时,就在最高位 ...
- 2018上C语言程序设计(高级)作业- 第3次作业
作业要求一 6-1 输出月份英文名 6-2 查找星期 6-3 计算最长的字符串长度 6-4指定位置输出字符串 6-5奇数值结点链表 6-6学生成绩链表处理 6-7链表拼接 作业要求二 题目6-1输出月 ...
- libev
libev是一个**事件驱动库**,它需要循环探测事件是否发生,在Linux上实际是封装了epoll等系统调用. 其循环过程由ev_loop( )函数设置,循环体是ev_loop结构. //创建事件循 ...
- JAXB性能优化
前言: 之前在查阅jaxb相关资料的同时, 也看到了一些关于性能优化的点. 主要集中于对象和xml互转的过程中, 确实有些实实在在需要注意的点. 这边浅谈jaxb性能优化的一个思路. 案列: 先来构造 ...
- [LeetCode&Python] Problem 409. Longest Palindrome
Given a string which consists of lowercase or uppercase letters, find the length of the longest pali ...
- 添加aimate动画
.page3_ship{ background:url(../image/boat_02.png) 0 center no-repeat; background-size: 486px 385px; ...
- YIT-CTF—隐写术
一:小心心 下载图片——>改后缀名为TXT——>打开发下最后一行有flag 二:双生 下载两张图片——>应为题目说的是双生——>想到可能是两张图片的叠加——>打开图片查看 ...
- 【JVM】java对象
一.对象内存布局 对象在内存中存储可分为3块区域:对象头,实例数据,对齐填充 1.对象头 对象头包含两部分内容. 第一部分:存储对象自身的运行时数据,哈希吗(hashCode),GC分代年龄,锁状态标 ...
- (惊艳)对象序列化和反序列--Hibernate的查询和新增极其相似
Hibernate几个关键字持久化,ORM(关系对象映射)(数据库中关系称作是一张表) 应用在项目中,刘一从写的查询代码,每次都挂掉,想要弄出测试数据,自己想着把查询出来的复杂数据弄到文件里自己要是去 ...
- sqler sql 转rest api 授权处理
我们可以使用内置的authorizer 以及js 脚本,方便的进行api 接口的授权处理 说明: 这个是2.0 的功能,注意版本的使用 参考格式 addpost { authorizer = & ...