【上市公司文本分析】Python正则表达式从非结构化文本数据中提取结构化信息——以从上市公司高管简历中提取毕业院校信息为例

从CSMAR中可以获取上市公司高管的简历文本信息,虽然是非结构化的,但是隐约可以从中发现一些规律,例如毕业院校很多出现在 毕业于、就读于 等词语之后,专业很多出现在 大学名 之后,但这些又不是绝对的,也会有其他一些规则。

下方代码是我基于我的300多条示例数据(如果需要练习,可以评论邮箱),经过反复修改正则表达式规则去编制的,能够做到节约85%左右的人工工作量,但无法保证绝对精确。

对于其他非结构化但又有规律可循的文本数据,同样可以采用本代码的逻辑去编制,需要做的工作就是寻找规律,反复试错,根据出错的位置反复修改patterns中的正则表达式。

附一个认为讲的特别好的up主的教学视频,看过一遍后基本就可以上手写正则表达式了。
一节课精通正则表达式与re模块

import re
import pandas as pd

def searchUni(data):
    for index,resume in enumerate(data['Resume']):
        r=resume.replace(',',' ').replace(',',' ').replace('。',' ').replace(';',' ').replace('、',' ').replace(';',' ').replace(':',' ')
        patterns=['(?: |[0-9]{4}年[0-9]{1,2}月于|就读|[0-9]{4}年获得?|(?:毕业)?于]|[0-9]{4}年(?:毕业)?于| 在| 拥有| 及)([^ 毕业于在任就职获拥有及]{2,10}?(?:大学|学院|研究院|研究所|研究生院))(?:[^ ]*?班|[^ ]*?少年班|[^ ]*?系|[^ ]*?专业|[^ ]*?本科|[^ ]*?学士|[^ ]*?学位|[^ ]*?硕士|[^ ]*?博士|[^ ]*?(?:E)?MBA)',
                  '毕业于(.{2,10}?(?:大学|学院|研究院|研究所))',
                  '(?: | 赵博士)于(.{2,10}?(?:大学|学院|研究院|研究所))']
        for pattern in patterns:
            info=re.findall(pattern, r)
            if len(info)>0:
                s=''
                for i in info:
                   s+=i+','
                data['uni'][index]=s[:-1]
                break
            else:
                data['uni'][index]='Nan'
    return data

def searchMD(data):
    for index,resume in enumerate(data['Resume']):
        r=resume.replace(',',' ').replace(',',' ').replace('。',' ').replace(';',' ').replace('、',' ').replace(';',' ').replace(':',' ')
        patterns=['(?:学院(?:.*?班|.*?研究所)?|大学(?:.*?学院|.*?班|.*?研究所)?|研究院|研究所|分校)(?:攻读|获得?)?([^ 和专本硕博校攻读士]{2,15}?)(?:专业|双?学士|双?学位|硕士|博士|本科|学历|系)',
                  '(?:大学|学院)(E?MBA)[^面]',
                  ' (工商管理|物理学|机械|计算机科学|经济管理)(?:专业|双?学士|双?学位|硕士|博士|本科|系) ',
                  '获得?([^ 和本硕博校攻读士]{2,15}?)(?:双?学士|双?学位|硕士|博士|本科|学历|系)']
        for pattern in patterns:
            info=re.findall(pattern, r)
            if len(info)>0 and info[0]!='':
                s=''
                for i in info:
                   s+=i+','
                data['major_deg'][index]=s[:-1]
                break
            elif len(info)==0:
                data['major_deg'][index]='Nan'
    return data

if __name__ == "__main__":
    data=pd.read_excel('demo.xlsx',header=[0])
    data=searchUni(data)
    data=searchMD(data)
    data.to_excel('result.xlsx')

你可能感兴趣的:(#,上市公司文本分析,Python,python,正则表达式)