💡 Ví dụ hoạt động đầy đủ có sẵn trên GitHub:
parse-docx-to-markdown-chunks-dotnet
Cách Cũ Đầy Khó Khăn
Phân đoạn Markdown dựa trên tiêu đề là một quy trình chuẩn bị truy xuất trong .NET, chuyển các tệp Office và PDF thành văn bản có kích thước theo phần trước khi bạn nhúng. Nếu không có quy trình này, các nhóm thường đổ toàn bộ tệp Word vào một vector duy nhất. Đoạn văn mở đầu và điều khoản nhiệm vụ chia sẻ cùng một embedding, vì vậy tìm kiếm cosine xếp hạng phần sai. Tôi đã gặp tình huống này trên một hướng dẫn nội bộ ba trang: mọi truy vấn đều lấy khối tiêu đề đầu tiên vì chỉ mục không bao giờ thấy cấu trúc # / ## mà các tác giả đã viết.
Việc tự viết bộ chuyển đổi DOCX‑to‑Markdown đồng nghĩa với việc phải duyệt qua các kiểu Open XML, ánh xạ các cấp độ danh sách, và vẫn thất bại khi tải lên tiếp theo là một PDF mà đường dẫn Markdown đã định dạng trả về null. Các cửa sổ token cố định bỏ qua những tiêu đề đó. Các tập dữ liệu qua đêm sau đó trộn lẫn các vỏ rỗng với những cuốn cẩm nang khổng lồ vì không ai kiểm tra số trang hoặc kích thước trước.
Chi phí thực sự của việc nhúng toàn tệp: câu trả lời sai phần, lãng phí chi phí trích xuất cho các tệp tải lên rác, và không có các artefact
chunk-01.mdmà người vận hành có thể mở trong một lô xấu.
Có Cách Tốt Hơn
GroupDocs.Parser cho .NET thay thế sự hỗn loạn này bằng bốn lời gọi tập trung: GetDocumentInfo, GetFormattedText(FormattedTextMode.Markdown), GetText khi Markdown trả về null, và một trình duyệt tiêu đề nhỏ ghi chunk‑NN.md. Kiểu Parser duy nhất này bao phủ việc phân tích Word DOCX và dự phòng văn bản PDF, vì vậy bạn chỉ cần một đường dẫn dịch vụ C#.
Bạn sẽ cần:
- .NET 8 SDK
- GroupDocs.Parser 26.10.0 (giấy phép tạm thời)
- Một tệp Word DOCX (ví dụ mẫu có 3 trang / 14820 byte) và tùy chọn một PDF
dotnet add package GroupDocs.Parser --version 26.10.0
Cách Mới: Kiểm Tra, Trích Xuất, Quay Lại, Chia Nhỏ
Đây là quy trình chuẩn bị truy xuất tương tự sau khi chuyển đổi. Mẫu console trong parse-docx-to-markdown-chunks-dotnet ghi thông tin, Markdown, văn bản PDF, và bốn đoạn tiêu đề cho DOCX được cung cấp.
Bước 1 - Kiểm Tra với GetDocumentInfo
Yêu cầu loại tệp, số trang và kích thước trước khi bạn trả tiền cho việc trích xuất toàn bộ.
using var parser = new Parser(sourcePath);
var info = parser.GetDocumentInfo();
var sb = new StringBuilder();
sb.AppendLine($"Source: {Path.GetFileName(sourcePath)}");
sb.AppendLine($"File type: {info?.FileType}");
sb.AppendLine($"Pages: {info?.PageCount}");
sb.AppendLine($"Size: {info?.Size} bytes");
File.WriteAllText(outputPath, sb.ToString());
Ghi lại những thông tin này bên cạnh ID công việc. Với mẫu DOCX bạn sẽ thấy một Microsoft Word Open XML Document, 3 trang, và 14820 byte.
Bước 2 - Ưu Tiên Markdown từ GetFormattedText
Đối với Word và các định dạng hỗ trợ trích xuất có định dạng, giữ lại các tiêu đề ATX cho bộ chia.
using var parser = new Parser(sourcePath);
using TextReader? reader = parser.GetFormattedText(
new FormattedTextOptions(FormattedTextMode.Markdown));
if (reader == null)
{
return null;
}
string markdown = reader.ReadToEnd();
File.WriteAllText(outputPath, markdown, Encoding.UTF8);
return markdown;
Null là tín hiệu để chuyển sang đường dẫn khác, không phải lỗi. Ghi dưới dạng UTF‑8 để các công cụ chunk và diff của git vẫn đọc được.
Bước 3 - Quay Lại với GetText cho PDF
Khi chế độ Markdown trả về null, giữ tệp trong pipeline bằng một lớp văn bản thuần.
using var parser = new Parser(sourcePath);
using TextReader? reader = parser.GetText();
if (reader == null)
{
return null;
}
string text = reader.ReadToEnd();
File.WriteAllText(outputPath, text, Encoding.UTF8);
return text;
Mong đợi .txt, không phải các tiêu đề # tự tạo. Máy chủ mẫu ghi Result/sample-pdf.txt cho nhánh PDF.
Bước 4 - Chia Markdown theo # và
Duyệt các dòng; xả khi gặp một tiêu đề ATX mới # hoặc ##; ghi chunk‑NN.md.
var chunks = new List<string>();
var current = new StringBuilder();
using (var reader = new StringReader(markdown))
{
string? line;
while ((line = reader.ReadLine()) != null)
{
bool isHeading = line.StartsWith("# ", StringComparison.Ordinal)
|| line.StartsWith("## ", StringComparison.Ordinal);
if (isHeading && current.Length > 0)
{
chunks.Add(current.ToString().TrimEnd());
current.Clear();
}
current.AppendLine(line);
}
}
Xóa các tệp chunk-*.md cũ trước. Các dòng ### sâu hơn vẫn nằm trong phần hiện tại. Mẫu DOCX tạo ra bốn tệp trong Result/chunks/.
Khi nào tôi nên thay thế embedding toàn tệp bằng đường dẫn này?
Thay thế embedding toàn tệp khi quy trình nhập khẩu hỗn hợp Word DOCX và PDF và chỉ mục cần Markdown có kích thước theo phần. Đầu tiên chạy GetDocumentInfo, thử Markdown cho các tệp Office, gọi GetText khi trình đọc có định dạng trả về null, và chỉ chia khi tồn tại các dấu hiệu # / ##. Để nguyên văn bản PDF không có cấu trúc cho đến khi bạn thêm một chính sách chunk riêng. Thứ tự này khớp với ứng dụng console mẫu và giữ cho các chế độ lỗi rõ ràng đối với người vận hành.
Những Thay Đổi cho Người Vận Hành
| Trước | Sau |
|---|---|
| Một embedding cho mỗi tệp | Một embedding cho mỗi khối tiêu đề |
| Markdown Open XML tùy chỉnh | Chế độ Markdown của GetFormattedText |
| PDF bị bỏ qua khi trình đọc có định dạng trả về null | GetText ghi một artefact văn bản |
| Không có kiểm tra sơ bộ giá rẻ | Kiểm tra số trang và kích thước hoạt động |
Giải phóng mọi Parser và TextReader. Áp dụng giấy phép hoặc giấy phép tạm thời trước khi xử lý khối lượng lớn qua đêm. Xem các tệp tải lên như đầu vào không tin cậy và phân tích trong một worker cách ly.
Thử Nó trên Các Tệp Của Bạn
Sao chép parse-docx-to-markdown-chunks-dotnet, khôi phục GroupDocs.Parser 26.10.0, và chạy đối với documents/sample.docx. Sau đó chỉ ra bốn phương pháp này cho một trong các cẩm nang của bạn và mở các tệp chunk-*.md đã tạo.