个人介绍
本科毕业于山西农业大学,2018年3月份开始从事python算法工程师,熟练数据分析,熟练使用机器学习算法进行预测,分类,聚类,熟练数据挖掘,NLP, 知识图谱搭建,推荐算法等业务。我喜欢看书,健身,喜欢结交朋友。每天工作朝九晚六,业余时间充足,每天都有几个小时时间可以用来做兼职,个人比较勤劳,做事认真负责。
工作经历
2020-03-19 -至今软通动力信息技术股份有限公司算法工程师
1.负责搭建新闻文章推荐系统体系 2.负责利用机器学习算法及深度学习算法构建模型,进行文本分类处理 3.负责利用python语法及NLP,falsk框架搭建TopicNet知识图谱结构体系
2018-03-10 -2020-03-12湖南惠农科技有限公司算法工程师
负责将上级领导交给的任务与小组成员进行对接,管理和安排好团队内各成员的日常工作,督促团队成员认真及时的完成任务,最后将任务反复检查无误后提交给领导 负责组织小组成员共同完成水产类商品的价格,销量,销售额,流量转化率商品流通走向等数据统计工作并及时上报 应用机器学习算法进行客户价值分析,挖掘潜在客户
教育经历
2014-09-01 - 2018-07-01山西农业大学水产养殖学本科
2014-2018年就读于山西农业大学,大二开始接触计算机编程,变喜欢上了这个专业,后来经常在图书馆自学python编程语言,大学期间也做过一些python编程的兼职。
技能
项目描述:从neo4j数据库获取三朵云平台所有stories(故事), menus(菜单), leaves(叶子)等数据,从mysql数据库获取ppts等数据,通过jieba, stanfordnlp, nltk工具处理所有故事的文本信息,结合word2vec训练模型,构建词向量,使用LDA主题模型提取主题,使用机器学习算法进行文本分类,建立多种数据之间的联系,将关系结果存入mongodb数据库或pickle形式暂存,搭建API,便于查询图谱相关内容 责任描述: ⚫ 使用cypher语句结合py2neo工具从neo4j图数据库获取stories(storyhotname, storyintro, storykeyword, storyname), menus(menu_name_en, menu_name_cn), leaves(leaf_intro_cn, leaf_big_name, leaf_image_content, leaf_image_title)以及story_id, unique_id与menu_id, leaf_id之间的关系 ⚫ 从mysql数据库中获取ppts相关信息(ppt_big_name, ppt_concept) ⚫ 用jieba.cut()对stories, menus, leaves, ppts数据进行分词处理 ⚫ 使用requests请求tdb接口,获取concepts以及concept和taxonomy, 其他concept的关系,创建中英文concept字典,对以上数据进行分词操作 ⚫ 对stories, menus, leaves, ppts进行tce处理,获取每个concept的类别,index, length, match(打中的concept),并将这四分支的tce结果合并到一起,用Counter进行词频统计,最后用most_common()进行排序 ⚫ 对以上四部分的tce结果进行n-gram操作,寻找共生概念(主题),并将结果合并,建立story_id与topics的关系 ⚫ 使用pseg.cut()对stories, menus, leaves, ppts进行分词和词性标注,借助stopwords及通用词性表过滤掉不符合要求的concept ⚫ 使用rank算法计算出每个concept及短语的rank_score,将四个部分的rank结果合并在一起,相同的concept对应的rank_score相加即可,通过rank_score进行排序,取前2000个,不在原concepts里面的即作为候选词 ⚫ 将stories, leaves, ppts经过tce处理后的conceptname_cn提取出来,用LdaMulticore提取出300个主题 ⚫ 将stories, menus, leaves, ppts分词后的结果合并作为语料库喂入Word2Vec模型进行训练,并将concepts里面的每个概念转为词向量 ⚫ 将上一步每个词向量组成的数组作为x, 每个概念对应的类别组成的数组作为y,选择5个邻居,进行KNN训练模型;选择OVO方式进行SVM训练模型 ⚫ 将story_rake_candidate_phrases,等menu, leaf, ppt等rake数据经过去重,汉字范围筛选,候选词长度筛选操作整合到candidate_phrases中 ⚫ 使用flask, flask_cors, flask_restplus写接口,实现通过story_id查找concept,候选词, 通过concept查找类别,主题,通过concept找到对应的近义词等操作,最终形成知识图谱完整体系 ⚫ 技 术 栈 : python + pandas + py2neo+ rake+ Dictionary + LdaMulticore + Word2Vec+ KNN + SVM + stanza + flask+ flask_cores + flask_restplus
项目描述:获取平台近30万篇新闻文章,这些文章类别如下:'科技': 0, '股票': 1, '体育': 2, '娱乐': 3, '时政': 4, '社会': 5, '教育': 6, '财经': 7, '家居': 8, '游戏': 9, '房产': 10, '时尚': 11, '彩票': 12, '星座': 13,根据历史数据训练出文本分类模型,用于预测新上线新闻类别 责任描述: ⚫ 使用 nltk工具进行中文分句 ⚫ 使用stanfordcorenlp工具对句子进行分词和词性标注,并结合stopwords及停用词性表['m','x','uj','ul','mq','u','v','f']对每一个词进行过滤 ⚫ 使用Counter()及most_common()对所有新闻文章进行词频统计并排序,舍弃掉词频小于5的分词 ⚫ 基于CountVectorizer + RidgeClassifier进行文本分类,用f1_score预测得分为0.74 ⚫ 基于TfidfVectorizer + RidgeClassifier进行文本分类,用f1_score预测得分为0.87 ⚫ 将标签数字做特殊处理,即转为字符串并在前面加上__label__,并用np.random.shuffle将全部数据打乱顺序分为训练集和测试集 ⚫ 使用fasttext.train_supervised进行模型训练,并用predict预测出测试集的所属类别,用f1_score预测得分为0.90 ⚫ 使用torch + bert进行文本分类 ⚫ 综合以上几种模型的评估得分,torch + bert模型的泛化能力最好 ⚫ 技 术 栈 : python + pandas + nltk+ stanfordcorenlp+ CountVectorizer + RidgeClassifier+ TfidfVectorizer + fasttext+ torch + bert + BasicTokenizer
项目描述:对平台用户的点击日志(用户id, 点击文章id, 点击时间戳, 点击环境, 点击设备组, 点击地区, 文章类型id, 文章字数, 文章创建时间戳等信息)进行收集,再等所有用户的日志进行数据预处理,特征工程,相似度计算,模型排序,模型融合,召回出每个用户最可能点击的5篇文章 责任描述: ⚫ 使用 pandas 读取平台用户点击的所有新闻文章; ⚫ 使用hanzi.sentence对每一篇新闻文章进行分句 ⚫ 使用 jieba.posseg.cut()对文章进行中文切词和词性标注,然后用stopwords和停用词性表['m','x','uj','ul','mq','u','v','f']对分词进行过滤 ⚫ 使用Counter()及most_common()对所有新闻文章进行词频统计并排序,舍弃掉词频小于5的分词 ⚫ 将所有分词组成的语料库喂入Word2Vec模型进行训练 ⚫ 使用model.wv.get_vector()对文章进行word embedding处理 ⚫ 使用协同过滤及关联规则计算item2item的相似性矩阵,也就是在计算相似性矩阵的时候将用户点击的时间权重,用户点击的顺序权重,文章创建的时间权重考虑进行 ⚫ 使用协同过滤及关联规则计算user2user的相似性矩阵,也就是在计算相似性矩阵的时候将用户活跃度考虑进来;用户的活跃度通过点击数来衡量 ⚫ 对新闻embedding矩阵进行行范数归一化,通过faiss.IndexFlatIP及add,search检索出每篇文章相似性最大的topk篇新闻及对应的score ⚫ 使用youtubednn及faiss.IndexFlatIP及add,search检索出每个用户相似性最大的topk个用户及对应的score ⚫ 定义一个多路召回的字典,将各路召回的结果都保存在这个字典当中; ⚫ itemcf_sim_itemcf_recall:根据i2i_sim,通过每个用户浏览的历史新闻,找到每一篇历史新闻对应的相似度最高的topk篇新闻及score,不足的用热门新闻补全,将最终的召回新闻列表按照score进行排序; ⚫ embedding_sim_item_recall:原理同上; ⚫ youtubednn_recall:原理同上 ⚫ youtubednn_usercf_recall:通过youtubednn及faiss得到user2user相似性矩阵,根据score排序选出每个用户对应相似性最高的topk个用户,再通过user-item-time字典将相似性用户看过的新闻推荐给此用户,不足的用热门新闻补全,将最终的召回新闻列表按照score进行排序; ⚫ cold_start_recall:冷启动召回,首先我们通过item2item相似性矩阵召回很多篇新闻,然后再对每个用户的历史新闻的如下指标进行统计,新闻主题类型,新闻平均字数,最后一天的新闻id,最后一篇新闻的创建时间,要满足如下条件方可召回:召回新闻类型在历史新闻类型里;召回新闻字数与历史新闻平均字数相差在200以内;召回新闻不在历史浏览的最后一天的新闻里;召回新闻的创建时间与历史最后一次点击新闻的创建时间在90天内 ⚫ 多路召回合并,在做召回评估的时候就会发现有些召回的效果不错有些召回的效果很差,所以对每一路召回的结果,我们可以认为的定义一些权重,来做最终的相似度融合,对每一个召回类型,按照用户对score进行最大最小归一化,方便同一用户同一文章的score相加,最后控制召回数量,取最终的topk个; ⚫ 排序模型: ⚫ 用pad_sequences进行序列填充; ⚫ 用SparseFeat,DenseFeat,VarLenSparseFeat构造用户特征项迭代器和用户项迭代器; ⚫ 用MinMaxScaler对数据进行归一化; ⚫ 用lgb.LGBMRanker对训练集进行fit; ⚫ 用lgb_ranker对测试集进行predict,得到pred_score; ⚫ 用rank函数根据pred_score进行排序; ⚫ 将训练集均分为5份,训练5次,每次取其中4份作为训练集,剩余一份作为测试集,得到5个模型,用这五个模型,分别预测测试集,将5次预测得分求平均值,即为测试集的最终得分; ⚫ 同理,lgb.LGBMClassifier, DIN分类模型和上面的LGB排序模型的操作方法类似; ⚫ 模型融合: ⚫ 将以上三种模型训练出来的得分按照user_id和click_article_id进行groupby,然后对每组的pred_score进行求和;按照user_id对结果模型融合后的数据进行groupby,用rank函数对pred_score进行排序(降序); ⚫ 按照pred_score从大到小每个用户选出topk篇点击概率最大的新闻。 ⚫ 技 术 栈 : python + pandas + numpy + hanzi + jieba + Counter + Word2Vec + youtubednn + faiss + deepctr + tensorflow + LGB + DIN