0
0
Lập trình
Admin Team
Admin Teamtechmely

Khám Phá Dữ Liệu: Tăng Tốc Xử Lý Tài Liệu Excel với Docling

Đăng vào 2 ngày trước

• 12 phút đọc

Khám Phá Dữ Liệu: Tăng Tốc Xử Lý Tài Liệu Excel với Docling

Giới thiệu

Trong thế giới xử lý tài liệu và thu thập dữ liệu AI, việc tìm kiếm công cụ phù hợp là nửa chặng đường. Chắc hẳn bạn đã từng gặp phải tình huống này: phát hiện một thư viện mạnh mẽ như Docling, với khả năng phân tích và cấu trúc nhiều định dạng tệp khác nhau, nhưng lại nhận ra rằng dữ liệu quan trọng của bạn bị khóa trong một định dạng mà nó không hỗ trợ natively, như Excel. Hành trình của tôi gần đây đã gặp phải chính chướng ngại vật này. Khi phương pháp ban đầu có vẻ đơn giản — một quy trình hai bước chuyển đổi Excel sang CSV và sau đó đưa tệp kết quả vào engine mạnh mẽ của Docling — tôi nhanh chóng gặp phải một lỗi lớn. Các workbook Excel của tôi với nhiều tab phong phú đã bỏ sót thông tin quan trọng, vì chỉ có sheet đầu tiên được xử lý. Bài viết này sẽ chi tiết một giải pháp mã hóa tinh chỉnh để khắc phục thách thức cụ thể này, đảm bảo không dữ liệu nào bị bỏ lại khi bạn mở khóa toàn bộ tiềm năng của tài liệu.

Cách tiếp cận

Docling cung cấp một mẫu chuyển đổi đa định dạng rất tốt như dưới đây, nhưng không có định dạng Excel trong đó.

python Copy
import json
import logging
from pathlib import Path

import yaml

from docling.backend.pypdfium2_backend import PyPdfiumDocumentBackend
from docling.datamodel.base_models import InputFormat
from docling.document_converter import (
    DocumentConverter,
    PdfFormatOption,
    WordFormatOption,
)
from docling.pipeline.simple_pipeline import SimplePipeline
from docling.pipeline.standard_pdf_pipeline import StandardPdfPipeline

_log = logging.getLogger(__name__)


def main():
    input_paths = [
        Path("README.md"),
        Path("tests/data/html/wiki_duck.html"),
        Path("tests/data/docx/word_sample.docx"),
        Path("tests/data/docx/lorem_ipsum.docx"),
        Path("tests/data/pptx/powerpoint_sample.pptx"),
        Path("tests/data/2305.03393v1-pg9-img.png"),
        Path("tests/data/pdf/2206.01062.pdf"),
        Path("tests/data/asciidoc/test_01.asciidoc"),
    ]

    ## for defaults use:
    # doc_converter = DocumentConverter()

    ## to customize use:

    # Below we explicitly whitelist formats and override behavior for some of them.
    # You can omit this block and use the defaults (see above) for a quick start.
    doc_converter = DocumentConverter(  # all of the below is optional, has internal defaults.
        allowed_formats=[
            InputFormat.PDF,
            InputFormat.IMAGE,
            InputFormat.DOCX,
            InputFormat.HTML,
            InputFormat.PPTX,
            InputFormat.ASCIIDOC,
            InputFormat.CSV,
            InputFormat.MD,
        ],  # whitelist formats, non-matching files are ignored.
        format_options={
            InputFormat.PDF: PdfFormatOption(
                pipeline_cls=StandardPdfPipeline, backend=PyPdfiumDocumentBackend
            ),
            InputFormat.DOCX: WordFormatOption(
                pipeline_cls=SimplePipeline  # or set a backend, e.g., MsWordDocumentBackend
                # If you change the backend, remember to import it, e.g.:
                #   from docling.backend.msword_backend import MsWordDocumentBackend
            ),
        },
    )

    conv_results = doc_converter.convert_all(input_paths)

    for res in conv_results:
        out_path = Path("scratch")  # ensure this directory exists before running
        print(
            f"Document {res.input.file.name} converted."
            f"\nSaved markdown output to: {out_path!s}"
        )
        _log.debug(res.document._export_to_indented_text(max_text_len=16))
        # Export Docling document to Markdown:
        with (out_path / f"{res.input.file.stem}.md").open("w") as fp:
            fp.write(res.document.export_to_markdown())

        with (out_path / f"{res.input.file.stem}.json").open("w") as fp:
            fp.write(json.dumps(res.document.export_to_dict()))

        with (out_path / f"{res.input.file.stem}.yaml").open("w") as fp:
            fp.write(yaml.safe_dump(res.document.export_to_dict()))


