opendatalab / MinerU

A one-stop, open-source, high-quality data extraction tool, supports PDF/webpage/e-book extraction.一站式开源高质量数据提取工具,支持PDF/网页/多格式电子书提取。
https://mineru.readthedocs.io/
GNU Affero General Public License v3.0
13.83k stars 1.04k forks source link

输出的连字太多了 #305

Closed ZhangQi-HUST closed 6 days ago

ZhangQi-HUST commented 3 months ago

Description of the bug | 错误描述

我试了一个英文论文,里面的 fi都输出成连字fi(是一个unicode字符),并且左右还带了一些空格。 例如 fiber中的fi就会变成连字。 感觉应该有个选项可以调整这个问题,但是没找到。

How to reproduce the bug | 如何复现

magic-pdf pdf-command --pdf "Learning dexterity from human hand motion in internet videos.pdf" 会产生很多连字符问题,如 A hand that can fl ex its fi ngers but does not have the mobility of an arm will not be able to solve many useful tasks. 中的 fl, fi等

Operating system | 操作系统

Windows

Python version | Python 版本

3.10

Software version | 软件版本 (magic-pdf --version)

0.6.x

Device mode | 设备模式

cuda

myhloli commented 3 months ago

https://github.com/opendatalab/MinerU/issues/241 你的问题跟这个应该很像,但是我们认为用unicode2ascii不是一个好的方案,如果您有好的方案也可以提供给我们

JustDoIt166 commented 3 months ago

是这样子的,我也遇到了,ff这样连字。不注意还真看不出来

ZhangQi-HUST commented 2 months ago

241 你的问题跟这个应该很像,但是我们认为用unicode2ascii不是一个好的方案,如果您有好的方案也可以提供给我们

我发现问题所在了。 我看了源码,在0.7版本中,提取文本型PDF的文本时,使用的txt_spans_extract函数,其中调用pymupdf的get_text函数提取文本,这个函数的flag参数你们用的是fitz.TEXTFLAGS_TEXT,按pymupdf文档里所述,TEXTFLAGS_TEXT = TEXT_PRESERVE_LIGATURES | TEXT_PRESERVE_WHITESPACE | TEXT_MEDIABOX_CLIP | TEXT_CID_FOR_UNKNOWN_UNICODE,它是多个选项的并集,其中有个选项TEXT_PRESERVE_LIGATURES表示会保留所有的连字,也就是ff, fi这种连字。如果去掉这个flag应该就不会输出连字的ff,而是输出两个字符ff。

简单讲,在使用了fitz.TEXTFLAGS_TEXT的地方,应该换一个flag,即 TEXT_PRESERVE_WHITESPACE | TEXT_MEDIABOX_CLIP | TEXT_CID_FOR_UNKNOWN_UNICODE

myhloli commented 2 months ago

241 你的问题跟这个应该很像,但是我们认为用unicode2ascii不是一个好的方案,如果您有好的方案也可以提供给我们

我发现问题所在了。 我看了源码,在0.7版本中,提取文本型PDF的文本时,使用的txt_spans_extract函数,其中调用pymupdf的get_text函数提取文本,这个函数的flag参数你们用的是fitz.TEXTFLAGS_TEXT,按pymupdf文档里所述,TEXTFLAGS_TEXT = TEXT_PRESERVE_LIGATURES | TEXT_PRESERVE_WHITESPACE | TEXT_MEDIABOX_CLIP | TEXT_CID_FOR_UNKNOWN_UNICODE,它是多个选项的并集,其中有个选项TEXT_PRESERVE_LIGATURES表示会保留所有的连字,也就是ff, fi这种连字。如果去掉这个flag应该就不会输出连字的ff,而是输出两个字符ff。

简单讲,在使用了fitz.TEXTFLAGS_TEXT的地方,应该换一个flag,即 TEXT_PRESERVE_WHITESPACE | TEXT_MEDIABOX_CLIP | TEXT_CID_FOR_UNKNOWN_UNICODE

确实如你所说,我会尝试去除TEXT_PRESERVE_LIGATURES再测试一下

myhloli commented 6 days ago

fix