Python结合正则式匹配与分句的方式提取文本中的金额

本博文将一个文本中的金额信息利用正则式和分句的方式提取出来。对于一个文本而言文本内容包含的信息多种多样,往往我们感兴趣的关键信息都只是简单的几个字符或者一个简单的句子,基于这样的应用场景对于一个上万字的文本而言怎样才能高效而且准确的获取文本的关键信息?本文以获取文本中金额为例讲些一下鄙人对文本结构化与关键信息提取的理解。

首先假设我们拿到一个文本内容如下:

content='''排10西沙湾组苏1-13块产能建设地面工程施工_二标段(供电部分)招标公告(二次公告)【信息时间:2018/9/19】【我要打印】【关闭】排10西沙湾组苏1-13块产能建设地面工程施工_二标段(供电部分)施工专业承包招标公告1.招标条件排10西沙湾组苏1-13块产能建设地面工程已由中国石油化工股份有限公司胜利油田分公司以胜油公司工单[2017]228号批准建设,招标人为中石化新疆新春石油开发有限责任公司,招标代理机构为/。建设资金来自企业自筹,出资比例为100%。排10西沙湾组苏1-13块产能建设地面工程施工_二标段(供电部分)施工专业承包已具备招标条件,现进行公开招标,特邀请有意向的潜在投标人参与投标。2.项目概况与招标范围2.1招标项目名称:排10西沙湾组苏1-13块产能建设地面工程施工_二标段(供电部分)。2.2建设地点:新疆维吾尔族自治区乌苏市甘家湖牧场。2.3建设规模:(1)油气集输:按照油田“四化”标准设计,油井产液经计量后输入高架油罐储存,就地销售,安装40立方米拉油罐4座。(2)供电:电源引自附近线路,架设10千伏电力线路0.6千米。(3)道路:新建沥青混凝土路6千米。2.4建设投资:5230.03万元。2.5计划工期:244天(自开始工作日期始至交工日期止)。2.6标段划分:共三个标段,本标段为第二个标段。2.7标段招标范围:新建10千伏线路0.6千米,及配套。2.8投标人可任意选择一个或多个标段投标,但最多可中标一个标段。2.9其他:招标金额:18万元(含税);主要工期节点:计划开工日期:2018年10月30日;计划交工日期:2019年6月30日。3.投标人资格要求3.1投标人应具备以下基本资格条件:(1)在中华人民共和国境内注册的独立法人;(2)持有行政主管部门核发的:①输变电工程专业承包三级(含)以上企业资质证书;②国家电力监管委员会配出机构颁发的承装类四级(含)以上和承修类四级(含)以上承装(修、试)电力设施许可证;(3)持有建设行政主管部门核发的有效安全生产许可证书;(4)持有有效的质量管理、环境管理、职业健康安全管理体系认证证书(必须为中文版);(5)财务状况良好,具有足够资产及垫资能力并有效地履行合同。3.2本次招标不接受联合体投标。3.3本次招标要求投标人拟派项目经理具备以下资格条件:(1)持有机电工程专业二级(含)以上注册建造师注册执业证书(注册于投标人单位);(2)具备有效的建筑施工企业项目负责人安全生产考核合格证书;(3)持有有效的社保缴纳证明。3.4本次招标要求投标人拟派安全负责人持有建筑施工企业专职安全生产管理人员证及有效的社保缴纳证明。3.5本次招标要求投标人拟派技术负责人具备以下资格条件:(1)持有建设工程相关专业中级及以上职称证书;(2)持有有效的社保缴纳证明。3.6本次招标要求投标人拟派质量负责人具备以下资格条件:(1)持有建设行政主管部门核发的安装工程质检员岗位证书或石油化工工程质量监督总站核发的安装工程中国石化工程质量检查员岗位证书;(2)持有有效的社保缴纳证明。3.7本次招标资格审查方式:资格后审。4.注册、报名、申领电子印章与招标文件及相关资料获取4.1本招标项目采用全流程电子招标投标的方式,通过中国石化电子招标投标交易网(以下简称交易平台)在线完成发标、投标、评标等工作。4.2潜在投标人须登陆交易平台进行注册、报名、申领企业CA数字证书的电子印章(以下简称CA章)、下载招标文件等。4.3获取招标文件、图纸等相关资料时间:(1)获取时间:2018年9月20日08:30至2018年9月25日17:30。(2)获取截止时间:2018年9月25日17:30。4.4若图纸容量太大等因素,请潜在投标人按照以下时间、地点获取纸质版图纸并提交押金:(1)获取时间:/至/。(2)获取截止时间:/。(3)获取地点:/。(4)获取纸质版图纸时提交押金:人民币/元,中标结果公示前退还图纸时,招标人退还图纸押金(无息)。5.投标保证金5.1招标人不要求投标人提交投标保证金。6.投标文件编制及递交6.1编制:投标文件须采用“中国石化投标文件制作软件”进行编制。6.2递交时间:投标截止时间前均可递交。6.3投标截止时间:2018年10月10日09:00。6.4递交方式:登录交易平台上传(投标人保存文件上传成功回执,递交时间即为上传成功回执时间)。7.开标7.1开标时间:2018年10月10日09:00。7.2开标地点(适用于现场开标):地面工程建设监督中心三楼第一开标室。7.3开标地址(适用于现场开标):山东省东营市东营区西四路270号地面工程建设监督中心(西四路与北一路交叉口以北100米)三楼309室(第一开标室)。8.其它8.1本次招标对投标人不作经济补偿。8.2请投标人注意:在开标前自己的身份应对其他投标人保密。9.招标人名称:中石化新疆新春石油开发有限责任公司;地址:山东省东营市东营区西四路633号;邮编:257000;联系人:潘阳;电话:0546-8505598;传真:0546-8505598;电子邮箱:[email protected]。10.招标代理机构(适用于委托招标)名称:/;地址:/;邮编:/;联系人:/;电话:/;传真:/;电子邮箱:/。11.发布公告的媒介本招标公告同时在中国采购与招标网(http://www.chinabidding.com.cn)、中国石化电子招标投标交易网(https://ebidding.sinopec.com)和国家公共服务平台(http://www.cebpubservice.com/)上发布。12.公告发布期限本公告发布期限:从本公告规定的招标文件下载时间起,到下载截止时间止。招标人或招标代理机构:中石化新疆新春石油开发有限责任公司2018年9月20日'''

