Học sâu trích xuất văn bản từ pdf python

Khai thác dữ liệu là quá trình trích xuất dữ liệu từ nhiều nguồn khác nhau như tệp CSV, web, PDF, v.v. Mặc dù trong một số tệp, dữ liệu có thể được trích xuất dễ dàng như trong CSV, trong khi ở các tệp như PDF không có cấu trúc, chúng tôi phải thực hiện các tác vụ bổ sung để trích xuất dữ liệu từ PDF Python

Có một vài thư viện Python mà bạn có thể trích xuất dữ liệu từ các tệp PDF. Ví dụ: bạn có thể sử dụng thư viện PyPDF2 để trích xuất văn bản từ tệp PDF có văn bản theo trình tự hoặc định dạng i. e. trong dòng hoặc hình thức. Bạn cũng có thể trích xuất các bảng trong tệp PDF thông qua thư viện Camelot. Trong tất cả các trường hợp này, dữ liệu ở dạng có cấu trúc. e. tuần tự, biểu mẫu hoặc bảng

Tuy nhiên, trong thế giới thực, hầu hết dữ liệu không có ở bất kỳ dạng nào và không có thứ tự dữ liệu. Nó hiện diện ở dạng phi cấu trúc. Trong trường hợp này, việc sử dụng các thư viện python ở trên là không khả thi vì chúng sẽ cho kết quả không rõ ràng. Để phân tích dữ liệu phi cấu trúc, chúng ta cần chuyển đổi nó sang dạng có cấu trúc

Do đó, không có kỹ thuật hoặc quy trình cụ thể nào để trích xuất dữ liệu từ các tệp PDF không có cấu trúc vì dữ liệu được lưu trữ ngẫu nhiên và nó phụ thuộc vào loại dữ liệu bạn muốn trích xuất từ ​​PDF

Ở đây, tôi sẽ chỉ cho bạn một kỹ thuật thành công nhất & một thư viện python mà qua đó bạn có thể trích xuất dữ liệu từ các hộp giới hạn trong các tệp PDF không có cấu trúc và sau đó thực hiện thao tác làm sạch dữ liệu trên dữ liệu đã trích xuất và chuyển đổi nó thành dạng có cấu trúc

PyMuPDF

Tôi đã sử dụng thư viện PyMuPDF cho mục đích này. Thư viện này cung cấp nhiều ứng dụng như trích xuất hình ảnh từ PDF, trích xuất văn bản từ các hình dạng khác nhau, tạo chú thích, vẽ hộp giới hạn xung quanh văn bản cùng với các tính năng của thư viện như PyPDF2

Bây giờ, tôi sẽ chỉ cho bạn cách tôi trích xuất dữ liệu từ các hộp giới hạn trong tệp PDF có nhiều trang

Đây là PDF và các hộp giới hạn màu đỏ mà chúng tôi cần trích xuất dữ liệu

Tôi đã thử nhiều thư viện python như PyPDF2, PDFMiner, pikepdf, Camelot và tabulat. Tuy nhiên, không có ứng dụng nào hoạt động ngoại trừ PyMuPDF để trích xuất dữ liệu từ PDF bằng Python

Trước khi đi vào mã, điều quan trọng là phải hiểu ý nghĩa của 2 thuật ngữ quan trọng sẽ giúp hiểu mã

Từ. Dãy ký tự không có khoảng trắng. Ví dụ – tro, 23, 2, 3

Chú thích. Chú thích liên kết một đối tượng như ghi chú, hình ảnh hoặc hộp giới hạn với một vị trí trên trang của tài liệu PDF hoặc cung cấp cách tương tác với người dùng bằng chuột và bàn phím. Các đối tượng được gọi là chú thích

Xin lưu ý rằng trong trường hợp của chúng tôi, hộp giới hạn, chú thích và hình chữ nhật là giống nhau. Do đó, các thuật ngữ này sẽ được sử dụng thay thế cho nhau

Đầu tiên, chúng tôi sẽ trích xuất văn bản từ một trong các hộp giới hạn. Sau đó, chúng tôi sẽ sử dụng quy trình tương tự để trích xuất dữ liệu từ tất cả các hộp giới hạn của pdf

Mã số

import fitz
import pandas as pd 
doc = fitz.open['Mansfield--70-21009048 - ConvertToExcel.pdf']
page1 = doc[0]
words = page1.get_text["words"]

Đầu tiên, chúng tôi nhập mô-đun fitz của thư viện PyMuPDF và thư viện gấu trúc. Sau đó, đối tượng của tệp PDF được tạo và lưu trữ trong tài liệu và trang pdf đầu tiên được lưu trữ trên trang1. trang. get_text[] trích xuất tất cả các từ của trang 1. Mỗi từ bao gồm một bộ có 8 phần tử

