把txt、pdf等文件转为一行一行的doccano数据集输入格式

news2024/11/15 23:46:52

文章目录

    • doccano 数据集导入
    • 简介
    • 代码实现
    • 代码运行结果
    • 代码公开

doccano 数据集导入

在这里插入图片描述

在Doccano 导入数据集时,使用TextLine的文件格式,导入的文件需要为一行一行文本的数据格式,每一行文本在导入Doccano后就是一条数据。

简介

主要工作说明:把pdf转成txt文件,在txt文件中,根据句号把文本分隔成一行一行文本,从而实现把pdf转换成doccano标注格式。
提供了两个文件转换功能:

  1. pdf转txt;
  2. txt转doccano的TextLine的文件格式;

下述是具体的函数说明:
trans_pdf_text: 实现把pdf转成txt文件,is_delete_page=True删除PDF的页码;

trans_folder_pdf2txt(prov, output_folder='pdf2txt'): 实现把prov文件夹下的所有pdf转成txt文件,存储到output_folder文件夹下;

cut_txt2sents(input_file, output_file, *args):
  使用split('。')把文本切分成列表,args使用filters.py中的过滤函数进行过滤。
主要使用get_length_filter

代码实现

filters.py的代码如下:

def contains_digit_filters(sentence):
    """
    判断句子中是否包含数字
    """
    for char in sentence:
        if char.isdigit():
            return True
    return False


def get_length_filter(bottom_len=8, top_len=1e3):
    """
        文本长度过滤器,返回一个过滤器,
        用于筛选出文本长度在bottom_len与top_len之间的句子
    """
    def _length_filter(text):
        if bottom_len <= len(text) <= top_len:
            return True
        return False

    return _length_filter


def catalog_filter(text):
    """
        过滤章节,识别到章节则返回False,删除掉
    :param text:
    :return:
    """
    text = text.strip()
    head = text[:5]
    if '第' == head[0]:
        if '章' in head or '节' in head or '篇' in head:
            return False
    return True


def title_filter(text):
    if len(text) <= 45:
        if '国民经济和社会发展' in text and '五年规划' in text:
            return False
    return True

过滤器说明:

get_length_filter(bottom_len=8, top_len=1e3):
  筛选长度在bottom_len与top_len之间的文本,bottom_len筛选掉长度太短的文本,top_len可筛选掉文本的目录。

下面是主要代码:

import os
import re
from filters import get_length_filter, title_filter

"""
pdf -> txt
txt -> doccano
"""


def delete_page_num(text):
    """
        删除页码
    :param text:
    :return:
    """
    page_nums = [
        r'\n- \d+ -( *?)\n',
        r'\n— \d+ —( *?)+\n',
        r'\n\d+( *?)\n',
        r'\nI+( *?)\n',
    ]

    patterns = [re.compile(pattern) for pattern in page_nums]
    for pattern in patterns:
        text = pattern.sub('', text)
    return text


def trans_pdf_text(input_file, output_file, is_delete_page=True):
    """
        把pdf文件转为txt,删除页码,保存到output_file
    :param input_file:
    :param output_file:
    :param is_delete_page:
    :return:
    """
    import fitz
    pdf_file = fitz.open(input_file)  # pdf_path是PDF文件的路径

    res = []
    for i in range(len(pdf_file)):
        page = pdf_file.load_page(i)
        res.append(page.get_text())

    text = ''.join(res)
    if is_delete_page:
        text = delete_page_num(text)
    with open(output_file, 'w') as f:
        f.write(text)


def trans_folder_pdf2txt(prov, output_folder='pdf2txt'):
    """
        把某目录下pdf文件转为txt,方便预览和手动修改
    :return:
    """
    filenames = list(filter(
        lambda x: x.endswith('.pdf'),
        os.listdir(prov)
    ))
    if not os.path.exists(p := os.path.join(output_folder, prov)):
        os.mkdir(p)

    for filename in filenames:
        filename = os.path.join(prov, filename)
        output_file = os.path.join(output_folder, filename.replace('.pdf', '.txt'))
        trans_pdf_text(
            filename,
            output_file
        )


def cut_txt2sents(input_file, output_file, *args):
    """
        这部分处理由pdf转的txt文件,再将txt文本按照句号。切分
        由于pdf转的txt文件,其文件内容很乱,需要进行一些处理
        * args: 过滤器
            针对句子的过滤器
    """
    # 删除  
    delete_list = [
        '\xa0', '\t', '\u3000',
        ' ', '', ' ', ' ', '​',
        '目\n录\n', '\n'
    ]

    if input_file.endswith('.txt'):
        with open(input_file, 'r', encoding='utf-8') as f:
            text = f.read()

        for char in delete_list:
            text = text.replace(char, '')

        text = text.replace(';', '。')
        text = text.replace(';', '。')

        ## 本来按照\n切分最好,但是pdf转txt后,其中包含很多的\n,所以无法使用\n提前切分
        # texts = text.split('\n')

        # for text in texts:
        #     data.extend(text.split('。'))
        data = text.split('。')
        # 过滤器
        for arg in args:
            data = filter(arg, data)

        with open(output_file, 'w') as f:
            f.write('\n'.join(data))


