Python如何实现Word文件批量信息提取与结构化解析

数据示例:

文件内容分为两部分,一种为表格形式

Python如何实现Word文件批量信息提取与结构化解析_第1张图片

Word中的第一个表格

一种为文本段落形式

Python如何实现Word文件批量信息提取与结构化解析_第2张图片

Word文件中需要结构化处理的内容

需求:

将表格中文本进行提取,第一列为字段名,第二列为数据内容

将段落中的内容按照符号【字段】内容 对应关系转为表格

处理步骤:

from docx import Document
import pandas as pd

path = "./data/保健食品备案/食健备G201845001742.docx"
docx = Document(path)

表格处理

    table=table_s[0]
    
    dic_data={}
    for i in range(0,len(table.rows)):
        title=table.cell(i, 0).text
        data=table.cell(i, 1).text
        dic_data[title]=data

文本处理

  • 正则匹配日期
pattern = re.compile(r'\d+年\d+月\d+日')   # 查找日期
for page in pages:
    print(page.text)
    if pattern.match(page.text):
        break

Python如何实现Word文件批量信息提取与结构化解析_第3张图片

正则日期匹配

  • 正则匹配字段与内容
# 正则表达式
line='''【原料】醋酸视黄酯,维生素D3,维生素K2 (发酵法),D-α-生育酚【辅料】大豆油,明胶,纯化水,甘油,焦糖色,二氧化钛,玉米油,拧檬黄铝色淀, 二丁基羟基甲苯(BHT)【功效成分及含量】每粒含:维生素A 223.0μg维生素D3 8.4μg维生素K2 34.0μg 维生素 E 5.0mg【适宜人群】需要补充多种维生素的4-17岁人群【不适宜人群】3岁以下人群及孕妇、乳母【保健功能】补充多种维生素【食用量及食用方法】每日1次,每次1粒,食用方法:口服 【规格】0.5 g/粒【贮藏方法】密封,置阴凉干燥处【保质期】24个月【注意事项】本品不能代替药物。适宜人群外的人群不推荐食用本产品。 不宜超过推荐量或与同类营养素同时食用'''

pattern = re.compile(r'(【.+?】)([^】【]+)')   # 正则
result1 = pattern.findall(line)
result1

Python如何实现Word文件批量信息提取与结构化解析_第4张图片

正则提取字段与内容

  • 完整代码
    # 解析文本
    pages = docx.paragraphs
    
    # 获取日期
    def get_date(pages):
        pattern = re.compile(r'\d+年\d+月\d+日')   # 查找数字
        for page in pages:
            if pattern.match(page.text):
                break
        return page.text
    dic_data['日期']=get_date(pages)
    
    # 判断文本范围
    def get_num(pages):
        num=0
        for page in pages:
            if page.text=='附件2':
                break
            else:
                num=num+1
        return num
    
    t=[]
    for i in pages[1:get_num(pages)]:
        t.append(i.text)
    line=''.join(t) # 得到长文本
    
    pattern = re.compile(r'(【.+?】)([^】【]+)')   # 正则
    result = pattern.findall(line)
    
    for j in result:
        dic_data[j[0]]=j[1]

单个文件处理函数封装

def Word_Extract_Contents(path):
    # 解析第一个表格
    docx = Document(path)
    table_s = docx.tables
    table=table_s[0]
    
    dic_data={}
    for i in range(0,len(table.rows)):
        title=table.cell(i, 0).text
        data=table.cell(i, 1).text
        dic_data[title]=data
        
    # 解析文本
    pages = docx.paragraphs
    
    # 获取日期
    def get_date(pages):
        pattern = re.compile(r'\d+年\d+月\d+日')   # 查找数字
        for page in pages:
            if pattern.match(page.text):
                break
        return page.text
    dic_data['日期']=get_date(pages)
    
    # 判断文本范围
    def get_num(pages):
        num=0
        for page in pages:
            if page.text=='附件2':
                break
            else:
                num=num+1
        return num
    
    t=[]
    for i in pages[1:get_num(pages)]:
        t.append(i.text)
    line=''.join(t) # 得到长文本
    
    pattern = re.compile(r'(【.+?】)([^】【]+)')   # 正则
    result = pattern.findall(line)
    
    for j in result:
        dic_data[j[0]]=j[1]
    
    
    
    df=pd.DataFrame([dic_data])
    return df

获取文件夹文件目录

# 获取文件夹中的文件目录
import os
paths=os.listdir('./data/保健食品备案')

数据处理与汇总

df0=pd.DataFrame()
for path in paths:
    df=Word_Extract_Contents('./data/保健食品备案/{}'.format(path))
    print(type(df))
    df0=pd.concat([df0,df],axis=0)

数据保存

df0.to_excel('./data/保健食品备案2021.07.13.xlsx',index=False)

处理结果

Python如何实现Word文件批量信息提取与结构化解析_第5张图片

Excel结果

你可能感兴趣的:(Python)