光是看文本的篇幅就很大,那么对于这样的一个文本信息我们怎么才能让一个简单程序去找到我们想要的金额信息呢?我们所做的第一件事情就是对整个文本进行分句。在Python语言中可以用re.split('。|;|、', content)的方式对文本进行分句处理,该函数的大致意思就是讲content用。和;或者、进行句子拆分。

对拆分后句子我们再怎么处理呢?

判断每个句子中是否包含一般金额的常规表达方式,这时候就需要用到Python中字符串匹配的方式了,如果一个句子包含数字和“元”这两个信息,那么有极大的可能就是我们想要的金额信息了。经过字符串匹配之后就将结果存储在一个Set(包含有“元”和数字的句子)集合中,接下来就是通过正则式匹配提取Set中每个句子中的金额信息了。

具体代码如下:

# coding=gbk
import re
Regx = re.compile("(([1-9]\\d*[\\d,,]*\\.?\\d*)|(0\\.[0-9]+))(元|百万|万元|亿元|万|亿)")

#此处txt为上文的文本
txt = content

#对整个文本进行分句,根据个人统计和测试,只需要用逗号对文本分句足矣
def cutFun(initial_txt):
    result = re.split('。',initial_txt)
    return result

#符合要求的文本加入集合中
#如果一个句子中有“元”那么将该句子存放在一个临时变量中以供试用
temp_result_set = set()
def YUAN_contain(content):
    str = '元'
    for term in cutFun(content):
        if str in term:
            #print(term)
            temp_result_set.add(term)
YUAN_contain(txt)

for term in temp_result_set:
    print(term)
print('___________________________')

#将temp_result_set中含有数字的句子分离出来
#最终结果为一个集合
result_set = set()
for term in temp_result_set:
    for ch in term:
        if ch.isdigit():
            result_set.add(term)

for term in result_set:
    print(term)
print('___________________________')

#用正则式提取金额
for term in result_set:
    i = Regx.search(term)
    if i != None:
        print(i.group())

接下来解释一下程序中一些必要的元素:

1、coding=gbk,是必须的,而且放在整个程序的开头,这样Python在编译程序时不会出现乱码的问题。

2、正则式Regx中所表达的意思是匹配数字+单位(元,万元等)或者浮点数+单位,这里我们用“|”隔开。

输出为:

D:\pyBench\venv\Scripts\python.exe D:/PyBench/InfoExtract/TEXT_CUT.py
2.4建设投资:5230.03万元
2.9其他:招标金额:18万元(含税);主要工期节点:计划开工日期:2018年10月30日;计划交工日期:2019年6月30日
(4)获取纸质版图纸时提交押金:人民币/元,中标结果公示前退还图纸时,招标人退还图纸押金(无息)
___________________________
2.4建设投资:5230.03万元
2.9其他:招标金额:18万元(含税);主要工期节点:计划开工日期:2018年10月30日;计划交工日期:2019年6月30日
(4)获取纸质版图纸时提交押金:人民币/元,中标结果公示前退还图纸时,招标人退还图纸押金(无息)
___________________________
5230.03万元
18万元

Process finished with exit code 0

代码有点粗糙,单是基本功能实现了,读者可以自行定义功能函数修改完善。

你可能感兴趣的:(Python,正则式,文本信息提取)