def trans_folder_txt2doccano(input_folder, output_folder, *filter_funcs):
    """
        把某目录下的txt文件转为doccano格式
        针对一整个文件夹内的文件,批量操作)
    :return:
    """
    filenames = list(filter(
        lambda x: x.endswith('.txt'),
        os.listdir(input_folder)
    ))
    if not os.path.exists(output_folder):
        os.mkdir(output_folder)
    for filename in filenames:
        cut_txt2sents(
            os.path.join(input_folder, filename),
            os.path.join(output_folder, filename),
            *filter_funcs
        )



    trans_folder_txt2doccano(
        os.path.join(pdf_txt_folder, prov),
        os.path.join('doccano', prov),
        get_length_filter(8, 200),
        title_filter
    )

    trans_folder_txt2doccano(
        prov, f'doccano/{prov}',
        get_length_filter(8, 200)
    )

代码运行结果

原始文件夹介绍:

湖北省: 存放原始文件,里面有一些pdf文件和txt文件;
pdf2txt: 存放pdf转txt的结果,若希望修改可以手动修改;
doccano: 最终的doccano TextLine 输入格式的文件;
在这里插入图片描述

pdf_txt_folder = 'pdf2txt'
prov = '湖北省'
trans_folder_pdf2txt(prov, pdf_txt_folder)

上述代码实现把湖北省文件夹下的pdf文件转成txt文件,并保存到pdf2txt文件夹下,程序运行结果如下:
在这里插入图片描述
pdf2txt/湖北省/鄂州市国民经济和社会发展第十四个五年规划和二〇三五年远景目标纲要.txt:
在pdf转txt后的文件中,包含有目录信息。
在这里插入图片描述

下述代码实现把pdf2txt/湖北省湖北省文件夹下的txt文件,转换为doccano输入格式,转换结果存储在doccano文件夹下

trans_folder_txt2doccano(
    os.path.join(pdf_txt_folder, prov),
    os.path.join('doccano', prov),
    get_length_filter(8, 200),
    title_filter
)

trans_folder_txt2doccano(
    prov, f'doccano/{prov}',
    get_length_filter(8, 200)
)

在这里插入图片描述
在txt转为doccano标注格式的过程中:
get_length_filter(8, 200):使用文件长度过滤器,只保留文本长度在8到200之间的文本;如下图所示,对比上图,利用长度过滤器删除掉了目录。
在这里插入图片描述

代码公开

  1. 链接: https://pan.baidu.com/s/1x_o70B9VJVg07VPxyMdubQ?pwd=ryku 提取码: ryku
     在百度网盘中,包含了湖北省文件夹下的pdf和txt文件。
  2. https://github.com/JieShenAI/csdn/tree/main/24/03/pdf_txt_doccano
      只有代码,不包括pdf和txt文件;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1534704.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Launcher开发注意事项

在开发Android Launcher时&#xff0c;需要关注性能、用户体验、权限管理、兼容性等方面&#xff0c;同时遵循相关的开发者政策和最佳实践。有几个重要的注意事项&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎…

iStoreOS使用体验

iStoreOS是OpenWRT改版而来的易用的软路由系统 我们知道OpenWRT还是有一定的上手难度的&#xff0c;对于小白要玩好openwrt就需要学习openwrt的扩容 和一些插件的安装&#xff0c;问题的拍错&#xff0c;需要一定的linux系统基础 而iStoreOS这个系统对于小白非常的优化 首先他…

【随笔】Git -- 解决提交时本地与目标分支不一致导致提交失败(三)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

教学管理与教育研究知网教育类G4期刊投稿发表简介

《教学管理与教育研究》杂志是由国家新闻出版总署批准&#xff0c;教育部主管&#xff0c;北京师范大学主办&#xff0c;北京师范大学出版社&#xff08;集团&#xff09;有限公司出版的教育类G4期刊。期刊面向全国学校教育的发展管理、教学研究、科研创新和师资培养等领域&…

档案著录员好干吗

档案著录员是负责对档案资料进行著录、整理和管理的专业人员。他们的工作主要包括&#xff1a; 1. 著录档案资料&#xff1a;根据相关规范和标准&#xff0c;对档案资料进行详细的著录&#xff0c;包括档号、题名、日期、责任者、关键词等信息&#xff0c;以便于后续的检索和利…

用 Open-Sora 高效创作视频,让创意触手可及

近年来&#xff0c;视频内容以爆炸式增长席卷了我们的生活。从短视频平台到直播带货&#xff0c;视频正成为人们获取信息和娱乐的主要方式。然而&#xff0c;传统视频制作流程往往耗时费力&#xff0c;对于普通用户来说门槛较高。 为了降低视频创作门槛&#xff0c;让更多人享…