if __name__ == "__main__":
    main()

Bài kiểm tra và triển khai

Để giải quyết vấn đề này, tôi đã xây dựng một giải pháp tùy chỉnh dựa trên các ví dụ cơ bản được cung cấp bởi chính dự án Docling. Triển khai sau đây hoạt động như một cầu nối, chuyển đổi tài liệu Excel với nhiều sheet thành một tệp CSV tổng hợp duy nhất. Khi chuyển đổi hoàn tất, ứng dụng sẽ tận dụng khả năng mạnh mẽ của Docling để xử lý tệp CSV trung gian và tạo ra cả đầu ra Markdown sạch và JSON cấu trúc, cung cấp một quy trình xử lý tài liệu linh hoạt và mạnh mẽ.

Bước 1: Chuẩn bị môi trường Python

Trước tiên, hãy đảm bảo môi trường Python đã sẵn sàng (hoặc sử dụng tệp requirements.txt, chuyên nghiệp hơn 🙂‍↕️).

bash Copy
python3 -m venv venv
source venv/bin/activate

pip install --upgrade pip
pip install docling
pip install pandas
pip install xlrd
pip install openpyxl

Bước 2: Mã nguồn chuyển đổi

python Copy
import pandas as pd
from pathlib import Path
from docling.document_converter import DocumentConverter
import json

def main():
    """
    Hàm chính để xử lý chuyển đổi tài liệu từ thư mục đầu vào sang thư mục đầu ra.
    """
    # Định nghĩa các thư mục đầu vào, đầu ra và tạm thời
    input_dir = Path("./input")
    output_dir = Path("./output")
    tmp_csv_dir = Path("./tmp_csv")

    # Tạo các thư mục đầu ra và tạm thời nếu chúng không tồn tại
    try:
        output_dir.mkdir(parents=True, exist_ok=True)
        tmp_csv_dir.mkdir(parents=True, exist_ok=True)
        print(f"Đã đảm bảo thư mục '{output_dir.resolve()}' và '{tmp_csv_dir.resolve()}' tồn tại.")
    except OSError as e:
        print(f"Lỗi khi tạo thư mục: {e}")
        return

    # Khởi tạo DocumentConverter
    converter = DocumentConverter()

    # Xử lý các tệp trong thư mục đầu vào
    for file_path in input_dir.iterdir():
        # Kiểm tra nếu đường dẫn là một tệp và không phải là thư mục
        if file_path.is_file():
            print(f"Đang xử lý tệp: {file_path.name}")

            original_file_path = file_path

            # Kiểm tra xem tệp có phải là tệp Excel không
            if file_path.suffix.lower() in ['.xlsx', '.xls']:
                print(f"Đã phát hiện tệp Excel. Chuyển đổi '{file_path.name}' sang CSV trước.")
                try:
                    # Đọc tất cả các sheet từ tệp Excel
                    xls = pd.ExcelFile(file_path)
                    all_sheets_df = pd.DataFrame()
                    for sheet_name in xls.sheet_names:
                        print(f"  - Đang đọc sheet: {sheet_name}")
                        df = pd.read_excel(xls, sheet_name=sheet_name)
                        all_sheets_df = pd.concat([all_sheets_df, df], ignore_index=True)

                    csv_file_path = tmp_csv_dir / file_path.with_suffix('.csv').name
                    all_sheets_df.to_csv(csv_file_path, index=False)
                    file_path = csv_file_path
                    print(f"Đã chuyển đổi thành công Excel sang CSV tạm thời: {file_path.name}")
                except Exception as e:
                    print(f"Không thể chuyển đổi tệp Excel '{original_file_path.name}' sang CSV. Lỗi: {e}")
                    continue

            try:
                # Chuyển đổi tài liệu bằng converter
                result = converter.convert(file_path)

                # Xuất tài liệu sang định dạng markdown
                output_content = result.document.export_to_markdown()

                # Định nghĩa đường dẫn tệp đầu ra dựa trên tên tệp gốc
                output_file_path = output_dir / original_file_path.with_suffix('.md').name

                # Ghi nội dung đầu ra vào tệp mới
                with open(output_file_path, "w", encoding="utf-8") as f:
                    f.write(output_content)
                print(f"Đã chuyển đổi thành công sang markdown: '{output_file_path.name}'")

                # Xuất tài liệu sang định dạng JSON
                json_output = result.document.export_to_dict()
                json_file_path = output_dir / original_file_path.with_suffix('.json').name
                with open(json_file_path, "w") as fp:
                    fp.write(json.dumps(json_output, indent=4))
                print(f"Đã tạo đầu ra JSON thành công: '{json_file_path.name}'")

            except Exception as e:
                print(f"Không thể chuyển đổi tệp '{file_path.name}'. Lỗi: {e}")
        else:
            print(f"Bỏ qua đường dẫn không phải tệp: {file_path}")

