💡 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.