会声会影2023新版本特点以及会声会影2023序列号注册机keygen下载

会声会影简介 虽然现在已经是2024年了&#xff0c;但是大家对会声会影2024的热爱一直不减&#xff0c;很多人后台问我&#xff0c;有没有会声会影2023序列号和注册机&#xff0c;这不&#xff0c;今天这篇文章它来了。 会声会影2023新版特性 1.全新的进入/中场/退出标题动态功…

YOLOv9运行报错:AttributeError: ‘FreeTypeFont‘ object has no attribute ‘getsize‘

在运行yolov9时&#xff0c;报错&#xff1a;attributeerror: ‘FreeTypeFont’ object has no attribute ‘getsize’ 在网上搜索的结果大部分给出字体不对之类的答案但通过仔细研究&#xff0c;发现该报错的报错原因不是字体不对&#xff0c;而是因为安装了新版本的 Pillow…

小白也可以轻松学大模型 RAG:FlagEmbedding 重排序

RAG模型已经取得了显著的进展&#xff0c;但其性能仍然受到排序质量的限制。在实践中&#xff0c;我们发现重排序技术能够有效地改善排序的效果&#xff0c;从而进一步提升RAG模型在问答任务中的表现。 重排序的作用 与传统的嵌入模型不同&#xff0c;重排序器&#xff08;rera…

SpringBoot整合Redis:Redis优化解决数据一致性问题

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏Redis实战与进阶 本专栏讲解Redis从原理到实践 …

3.21总结​.Codeforces 第 935 轮(第 3 组)(A~D)题解​

一.Codeforces 第 935 轮&#xff08;第 3 组&#xff09;(A~D)题解 (直接给原文了,我电脑的翻译就是一坨.......) 这到题是一道思维题,理解题目意思就会觉得很简单首先内向的人肯定是一个人一个帐篷,我们只要关心外向的人就可以了,我们只要分外向的人可不可以被3整除,分成两种…

fyne时间选择框-自定义组件,带绑定

实现的效果如图 自定义组件代码&#xff1a; package widgetimport ("fmt""fyne.io/fyne/v2""fyne.io/fyne/v2/container""fyne.io/fyne/v2/widget""strconv""time" )var timeLayout "15:04"type Se…

2024临床常用的心衰评估量表,医生必备!

心衰评估的相关量表&#xff0c;是临床常用的量表类型。常笑医学整理了6个常用的心衰评估量表&#xff0c;包括NYHA心功能分级、Killip分级、2型糖尿病的心衰风险评分、心衰院内死亡率评分、急性失代偿期心衰住院患者6个月死亡率评估、心衰患者1年死亡率评估。这些心衰评估量表…

找不到msvcp110.dll无法继续执行程序的多种解决方法

在计算机操作系统中&#xff0c;msvcp110.dll文件扮演着至关重要的角色。作为Microsoft Visual C Redistributable Package的一部分&#xff0c;这个特定的dll文件包含了系统运行多种应用程序所必需的关键运行时库函数。许多Windows应用程序依赖于msvcp110.dll文件来执行基本操…

2024年【熔化焊接与热切割】模拟考试题库及熔化焊接与热切割实操考试视频

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 熔化焊接与热切割模拟考试题库参考答案及熔化焊接与热切割考试试题解析是安全生产模拟考试一点通题库老师及熔化焊接与热切割操作证已考过的学员汇总&#xff0c;相对有效帮助熔化焊接与热切割实操考试视频学员顺利通…

jupyter notebook设置代码提示方法

在命令行运行以下代码&#xff1a; pip install jupyter_contrib_nbextensionsjupyter contrib nbextension install --userpip install jupyter_nbextensions_configuratorjupyter nbextensions_configurator enable --user &#xff08;有时安装第一行后会自动执行第二行&a…

你的电脑打不开摄像头问题

我一直以为我电脑上的摄像头老是打不开是因为硬件不匹配的问题。知道我发现了我的拯救者Y7000的机身盘边的“摄像头开关”按钮。。。 我去&#xff0c;你的摄像头开关按钮怎么设置在机身旁边啊。。。。 —————————————————————— 2024年3月21日更新记录&a…

Halcon ORC字符识别

OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;是通过使用OCR工具实现的。Halcon提供了一些用于进行字符识别的函数和工具&#xff0c;可以帮助用户实现文本的自动识别和提取。 read_ocr_class_mlp&#xff1a;用于读取一个经过训练好的OC…

Linux系统资源管理

Linux系统资源命令 在Linux中查看系统资源常用命令有哪些 在Linux中&#xff0c;系统资源是指计算机硬件、软件和网络设备等可以利用的一切物质和能量。Linux中的系统资源包括&#xff1a; CPU&#xff08;中央处理器&#xff09;&#xff1a;用于处理计算机中的指令和数据的…

Springboot+Vue前后端分离的在线图书商城(书城)系统

项目介绍 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本图书商城管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据…