Trong biến word, 4 phần tử đầu đại diện cho tọa độ của từ, phần tử thứ 5 là chính từ đó, các phần tử thứ 6,7,8 lần lượt là số khối, dòng, từ

ĐẦU RA

Trích xuất tọa độ của đối tượng đầu tiên

first_annots=[]

rec=page1.first_annot.rect

rec

#Information of words in first object is stored in mywords

mywords = [w for w in words if fitz.Rect[w[:4]] in rec]

ann= make_text[mywords]

first_annots.append[ann]

Hàm này chọn các từ có trong hộp, sắp xếp các từ và trả về dạng chuỗi.  

def make_text[words]:

    line_dict = {} 

    words.sort[key=lambda w: w[0]]

    for w in words:  

        y1 = round[w[3], 1]  

        word = w[4] 

        line = line_dict.get[y1, []]  

        line.append[word]  

        line_dict[y1] = line  

    lines = list[line_dict.items[]]

    lines.sort[]  

    return "n".join[[" ".join[line[1]] for line in lines]]

ĐẦU RA

trang. first_annot[] đưa ra chú thích đầu tiên tôi. e. hộp giới hạn của trang

rect đưa ra tọa độ của một hình chữ nhật

Bây giờ, chúng ta có tọa độ của hình chữ nhật và tất cả các từ trên trang. Sau đó, chúng tôi lọc các từ có trong hộp giới hạn của chúng tôi và lưu trữ chúng trong biến mywords

Chúng tôi đã có tất cả các từ trong hình chữ nhật với tọa độ của chúng. Tuy nhiên, những từ này theo thứ tự ngẫu nhiên. Vì chúng tôi cần văn bản theo trình tự và điều đó chỉ có ý nghĩa, nên chúng tôi đã sử dụng hàm make_text[] để sắp xếp các từ đầu tiên từ trái sang phải rồi từ trên xuống dưới. Nó trả về văn bản ở định dạng chuỗi

Tiếng hoan hô. Chúng tôi đã trích xuất dữ liệu từ một chú thích. Nhiệm vụ tiếp theo của chúng tôi là trích xuất dữ liệu từ tất cả các chú thích của PDF sẽ được thực hiện theo cách tiếp cận tương tự

Trích xuất từng trang của tài liệu và tất cả các chú thích/hình chữ nhật

for pageno in range[0,len[doc]-1]:

    page = doc[pageno]

    words = page.get_text["words"]

    for annot in page.annots[]:

        if annot!=None:

            rec=annot.rect

            mywords = [w for w in words if fitz.Rect[w[:4]] in rec]

            ann= make_text[mywords]

            all_annots.append[ann]

all_annots, một danh sách được khởi tạo để lưu trữ văn bản của tất cả các chú thích trong pdf

Chức năng của vòng lặp ngoài trong đoạn mã trên là duyệt qua từng trang của PDF, trong khi chức năng của vòng lặp bên trong là duyệt qua tất cả các chú thích của trang và thực hiện nhiệm vụ thêm văn bản vào danh sách all_annots như đã thảo luận trước đó

In all_annots cung cấp cho chúng tôi văn bản của tất cả các chú thích của pdf mà bạn có thể xem bên dưới

ĐẦU RA

Cuối cùng, chúng tôi đã trích xuất các văn bản từ tất cả các hộp chú thích/giới hạn

Đã đến lúc làm sạch dữ liệu và đưa dữ liệu về dạng dễ hiểu

Làm sạch dữ liệu và xử lý dữ liệu

Tách để tạo thành tên cột và các giá trị của nó

cont=[]

for i in range[0,len[all_annots]]:

    cont.append[all_annots[i].split['n',1]]

Loại bỏ các ký hiệu không cần thiết *,#,

liss=[]

for i in range[0,len[cont]]:

    lis=[]

    for j in cont[i]:

        j=j.replace['*','']

        j=j.replace['#','']

        j=j.replace[':','']

        j=j.strip[]

        #print[j]

        lis.append[j]

    liss.append[lis]

Tách thành các khóa và giá trị và xóa khoảng trắng trong các giá trị chỉ chứa chữ số

keys=[]

values=[]

for i in liss:

    keys.append[i[0]]

    values.append[i[1]]

for i in range[0, len[values]]:

    for j in range[0,len[values[i]]]:

        if values[i][j]>='A' and values[i][j]

Chủ Đề