--- license: apache-2.0 --- # Chinese_resume_extract ## 模型概述 本模型主要针对中文简历信息提取任务,对 RoBERTa 模型进行了微调。该微调模型旨在提高bert系模型在中文简历信息提取方面的性能,弥补开源中文简历提取模型的缺少。 ## 训练数据 本模型使用了天池大赛项目数据集 [比赛地址](https://tianchi.aliyun.com/competition/entrance/231771/information)。数据处理流程包括: 1. 原始简历文本的提取:通过段落和表格的方式从比赛提供的 word 文档中抽取文本,并去重。 2. 标签数据的生成:递归提取需要的信息字段,设计相应类别标签,不额外设置 BIO 标签,前缀树搜索标注原始文本。 3. 数据合成:对训练数据进行人工合成,处理方法包括重抽样、随机抽样调整各类别数据占比,确保项目经历和项目职责类数据不超过总数的 12%,同时加入噪音数据,即完全与简历无关的负样本,共形成3000 条数据。 ## 模型架构 底座模型采用 RoBERTa-base,由 Benjamin 提供的 `roberta-base-wechsel-chinese` 完成中文语义训练。 ## 训练参数 - 优化器:AdamW - 学习率:3e-5 - 权重衰减:bias、gamma、beta 权重不参与权重衰减,其余权重衰减率为 0.01 - 损失函数:nn.CrossEntropyLoss ## 训练过程 1. 模型首先在随机抽样的 500 条数据上进行初步训练,损失降至约 1.2。 2. 随后在生成的 3000 条数据上继续训练,总计训练轮数为 15 轮。 3. 训练硬件条件为 V100 32G。 ## 训练效果 目前模型效果尚未在测试集上进行评估,后续将会考虑补充。 训练过程中取得的最小平均损失为 0.11216351033912765,该数据仅供参考。 ## 使用示例 ```python import torch from transformers import RobertaForTokenClassification, AutoTokenizer model=RobertaForTokenClassification.from_pretrained('jiangchengchengNLP/Chinese_resume_extract') tokenizer = AutoTokenizer.from_pretrained('jiangchengchengNLP/Chinese_resume_extract',do_lower_case=True) device=torch.device('cuda' if torch.cuda.is_available() else 'cpu') model.eval() model.to(device) import json label_list={ 0:'其他', 1:'电话', 2:'毕业时间', #毕业时间 3:'出生日期', #出生日期 4:'项目名称', #项目名称 5:'毕业院校', #毕业院校 6:'职务', #职务 7:'籍贯', #籍贯 8:'学位', #学位 9:'性别', #性别 10:'姓名', #姓名 11:'工作时间', #工作时间 12:'落户市县', #落户市县 13:'项目时间', #项目时间 14:'最高学历', #最高学历 15:'工作单位', #工作单位 16:'政治面貌', #政治面貌 17:'工作内容', #工作内容 18:'项目责任', #项目责任 } def get_info(text): #文本处理 text=text.strip() text=text.replace('\n',',') # 将换行符替换为逗号 text=text.replace('\r',',') # 将回车符替换为逗号 text=text.replace('\t',',') # 将制表符替换为逗号 text=text.replace(' ',',') # 将空格替换为逗号 #将连续的逗号合并成一个逗号 while ',,' in text: text=text.replace(',,',',') block_list=[] if len(text)>300: #切块策略 #先切分成句 sentence_list=text.split(',') #然后拼接句子长度不超过300,一旦超过300,当前句子放到下一个块中 boundary=300 block_list=[] block=sentence_list[0] for i in range(1,len(sentence_list)): if len(block)+len(sentence_list[i])<=boundary: block+=sentence_list[i] else: block_list.append(block) block=sentence_list[i] block_list.append(block) else: block_list.append(text) _input = tokenizer(block_list, return_tensors='pt',padding=True,truncation=True) #如果有GPU,将输入数据移到GPU input_ids = _input['input_ids'].to(device) attention_mask = _input['attention_mask'].to(device) # 模型推理 with torch.no_grad(): logits = model(input_ids=input_ids, attention_mask=attention_mask)[0] # 获取预测的标签ID #print(logits.shape) ids = torch.argmax(logits, dim=-1) input_ids=input_ids.reshape(-1) #将张量在最后一个维度拼接,并以0为分界,拼接成句 ids =ids.reshape(-1) # 按标签组合成提取内容 extracted_info = {} word_list=[] flag=None for idx, label_id in enumerate(ids): label_id = label_id.item() if label_id!= 0 and (flag==None or flag==label_id): #不等于零时 if flag==None: flag=label_id label = label_list[label_id] # 获取对应的标签 word_list.append(input_ids[idx].item()) if label not in extracted_info: extracted_info[label] = [] else: if word_list: #忽略特殊token sentence=''.join(tokenizer.decode(word_list,skip_special_tokens=True)) extracted_info[label].append(sentence) flag=None word_list=[] if label_id!= 0: label = label_list[label_id] # 获取对应的标签 word_list.append(input_ids[idx].item()) if label not in extracted_info: extracted_info[label] = [] # 返回JSON格式的提取内容 return extracted_info ``` ```python file_name=r'roberta-base-ner\example\test.docx' #测试docx在仓库中 from docx import Document def read_docx(file_path): # 创建 Document 对象 doc = Document(file_path) # 初始化一个列表用于存储段落文本 text = set() # 遍历文档的每个段落 for para in doc.paragraphs: text.add(para.text) # 获取段落文本并添加到列表 for table in doc.tables: for row in table.rows: for cell in row.cells: text.add(cell.text) # 获取表格文本并添加到列表 result=''.join(text) # 将列表中的文本连接成一个字符串 return result # 将文本列表连接成一个字符串 document_text=read_docx(file_name) print(document_text) ``` ```python print(get_info(document_text)) ``` ```python {'项目责任': ['项目经历', '、分季节/节庆提前进行平面主视觉设计有主题有亮点独特展现企业形象风格;2、了解当前基础制作/印刷材料材料市场行情熟悉作业方式及最终想表现效果3、平面设计主题明确表达精准能够新颖、直观表达企业主张4、良好的沟通协调与组织能力为商户提供有效形象服务5、完成领导交办的其他工作教育背景', '良好的心态和责任感吃苦耐劳擅于管理时间勇于面对变化和挑战。', '', '1.负责设备系统管理平台的信息管理;2.负责牧场级《设备管理制度》的起草及修订;3.负责建立牧场所有基础设施、房屋建筑、车辆机具、机器设备等台账并及时更新后报送上级单位保证账物相符;4.负责报批牧场设备闲置、调拨、报废等业务流程;5.负责定期向上级单位报送牧场《闲置资产统计表》;6.负责按月向上级单位报批牧场《设备维修/服务申请》;7.负责向供应商下达牧场各类机备件、五金件、机辅油、维修服务供货订单;8.负责定期向上级单位报送《备件出入库明细表》、《备件库存明细表》、《闲置备件明细表》;9.负责报批牧场《闲置备件的调拨申请》;10.根据设备实际运行数据', '统筹产品进程及时纠错跟进产品进度;5、负责各新产品上市的跟踪及产品的改良升级;6、负责竞争对手产品分析并作出合理的改进机制。良好的公共关系意识善于沟通具备一定的活动策划和组织协调能力。', '1、接听电话接收传真按要求转接电话或记录信息确保及时准确。2、对来访客人做好接待、登记、引导工作及时通知被访人员。3、负责公司快递、信件、包裹的收发工作。4、负责办公用品的管理及采购。5、负责复印、传真和打印等设备的使用与管理工作合理使用降低材料消耗。6、做好会前准备、会议记录和会后内容整理工作。7、做好公司相关资料、档案管理工作。8、日常费用的申请', '公司钉钉的维护管理。9、领导交办的其他人事行政工作'], '项目时间': ['2001.07-2015.091', '2009年03月-2010年12月', '1997/12-2012/11'], '项目名称': ['中国与印度关系研究软硬法视域下的廉政党内法规与国家法律衔接协调问题研究', '化学技术风险的伦理评估与社会治理研究'], '工作时间': ['1993年05月-2012年07月', '2014.09-2018.09', '1998.11-2016.10'], '工作内容': ['负责填写并向上级单位报送《设备故障率日报表》;11.负责牧场《能源设备日运行记录》、《设备日巡检记录》、《设备大修记录》存档工作;12.负责每月向上级部门报送牧场《月度实际发生维修费用汇总表》;13.负责向牧场财务及上级部门报送牧场《月度实际发生能耗费用汇总表》;14.负责牧场《设备自评估报告》按规定时间报送设备管理部;1、负责从前期市场调研到产品立项、策划到新品上市的开发及跟踪工作;2、及时洞察市场动态对行业发展趋势、竞品信息、消费者需求进行深度调查;3、新产品开发阶段结合市场分析从产品定位角度提出建议方案参与新品立项;4、在产品研发阶段能够与开发部沟通专业细节问题同时需要跟部门经理保持沟通', '良好的学习能力习惯制定切实可行的学习计划勤于学习能不断提高', '1通过为客户提供培训、定期和紧急的服务以及销售示范实现现有餐饮客户的销售增长;2了解客户的食品安全需求作为高端清洁卫生流程及计划方面的专家为客户定制解决方案;3安装、维修和维护客户的机器设备利用该项服务加强与客户的关系。', '人事专员'], '落户市县': [], '籍贯': ['香港省香港', '香港省香港市'], '工作单位': ['市昆明红星商业管理有限公司'], '毕业院校': ['北京邮电大学世纪学院'], '电话': ['15500671244'], '出生日期': ['1924.06']} ```