💡 Kompletní funkční příklad dostupný na GitHubu: parse-docx-to-markdown-chunks-dotnet
Starý způsob byl bolestivý
Chunkování založené na nadpisech v Markdownu je .NET cesta pro přípravu vyhledávání, která převádí soubory Office a PDF na text o velikosti sekce před tím, než je vložíte. Bez ní týmy často nahrávají celý soubor Word do jediného vektoru. Úvodní odstavec a klauzule o povinnostech sdílejí jedno vložení, takže kosinové vyhledávání řadí špatnou sekci. Setkal jsem se s tím u třístránkového interního průvodce: každé dotazování nejprve vytáhlo blok názvu, protože index nikdy neviděl strukturu # / ##, kterou autoři již napsali.
Vlastní implementace převodníku DOCX na Markdown znamená procházet styly Open XML, mapovat úrovně seznamů a stále selhávat, když je další nahrání PDF, jehož formátovaná cesta Markdown vrací null. Okna tokenů pevné velikosti ignorují ty nadpisy. Noční korpusy pak míchají prázdné skořápky s obrovskými manuály, protože nikdo nejprve neomezil počet stránek nebo velikost.
Skutečná cena vložení celého souboru: odpovědi ze špatných sekcí, zbytečné výdaje na extrakci špatných nahrávek a žádné artefakty
chunk-01.md, které by operátoři mohli otevřít během špatné dávky.
Existuje lepší způsob
GroupDocs.Parser pro .NET nahrazuje ten zmatek čtyřmi zaměřenými voláními: GetDocumentInfo, GetFormattedText(FormattedTextMode.Markdown), GetText když je Markdown null, a malý procházeč nadpisů, který zapisuje chunk-NN.md. Stejný typ Parser pokrývá parsování Word DOCX a záložní text PDF, takže máte jeden C# servisní cestu.
Budete potřebovat:
- .NET 8 SDK
- GroupDocs.Parser 26.10.0 (dočasná licence)
- Word DOCX (ukázka má 3 stránky / 14820 bajtů) a volitelně PDF
dotnet add package GroupDocs.Parser --version 26.10.0
Nový způsob: Inspekce, extrakce, záloha, rozdělení
Zde je stejná příprava vyhledávání po přepnutí. Ukázkový konzolový program pod parse-docx-to-markdown-chunks-dotnet zapisuje informace, Markdown, text PDF a čtyři bloky nadpisů pro dodaný DOCX.
Krok 1 – Ověření pomocí GetDocumentInfo
Požádejte o typ souboru, počet stránek a velikost, než zaplatíte za úplnou extrakci.
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());
Zaznamenejte tato fakta vedle ID úlohy. U ukázkového DOCX byste měli vidět Microsoft Word Open XML Document, 3 stránky a 14820 bajtů.
Krok 2 – Upřednostnit Markdown z GetFormattedText
Pro Word a formáty, které podporují formátovanou extrakci, zachovejte ATX nadpisy pro rozdělování.
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 je signál k přepnutí cesty, ne k havárii. Zapisujte v UTF-8, aby nástroje pro chunkování a git diffy zůstaly čitelné.
Krok 3 – Záloha pomocí GetText pro PDF
Když režim Markdown vrátí null, udržte soubor v pipeline s vrstvou prostého textu.
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;
Očekávejte .txt, ne vymyšlené # nadpisy. Ukázkový host zapisuje Result/sample-pdf.txt pro větev PDF.
Krok 4 – Rozdělit Markdown na # a
Procházejte řádky; vyprázdněte, když se objeví nový ATX # nebo ##; zapisujte 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);
}
}
Nejprve odstraňte zastaralé soubory chunk-*.md. Hlubší řádky ### zůstávají uvnitř aktuální sekce. Ukázkový DOCX vytvoří čtyři soubory v Result/chunks/.
Kdy bych měl nahradit vložení celého souboru touto cestou?
Nahraďte vložení celého souboru, když vstup kombinuje Word DOCX a PDF a index potřebuje Markdown o velikosti sekce. Nejprve spusťte GetDocumentInfo, zkuste Markdown pro Office soubory, zavolejte GetText, když je formátovaný čtečka null, a rozdělujte pouze když existují značky # / ##. Nechte nestrukturovaný PDF text nedotčený, dokud nepřidáte samostatnou politiku chunkování. Toto pořadí odpovídá ukázkové konzolové aplikaci a udržuje režimy selhání explicitní pro operátory.
Co se změnilo pro operátory
| Před | Po |
|---|---|
| Jedno vložení na soubor | Jedno vložení na blok nadpisu |
| Vlastní Open XML Markdown | GetFormattedText režim Markdown |
| PDF zahozena při null formátovaném čtečce | GetText zapisuje textový artefakt |
| Žádná levná předkontrola | Počítání stránek a velikostní brána fungují |
Uvolněte každý Parser a TextReader. Použijte licenci nebo dočasnou licenci před nočním objemem. Považujte nahrané soubory za nedůvěryhodný vstup a parsujte je v izolovaném pracovníkovi.
Vyzkoušejte to na svých vlastních souborech
Naklonujte parse-docx-to-markdown-chunks-dotnet, obnovte GroupDocs.Parser 26.10.0 a spusťte proti documents/sample.docx. Pak nasměrujte stejné čtyři metody na jeden z vašich manuálů a otevřete vygenerované soubory chunk-*.md.