💡 Contoh lengkap yang berfungsi tersedia di GitHub: parse-docx-to-markdown-chunks-dotnet
Cara Lama Sangat Menyakitkan
Pengelompokan Markdown berbasis heading adalah jalur persiapan pengambilan .NET yang mengubah file Office dan PDF menjadi teks berukuran bagian sebelum Anda melakukan embedding. Tanpa itu, tim sering menumpahkan seluruh file Word ke dalam satu vektor. Paragraf sampul dan klausul tugas berbagi satu embedding, sehingga pencarian kosinus memberi peringkat pada bagian yang salah. Saya mengalami hal itu pada panduan internal tiga halaman: setiap kueri menarik blok judul terlebih dahulu karena indeks tidak pernah melihat struktur # / ## yang sudah ditulis penulis.
Membuat konverter DOCX-ke-Markdown secara manual berarti harus menelusuri gaya Open XML, memetakan tingkat daftar, dan masih gagal ketika unggahan berikutnya adalah PDF yang jalur Markdown terformatnya mengembalikan null. Jendela token berukuran tetap mengabaikan heading tersebut. Korpus semalam kemudian mencampur kerangka kosong dengan manual besar karena tidak ada yang memeriksa jumlah halaman atau ukuran terlebih dahulu.
Biaya nyata dari embedding seluruh file: jawaban pada bagian yang salah, pengeluaran ekstrak yang terbuang pada unggahan sampah, dan tidak ada artefak
chunk-01.mdyang dapat dibuka operator selama batch yang buruk.
Ada Cara yang Lebih Baik
GroupDocs.Parser untuk .NET menggantikan kekacauan itu dengan empat panggilan terfokus: GetDocumentInfo, GetFormattedText(FormattedTextMode.Markdown), GetText ketika Markdown bernilai null, dan walker heading kecil yang menulis chunk-NN.md. Tipe Parser yang sama mencakup parsing Word DOCX dan fallback teks PDF, sehingga Anda memiliki satu jalur layanan C#.
Anda akan membutuhkan:
- .NET 8 SDK
- GroupDocs.Parser 26.10.0 (lisensi sementara)
- Sebuah Word DOCX (contoh berukuran 3 halaman / 14820 byte) dan opsional PDF
dotnet add package GroupDocs.Parser --version 26.10.0
Cara Baru: Inspeksi, Ekstrak, Cadangan, Bagi
Berikut adalah persiapan pengambilan yang sama setelah beralih. Contoh konsol di bawah parse-docx-to-markdown-chunks-dotnet menulis info, Markdown, teks PDF, dan empat chunk heading untuk DOCX yang disertakan.
Langkah 1 - Gerbang dengan GetDocumentInfo
Minta tipe file, jumlah halaman, dan ukuran sebelum Anda membayar untuk ekstrak penuh.
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());
Catat fakta-fakta itu di samping ID pekerjaan. Pada contoh DOCX Anda harus melihat Microsoft Word Open XML Document, 3 halaman, dan 14820 byte.
Langkah 2 - Pilih Markdown dari GetFormattedText
Untuk Word dan format yang mendukung ekstraksi terformat, pertahankan heading ATX untuk pemisah.
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 adalah sinyal untuk beralih jalur, bukan crash. Tulis dalam UTF-8 agar alat chunk dan diff git tetap dapat dibaca.
Langkah 3 - Cadangkan dengan GetText untuk PDF
Ketika mode Markdown mengembalikan null, pertahankan file dalam pipeline dengan lapisan teks biasa.
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;
Harapkan .txt, bukan heading # yang dibuat-buat. Host contoh menulis Result/sample-pdf.txt untuk cabang PDF.
Langkah 4 - Bagi Markdown pada # dan
Jalankan baris; bersihkan ketika muncul ATX # atau ## baru; tulis 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);
}
}
Hapus dulu file chunk-*.md yang usang. Baris ### yang lebih dalam tetap berada di dalam bagian saat ini. Contoh DOCX menghasilkan empat file di bawah Result/chunks/.
Kapan Saya Harus Mengganti Embedding Seluruh File dengan Jalur Ini?
Ganti embedding seluruh file ketika masukannya mencampur Word DOCX dan PDF serta indeks membutuhkan Markdown berukuran bagian. Jalankan GetDocumentInfo terlebih dahulu, coba Markdown untuk file Office, panggil GetText ketika pembaca terformat bernilai null, dan bagi hanya ketika penanda # / ## ada. Biarkan teks PDF yang tidak terstruktur saja sampai Anda menambahkan kebijakan chunk terpisah. Urutan itu cocok dengan contoh aplikasi konsol dan menjaga mode kegagalan tetap eksplisit bagi operator.
Apa yang Berubah untuk Operator
| Sebelum | Sesudah |
|---|---|
| Satu embedding per file | Satu embedding per blok heading |
| Markdown Open XML Kustom | GetFormattedText Markdown mode |
| PDF dibuang pada pembaca terformat null | GetText menulis artefak teks |
| Tidak ada pemeriksaan awal murah | Pemeriksaan jumlah halaman dan ukuran berfungsi |
Dispose setiap Parser dan TextReader. Terapkan lisensi atau lisensi sementara sebelum volume semalam. Anggap unggahan sebagai input yang tidak dipercaya dan parse dalam worker terisolasi.
Coba pada File Anda Sendiri
Klon parse-docx-to-markdown-chunks-dotnet, pulihkan GroupDocs.Parser 26.10.0, dan jalankan terhadap documents/sample.docx. Kemudian arahkan keempat metode yang sama ke salah satu manual Anda dan buka file chunk-*.md yang dihasilkan.