if __name__ == "__main__":
    main()

Thực nghiệm và Kết quả

Dựa trên đầu ra console, ứng dụng hoạt động đúng như dự kiến. Nó cho thấy khả năng nâng cao bằng cách thành công trong việc lặp qua từng sheet của tệp Excel. Các nhật ký console phục vụ như một ghi chép rõ ràng và có thể xác minh, xác nhận rằng quy trình chuyển đổi đang xử lý mỗi tab một cách mạnh mẽ, không để lại dữ liệu nào, và tạo ra các tệp Markdown và JSON cuối cùng dưới dạng đầu ra tổng hợp.

bash Copy
python app4.py
Đã đảm bảo thư mục '/Users/xxx/Devs/docling-excel/output' và '/Users/xxx/Devs/docling-excel/tmp_csv' tồn tại.
Đang xử lý tệp: Bank Extraction.xlsx
Đã phát hiện tệp Excel. Chuyển đổi 'Bank Extraction.xlsx' sang CSV trước.
  - Đang đọc sheet: RECAP 2013-2014 old
  - Đang đọc sheet: RECAP2012-2013
  - Đang đọc sheet: RECAP 2014
...

Kết luận

Duyệt qua thế giới xử lý tài liệu với các công cụ mạnh mẽ như Docling có thể đôi khi cảm thấy giống như một trò chơi ghép hình, đặc biệt khi bạn gặp phải các định dạng tệp không được hỗ trợ natively. Bài viết này đã trình bày một giải pháp mạnh mẽ và có thể lặp lại cho một thách thức phổ biến: thu thập dữ liệu từ Excel, bao gồm cả từ các workbook đa tab. Bằng cách tận dụng một ứng dụng Python đơn giản để hoạt động như một cầu nối thiết yếu, chúng ta đã chứng minh cách để thành công trong việc chuyển đổi các tệp Excel phức tạp thành một tệp CSV duy nhất. Từ đó, Docling sẽ tiếp quản, biến dữ liệu đó thành cả Markdown có thể đọc và JSON cấu trúc. Phương pháp này đảm bảo không thông tin nào bị mất, và như chúng ta đã thấy, đầu ra console xác nhận một chuyển đổi hoàn chỉnh và thành công, ngay cả với các tệp phức tạp nhất. Cuối cùng, giải pháp này giúp bạn tích hợp dữ liệu Excel vào bất kỳ quy trình làm việc nào, mở khóa toàn bộ tiềm năng cho phân tích và ứng dụng dựa trên AI.

Thực hành tốt nhất

  • Luôn đảm bảo rằng các thư mục đầu vào và đầu ra đã được tạo sẵn để tránh lỗi khi chạy mã.
  • Kiểm tra các tệp Excel có nhiều sheet trước khi bắt đầu chuyển đổi để đảm bảo rằng không có thông tin quan trọng nào bị bỏ sót.

Lưu ý quan trọng

  • Nếu bạn sử dụng tệp Excel lớn, hãy chắc chắn rằng máy tính của bạn đủ sức mạnh để xử lý dữ liệu mà không gặp phải tình trạng thiếu bộ nhớ.

Câu hỏi thường gặp

1. Làm thế nào để cài đặt Docling?

Có thể cài đặt bằng cách sử dụng pip như sau: pip install docling.

2. Tôi có thể sử dụng Docling cho các định dạng tệp nào?

Docling hỗ trợ nhiều định dạng như PDF, DOCX, HTML, PPTX, CSV, và Markdown.

Liên kết tham khảo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào