【发布时间】:2021-10-17 09:02:55
【问题描述】:
编辑 4:
我想做的更简单的例子:
我有一个这样的列表:
sentences = ['Hello, how are','how are you','you doing?']
我想把它变成这样的字符串:
sentence = 'Hello, how are you doing?'
感谢任何帮助!
原帖:
我正在尝试从 .pdf 文件中提取突出显示的文本并将其放入具有相同名称的 .docx 文件中。
这是它的代码:
from typing import List, Tuple
import fitz # install with 'pip install pymupdf'
import os
from docx import Document
def _parse_highlight(annot: fitz.Annot, wordlist: List[Tuple[float, float, float, float, str, int, int, int]]) -> str:
points = annot.vertices
quad_count = int(len(points) / 4)
sentences = []
for i in range(quad_count):
# where the highlighted part is
r = fitz.Quad(points[i * 4: i * 4 + 4]).rect
words = [w for w in wordlist if fitz.Rect(w[:4]).intersects(r)]
sentences.append(" ".join(w[4] for w in words))
sentence = " ".join(sentences)
return sentence
def handle_page(page):
wordlist = page.getText("words") # list of words on page
wordlist.sort(key=lambda w: (w[3], w[0])) # ascending y, then x
separator = "PÁGINA NÚMERO " + str(page.number) + ": "
highlights = []
annot = page.firstAnnot
while annot:
if annot.type[0] == 8:
highlights.append(separator)
highlights.append(_parse_highlight(annot, wordlist))
document.add_paragraph(highlights)
annot = annot.next
return highlights
def main(filepath: str) -> List:
doc = fitz.open(filepath)
highlights = []
for page in doc:
highlights += handle_page(page)
return highlights
dir_files = [f for f in os.listdir(".") if os.path.isfile(os.path.join(".", f))]
print(dir_files)
document = Document()
for file in dir_files: # look at every file in the current directory
if file.endswith('.pdf'): # if it is a PDF, use it
print('Working on converting: ' + file)
main(file)
document.save(file.replace(".pdf",".docx"))
我不得不说我没有写出让文本脱离亮点的部分。我知道了here。
问题是它创建的列表中有重复的项目。以下是 .docx 文件的输出示例:
PÁGINA NÚMERO 0: En los primeros tiempos de la microscopia electronica los bi-logos pensaban que los organulos de una célula eucarionte primeos tiempos de la microscopia electronica los bi-logos pensaban que losorganulos de una célula eucarionte flotaban libremente en醇。 Pero los progresos realizados pensaban que losorganulos de una célula eucarionte flota-ban libremente en el citosol。 Pero los progresos realizados tanto en la microscopia 6ptica como en la microscopia en el citosol。 Pero los progresos realizados tanto en la microscopia 6ptica como en la microscopia electronica han revelado la presencia del citoesqueleto, una red de fibras microscopia 6ptica como en la microscopia electronica han revelado la presencia del citoesqueleto, una red de fibras que se extiende a traves del citosqueleto (图 6-20)。 El citoesqueleto, revelado la presencia del citoesqueleto, una red de fibras que se extiende a través del citoplasma(图 6-20)。 El citoesqueleto, que desempena un papel importante en la Organizacion a través del citoplasma(图 6-20)。 que desempena un papel importante en la Organizacion estructuras y las actividades de la célula, PÁGINA NÚMERO 0: En los primeros tiempos de la microscopia electronica los bi-logos pensaban que losorganulos de una célula eucarionte primeos tiempos de la microscopia electronica los bi-logos pensaban que losorganulos de una célula eucarionte flotaban libremente en el citosol。 Pero los progresos realizados pensaban que losorganulos de una célula eucarionte flota-ban libremente en el citosol。 Pero los progresos realizados tanto en la microscopia 6ptica como en la microscopia en el citosol。 Pero los progresos realizados tanto en la microscopia 6ptica como en la microscopia electronica han revelado la presencia del citoesqueleto, una red de fibras microscopia 6ptica como en la microscopia electronica han revelado la presencia del citoesqueleto, una red de fibras que se extiende a traves del citosqueleto (图 6-20)。 El citoesqueleto, revelado la presencia del citoesqueleto, una red de
如您所见,它不止一次地重复同一件事。
我认为这是因为我的 pdf 像这样分成两部分:
但是将每一页分成两半并创建更长的 pdf 会很不方便。另一个问题可能是我对这个 pdf 进行了 OCR 处理,这可能会导致问题(这就是为什么文本输出与 pdf 略有不同,但我对此很好)。
所以我正在寻找一种方法来检查“亮点”列表是否有重复的项目并删除它们。或者也许在它们被添加到列表之前检查而不添加它们。但是我在编程方面没有那么经验,所以我请求您的帮助!
感谢任何帮助!
抱歉,英语不好!
编辑 1:
我现在已经尝试过这样做:
...
def main(filepath: str) -> List:
doc = fitz.open(filepath)
highlights = []
for page in doc:
highlights += handle_page(page)
highlights = set(highlights)
highlights = list(highlights)
document.add_paragraph(highlights)
return highlights
...
但它不起作用。它甚至会更改项目的顺序,因为它会删除最先添加的内容,而我不希望这样做。
编辑 2:
我想我找到了困扰我的地方。
在他们加入“句子”之前我做了print(sentences),这就是我得到的:
['En los primeros tiempos de la microscopia electronica los bio-logos pensaban que losorganulos de una célula eucarionte', 'primeros tiempos de la microscopia electronica los bio-logos pensaban que losorganulos de una célula eucarionte flotaban libremente en el citosol。 Pero los progresos realizados', 'pensaban que losorganulos de una célula eucarionte flota-ban libremente en el citosol。 Pero los progresos realizados tanto en la microscopia 6ptica como en la microscopia', 'en el citosol。 Pero los progresos realizados tanto en la microscopia 6ptica como en la microscopia electronica han revelado la presencia del citoesqueleto, una red de fibras', 'microscopia 6ptica como en la microscopia electronica han revelado la presencia del citoesqueleto, una red de fibras que se extiende a través del citoplasma(图 6-20)。 El citoesqueleto,', 'revelado la presencia del citoesqueleto, una red de fibras que se extiende a través del citoplasma(图 6-20)。 El citoesqueleto, que desempena un papel importante en la organizacion', 'a través del citoplasma(图 6-20)。 que desempena un papel importante en la Organizacion estructuras y las actividades de la célula,']
正如您所见,“句子”中的项目相互包含,因此即使我使用 set(sentences) 它也不起作用。我很确定 OCR 与此有关。
所以现在我认为我需要将注意力转移到交叉引用“句子”中的每个项目上。
就像做 A+B-(A∩B)=C 时一样。这意味着 C 不会有重复项,并且如果顺序正确,它将构成一个易于理解的句子。但是如果有办法做到这一点,我完全是空白。
我也学会了这个以消除欺骗并保持列表的顺序:list(dict.fromkeys())
编辑 3:
仅运行此代码:
def _parse_highlight(annot: fitz.Annot, wordlist: List[Tuple[float, float, float, float, str, int, int, int]]) -> str:
points = annot.vertices
quad_count = int(len(points) / 4)
sentences = []
for i in range(quad_count):
# where the highlighted part is
r = fitz.Quad(points[i * 4: i * 4 + 4]).rect
words = [w for w in wordlist if fitz.Rect(w[:4]).intersects(r)]
sentences.append(" ".join(w[4] for w in words))
print(sentences)
sentence = " ".join(sentences)
print(sentence)
return sentence
def handle_page(page):
wordlist = page.getText("words") # list of words on page
wordlist.sort(key=lambda w: (w[3], w[0]))
separator = "PÁGINA NÚMERO " + str(page.number) + ": "
highlights = []
annot = page.firstAnnot
while annot:
if annot.type[0] == 8:
highlights.append(separator)
highlights.append(_parse_highlight(annot, wordlist))
annot = annot.next
return highlights
def main(filepath: str) -> List:
doc = fitz.open(filepath)
highlights = []
for page in doc:
highlights += handle_page(page)
print(highlights)
return highlights
main(example.pdf)
这是我唯一强调的:
终端是这样说的:
['El citoesqueleto es una red de fibras que Organiza las estructuras', 'citoesqueleto es una red de que Organiza las estructuras y las actividades', 'las estructuras y las actividades de la célula', 'En los primeos tiempos de la microscopia electronica los bio-logos pensaban que los organulos de una célula eucarionte', 'primeros tiempos de la microscopia electronica los bio-logos pensaban que losorganulos de una célula eucarionte flotaban libremente en el citosol。 Pero los progresos realizados', 'pensaban que losorganulos de una célula eucarionte flota-ban libremente en el citosol。 Pero los progresos realizados tanto en la microscopia 6ptica como en la microscopia', 'en el citosol。 Pero los progresos realizados tanto en la microscopia 6ptica como en la microscopia electronica han revelado la presencia del citoesqueleto, una red de fibras', 'microscopia 6ptica como en la microscopia revelado la presencia del citoesqueleto, extiende a traves del citoplasma']
El citoesqueleto es una red de fibras que Organiza las estructuras citoesqueleto es una red de que Organiza de una célula eucarionte primeos tiempos de la microscopia electronica los bio-logos pensaban que losorganulos de una célula eucarionte flotaban libremente en el citosol。 Pero los progresos realizados pensaban que losorganulos de una célula eucarionte flota-ban libremente en el citosol。 Pero los progresos realizados tanto en la microscopia 6ptica como en la microscopia en el citosol。 Pero los progresos realizados tanto en la microscopia 6ptica como en la microscopia electronica han revelado la presencia del citoesqueleto, una red de fibras microscopia 6ptica como en la microscopia revelado la presencia del citoesqueleto, extiende a traves del citoplasma
['PÁGINA NÚMERO 0: ', 'El citoesqueleto es una red de fibras que Organiza las estructuras citoesqueleto es una red de que Organiza las estructuras y las actividades las estructuras y las actividades de la célula En los primeos tiempos de la microscopia electronica los bio-logos pensaban que losorganulos de una célula eucarionte primeos tiempos de la microscopia Pero los progresos realizados pensaban que losorganulos de una célula eucarionte flota-ban libremente en el citosol。 Pero los progresos realizados tanto en la microscopia 6ptica como en la microscopia en el citosol。 Pero los progresos realizados tanto en la microscopia 6ptica como en la microscopia electronica han revelado la presencia del citoesqueleto, una red de fibras microscopia 6ptica como en la microscopia revelado la presencia del citoesqueleto, extiende a través del citosqueleto']
现在我看到一些我没有突出显示的文本也被变成了“句子”项目。同样,我认为这是 OCR 的错误,或者我可以更好地调整 pymupdf idk。
【问题讨论】:
标签: python python-docx pymupdf