@markitdownjs/chunking 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/chunker.test.d.ts +2 -0
- package/dist/__tests__/chunker.test.d.ts.map +1 -0
- package/dist/__tests__/chunker.test.js +46 -0
- package/dist/__tests__/chunker.test.js.map +1 -0
- package/dist/chunker.d.ts +24 -0
- package/dist/chunker.d.ts.map +1 -0
- package/dist/chunker.js +58 -0
- package/dist/chunker.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/strategies/fixed-strategy.d.ts +8 -0
- package/dist/strategies/fixed-strategy.d.ts.map +1 -0
- package/dist/strategies/fixed-strategy.js +55 -0
- package/dist/strategies/fixed-strategy.js.map +1 -0
- package/dist/strategies/heading-strategy.d.ts +8 -0
- package/dist/strategies/heading-strategy.d.ts.map +1 -0
- package/dist/strategies/heading-strategy.js +117 -0
- package/dist/strategies/heading-strategy.js.map +1 -0
- package/dist/strategies/page-strategy.d.ts +8 -0
- package/dist/strategies/page-strategy.d.ts.map +1 -0
- package/dist/strategies/page-strategy.js +88 -0
- package/dist/strategies/page-strategy.js.map +1 -0
- package/dist/strategies/semantic-strategy.d.ts +8 -0
- package/dist/strategies/semantic-strategy.d.ts.map +1 -0
- package/dist/strategies/semantic-strategy.js +132 -0
- package/dist/strategies/semantic-strategy.js.map +1 -0
- package/package.json +31 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunker.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/chunker.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { DocumentChunker } from '../chunker.js';
|
|
3
|
+
import { createNode } from '@markitdownjs/shared';
|
|
4
|
+
describe('DocumentChunker', () => {
|
|
5
|
+
const chunker = new DocumentChunker();
|
|
6
|
+
const ast = createNode({
|
|
7
|
+
type: 'document',
|
|
8
|
+
children: [
|
|
9
|
+
createNode({
|
|
10
|
+
type: 'heading',
|
|
11
|
+
level: 1,
|
|
12
|
+
children: [createNode({ type: 'text', value: 'Introduction' })],
|
|
13
|
+
}),
|
|
14
|
+
createNode({
|
|
15
|
+
type: 'paragraph',
|
|
16
|
+
children: [createNode({ type: 'text', value: 'This is the introduction paragraph.' })],
|
|
17
|
+
}),
|
|
18
|
+
createNode({
|
|
19
|
+
type: 'heading',
|
|
20
|
+
level: 1,
|
|
21
|
+
children: [createNode({ type: 'text', value: 'Main Content' })],
|
|
22
|
+
}),
|
|
23
|
+
createNode({
|
|
24
|
+
type: 'paragraph',
|
|
25
|
+
children: [createNode({ type: 'text', value: 'This is the main content.' })],
|
|
26
|
+
}),
|
|
27
|
+
],
|
|
28
|
+
});
|
|
29
|
+
it('should chunk by heading', () => {
|
|
30
|
+
const chunks = chunker.chunk(ast, { strategy: 'heading' });
|
|
31
|
+
expect(chunks.length).toBeGreaterThanOrEqual(2);
|
|
32
|
+
expect(chunks[0].metadata.headingPath).toContain('Introduction');
|
|
33
|
+
});
|
|
34
|
+
it('should chunk by fixed size', () => {
|
|
35
|
+
const chunks = chunker.chunk(ast, { strategy: 'fixed', maxTokens: 5, overlap: 2 });
|
|
36
|
+
expect(chunks.length).toBeGreaterThanOrEqual(1);
|
|
37
|
+
});
|
|
38
|
+
it('should generate chunk IDs', () => {
|
|
39
|
+
const chunks = chunker.chunk(ast, { strategy: 'heading' });
|
|
40
|
+
for (const chunk of chunks) {
|
|
41
|
+
expect(chunk.id).toBeDefined();
|
|
42
|
+
expect(chunk.id.length).toBeGreaterThan(0);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=chunker.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunker.test.js","sourceRoot":"","sources":["../../src/__tests__/chunker.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGlD,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,MAAM,OAAO,GAAG,IAAI,eAAe,EAAE,CAAC;IAEtC,MAAM,GAAG,GAAG,UAAU,CAAe;QACnC,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,UAAU,CAAc;gBACtB,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,CAAC;gBACR,QAAQ,EAAE,CAAC,UAAU,CAAW,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;aAC1E,CAAC;YACF,UAAU,CAAgB;gBACxB,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,CAAC,UAAU,CAAW,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,qCAAqC,EAAE,CAAC,CAAC;aACjG,CAAC;YACF,UAAU,CAAc;gBACtB,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,CAAC;gBACR,QAAQ,EAAE,CAAC,UAAU,CAAW,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;aAC1E,CAAC;YACF,UAAU,CAAgB;gBACxB,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,CAAC,UAAU,CAAW,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC,CAAC;aACvF,CAAC;SACH;KACF,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QACnF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;QAC3D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;YAC/B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AnyNode, DocumentChunk, ChunkingOptions } from "@markitdownjs/shared";
|
|
2
|
+
/** Interface for chunking strategy implementations */
|
|
3
|
+
export interface ChunkingStrategy {
|
|
4
|
+
/** Strategy name identifier */
|
|
5
|
+
name: string;
|
|
6
|
+
/** Split an AST into document chunks */
|
|
7
|
+
chunk(ast: AnyNode, options: ChunkingOptions): DocumentChunk[];
|
|
8
|
+
}
|
|
9
|
+
/** Creates a document chunk from collected nodes and metadata */
|
|
10
|
+
export declare function createChunk(nodes: AnyNode[], headingPath: string[], options: ChunkingOptions, startIndex: number, endIndex: number, page?: number): DocumentChunk | null;
|
|
11
|
+
/** Main document chunker that delegates to registered strategies */
|
|
12
|
+
export declare class DocumentChunker {
|
|
13
|
+
private strategies;
|
|
14
|
+
constructor();
|
|
15
|
+
/** Register a custom chunking strategy */
|
|
16
|
+
registerStrategy(strategy: ChunkingStrategy): void;
|
|
17
|
+
/** Get a registered strategy by name */
|
|
18
|
+
getStrategy(name: string): ChunkingStrategy | undefined;
|
|
19
|
+
/** List all registered strategy names */
|
|
20
|
+
listStrategies(): string[];
|
|
21
|
+
/** Chunk an AST using the specified strategy */
|
|
22
|
+
chunk(ast: AnyNode, options: ChunkingOptions): DocumentChunk[];
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=chunker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunker.d.ts","sourceRoot":"","sources":["../src/chunker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,aAAa,EAEb,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAO9B,sDAAsD;AACtD,MAAM,WAAW,gBAAgB;IAC/B,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,GAAG,aAAa,EAAE,CAAC;CAChE;AAED,iEAAiE;AACjE,wBAAgB,WAAW,CACzB,KAAK,EAAE,OAAO,EAAE,EAChB,WAAW,EAAE,MAAM,EAAE,EACrB,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,MAAM,GACZ,aAAa,GAAG,IAAI,CAsBtB;AAED,oEAAoE;AACpE,qBAAa,eAAe;IAC1B,OAAO,CAAC,UAAU,CAAgC;;IAUlD,0CAA0C;IAC1C,gBAAgB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAIlD,wCAAwC;IACxC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAIvD,yCAAyC;IACzC,cAAc,IAAI,MAAM,EAAE;IAI1B,gDAAgD;IAChD,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,GAAG,aAAa,EAAE;CAQ/D"}
|
package/dist/chunker.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { getNodeText, generateId } from "@markitdownjs/shared";
|
|
2
|
+
import { HeadingChunkingStrategy } from "./strategies/heading-strategy.js";
|
|
3
|
+
import { PageChunkingStrategy } from "./strategies/page-strategy.js";
|
|
4
|
+
import { SemanticChunkingStrategy } from "./strategies/semantic-strategy.js";
|
|
5
|
+
import { FixedChunkingStrategy } from "./strategies/fixed-strategy.js";
|
|
6
|
+
/** Creates a document chunk from collected nodes and metadata */
|
|
7
|
+
export function createChunk(nodes, headingPath, options, startIndex, endIndex, page) {
|
|
8
|
+
if (nodes.length === 0)
|
|
9
|
+
return null;
|
|
10
|
+
const content = nodes.map((n) => getNodeText(n)).join("\n\n");
|
|
11
|
+
const tokenCount = content.split(/\s+/).filter(Boolean).length;
|
|
12
|
+
const root = nodes.length === 1
|
|
13
|
+
? nodes[0]
|
|
14
|
+
: { type: "document", children: nodes };
|
|
15
|
+
const metadata = {
|
|
16
|
+
chunkId: generateId(),
|
|
17
|
+
headingPath,
|
|
18
|
+
tokenCount,
|
|
19
|
+
sourceFile: options.sourceFile,
|
|
20
|
+
startIndex,
|
|
21
|
+
endIndex,
|
|
22
|
+
page,
|
|
23
|
+
};
|
|
24
|
+
return { id: metadata.chunkId, content, metadata, ast: root };
|
|
25
|
+
}
|
|
26
|
+
/** Main document chunker that delegates to registered strategies */
|
|
27
|
+
export class DocumentChunker {
|
|
28
|
+
strategies;
|
|
29
|
+
constructor() {
|
|
30
|
+
this.strategies = new Map();
|
|
31
|
+
this.registerStrategy(new HeadingChunkingStrategy());
|
|
32
|
+
this.registerStrategy(new PageChunkingStrategy());
|
|
33
|
+
this.registerStrategy(new SemanticChunkingStrategy());
|
|
34
|
+
this.registerStrategy(new FixedChunkingStrategy());
|
|
35
|
+
}
|
|
36
|
+
/** Register a custom chunking strategy */
|
|
37
|
+
registerStrategy(strategy) {
|
|
38
|
+
this.strategies.set(strategy.name, strategy);
|
|
39
|
+
}
|
|
40
|
+
/** Get a registered strategy by name */
|
|
41
|
+
getStrategy(name) {
|
|
42
|
+
return this.strategies.get(name);
|
|
43
|
+
}
|
|
44
|
+
/** List all registered strategy names */
|
|
45
|
+
listStrategies() {
|
|
46
|
+
return Array.from(this.strategies.keys());
|
|
47
|
+
}
|
|
48
|
+
/** Chunk an AST using the specified strategy */
|
|
49
|
+
chunk(ast, options) {
|
|
50
|
+
const strategyName = options.strategy ?? "heading";
|
|
51
|
+
const strategy = this.strategies.get(strategyName);
|
|
52
|
+
if (!strategy) {
|
|
53
|
+
throw new Error(`Unknown chunking strategy: ${strategyName}`);
|
|
54
|
+
}
|
|
55
|
+
return strategy.chunk(ast, options);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=chunker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunker.js","sourceRoot":"","sources":["../src/chunker.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAUvE,iEAAiE;AACjE,MAAM,UAAU,WAAW,CACzB,KAAgB,EAChB,WAAqB,EACrB,OAAwB,EACxB,UAAkB,EAClB,QAAgB,EAChB,IAAa;IAEb,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAE/D,MAAM,IAAI,GACR,KAAK,CAAC,MAAM,KAAK,CAAC;QAChB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE;QACX,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAE5C,MAAM,QAAQ,GAAkB;QAC9B,OAAO,EAAE,UAAU,EAAE;QACrB,WAAW;QACX,UAAU;QACV,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,UAAU;QACV,QAAQ;QACR,IAAI;KACL,CAAC;IAEF,OAAO,EAAE,EAAE,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AAChE,CAAC;AAED,oEAAoE;AACpE,MAAM,OAAO,eAAe;IAClB,UAAU,CAAgC;IAElD;QACE,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,gBAAgB,CAAC,IAAI,uBAAuB,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,gBAAgB,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,gBAAgB,CAAC,IAAI,wBAAwB,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,gBAAgB,CAAC,IAAI,qBAAqB,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,0CAA0C;IAC1C,gBAAgB,CAAC,QAA0B;QACzC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,wCAAwC;IACxC,WAAW,CAAC,IAAY;QACtB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,yCAAyC;IACzC,cAAc;QACZ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,gDAAgD;IAChD,KAAK,CAAC,GAAY,EAAE,OAAwB;QAC1C,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,IAAI,SAAS,CAAC;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACnD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,8BAA8B,YAAY,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;CACF"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { DocumentChunker, createChunk } from "./chunker.js";
|
|
2
|
+
export type { ChunkingStrategy } from "./chunker.js";
|
|
3
|
+
export { HeadingChunkingStrategy } from "./strategies/heading-strategy.js";
|
|
4
|
+
export { PageChunkingStrategy } from "./strategies/page-strategy.js";
|
|
5
|
+
export { SemanticChunkingStrategy } from "./strategies/semantic-strategy.js";
|
|
6
|
+
export { FixedChunkingStrategy } from "./strategies/fixed-strategy.js";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC5D,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { DocumentChunker, createChunk } from "./chunker.js";
|
|
2
|
+
export { HeadingChunkingStrategy } from "./strategies/heading-strategy.js";
|
|
3
|
+
export { PageChunkingStrategy } from "./strategies/page-strategy.js";
|
|
4
|
+
export { SemanticChunkingStrategy } from "./strategies/semantic-strategy.js";
|
|
5
|
+
export { FixedChunkingStrategy } from "./strategies/fixed-strategy.js";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AnyNode, DocumentChunk, ChunkingOptions } from "@markitdownjs/shared";
|
|
2
|
+
import type { ChunkingStrategy } from "../chunker.js";
|
|
3
|
+
/** Splits a document into fixed-size chunks with overlap */
|
|
4
|
+
export declare class FixedChunkingStrategy implements ChunkingStrategy {
|
|
5
|
+
name: string;
|
|
6
|
+
chunk(ast: AnyNode, options: ChunkingOptions): DocumentChunk[];
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=fixed-strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixed-strategy.d.ts","sourceRoot":"","sources":["../../src/strategies/fixed-strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,aAAa,EACb,eAAe,EAGhB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAKtD,4DAA4D;AAC5D,qBAAa,qBAAsB,YAAW,gBAAgB;IAC5D,IAAI,SAAW;IAEf,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,GAAG,aAAa,EAAE;CA+C/D"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { getNodeText } from "@markitdownjs/shared";
|
|
2
|
+
const DEFAULT_MAX_TOKENS = 512;
|
|
3
|
+
const DEFAULT_OVERLAP = 50;
|
|
4
|
+
/** Splits a document into fixed-size chunks with overlap */
|
|
5
|
+
export class FixedChunkingStrategy {
|
|
6
|
+
name = "fixed";
|
|
7
|
+
chunk(ast, options) {
|
|
8
|
+
const maxTokens = options.maxTokens ?? DEFAULT_MAX_TOKENS;
|
|
9
|
+
const overlap = options.overlap ?? DEFAULT_OVERLAP;
|
|
10
|
+
const text = getNodeText(ast);
|
|
11
|
+
const words = text.split(/\s+/).filter(Boolean);
|
|
12
|
+
if (words.length === 0)
|
|
13
|
+
return [];
|
|
14
|
+
const chunks = [];
|
|
15
|
+
let startIdx = 0;
|
|
16
|
+
let globalOffset = 0;
|
|
17
|
+
while (startIdx < words.length) {
|
|
18
|
+
const endIdx = Math.min(startIdx + maxTokens, words.length);
|
|
19
|
+
const chunkWords = words.slice(startIdx, endIdx);
|
|
20
|
+
const content = chunkWords.join(" ");
|
|
21
|
+
const tokenCount = chunkWords.length;
|
|
22
|
+
const astNode = buildChunkAst(content);
|
|
23
|
+
const chunk = {
|
|
24
|
+
id: crypto.randomUUID(),
|
|
25
|
+
content,
|
|
26
|
+
metadata: {
|
|
27
|
+
chunkId: crypto.randomUUID(),
|
|
28
|
+
headingPath: [],
|
|
29
|
+
tokenCount,
|
|
30
|
+
sourceFile: options.sourceFile,
|
|
31
|
+
startIndex: globalOffset,
|
|
32
|
+
endIndex: globalOffset + tokenCount,
|
|
33
|
+
},
|
|
34
|
+
ast: astNode,
|
|
35
|
+
};
|
|
36
|
+
chunks.push(chunk);
|
|
37
|
+
globalOffset += tokenCount;
|
|
38
|
+
startIdx = endIdx - overlap;
|
|
39
|
+
if (startIdx >= endIdx)
|
|
40
|
+
break;
|
|
41
|
+
if (startIdx >= words.length)
|
|
42
|
+
break;
|
|
43
|
+
if (endIdx >= words.length)
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
return chunks;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function buildChunkAst(text) {
|
|
50
|
+
return {
|
|
51
|
+
type: "paragraph",
|
|
52
|
+
children: [{ type: "text", value: text }],
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=fixed-strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixed-strategy.js","sourceRoot":"","sources":["../../src/strategies/fixed-strategy.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGnD,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B,4DAA4D;AAC5D,MAAM,OAAO,qBAAqB;IAChC,IAAI,GAAG,OAAO,CAAC;IAEf,KAAK,CAAC,GAAY,EAAE,OAAwB;QAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAC;QAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC;QAEnD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEhD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAElC,MAAM,MAAM,GAAoB,EAAE,CAAC;QACnC,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,OAAO,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAC5D,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrC,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC;YAErC,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;YAEvC,MAAM,KAAK,GAAkB;gBAC3B,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;gBACvB,OAAO;gBACP,QAAQ,EAAE;oBACR,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE;oBAC5B,WAAW,EAAE,EAAE;oBACf,UAAU;oBACV,UAAU,EAAE,OAAO,CAAC,UAAU;oBAC9B,UAAU,EAAE,YAAY;oBACxB,QAAQ,EAAE,YAAY,GAAG,UAAU;iBACpC;gBACD,GAAG,EAAE,OAAO;aACb,CAAC;YAEF,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEnB,YAAY,IAAI,UAAU,CAAC;YAC3B,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;YAE5B,IAAI,QAAQ,IAAI,MAAM;gBAAE,MAAM;YAC9B,IAAI,QAAQ,IAAI,KAAK,CAAC,MAAM;gBAAE,MAAM;YACpC,IAAI,MAAM,IAAI,KAAK,CAAC,MAAM;gBAAE,MAAM;QACpC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAc,CAAC;KACrC,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AnyNode, DocumentChunk, ChunkingOptions } from "@markitdownjs/shared";
|
|
2
|
+
import type { ChunkingStrategy } from "../chunker.js";
|
|
3
|
+
/** Splits a document by heading boundaries */
|
|
4
|
+
export declare class HeadingChunkingStrategy implements ChunkingStrategy {
|
|
5
|
+
name: string;
|
|
6
|
+
chunk(ast: AnyNode, options: ChunkingOptions): DocumentChunk[];
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=heading-strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heading-strategy.d.ts","sourceRoot":"","sources":["../../src/strategies/heading-strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,aAAa,EACb,eAAe,EAEhB,MAAM,sBAAsB,CAAC;AAM9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAKtD,8CAA8C;AAC9C,qBAAa,uBAAwB,YAAW,gBAAgB;IAC9D,IAAI,SAAa;IAEjB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,GAAG,aAAa,EAAE;CA+D/D"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { getNodeText, isNodeOfType, countTokens, } from "@markitdownjs/shared";
|
|
2
|
+
import { createChunk } from "../chunker.js";
|
|
3
|
+
const DEFAULT_MAX_TOKENS = 512;
|
|
4
|
+
/** Splits a document by heading boundaries */
|
|
5
|
+
export class HeadingChunkingStrategy {
|
|
6
|
+
name = "heading";
|
|
7
|
+
chunk(ast, options) {
|
|
8
|
+
const maxTokens = options.maxTokens ?? DEFAULT_MAX_TOKENS;
|
|
9
|
+
const headingPath = [];
|
|
10
|
+
const chunks = [];
|
|
11
|
+
let currentNodes = [];
|
|
12
|
+
let startIndex = 0;
|
|
13
|
+
let globalOffset = 0;
|
|
14
|
+
const flushChunk = () => {
|
|
15
|
+
if (currentNodes.length === 0)
|
|
16
|
+
return;
|
|
17
|
+
const chunk = createChunk([...currentNodes], [...headingPath], options, startIndex, globalOffset);
|
|
18
|
+
if (chunk) {
|
|
19
|
+
if (countTokens(chunk.ast) > maxTokens) {
|
|
20
|
+
const split = splitLargeChunk(currentNodes, headingPath, options, maxTokens, startIndex);
|
|
21
|
+
chunks.push(...split);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
chunks.push(chunk);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
currentNodes = [];
|
|
28
|
+
startIndex = globalOffset;
|
|
29
|
+
};
|
|
30
|
+
walk(ast, null);
|
|
31
|
+
flushChunk();
|
|
32
|
+
return chunks;
|
|
33
|
+
function walk(node, parent) {
|
|
34
|
+
if (isNodeOfType(node, "heading")) {
|
|
35
|
+
flushChunk();
|
|
36
|
+
headingPath.length = node.level - 1;
|
|
37
|
+
headingPath[node.level - 1] = getNodeText(node);
|
|
38
|
+
}
|
|
39
|
+
if ("children" in node && Array.isArray(node.children)) {
|
|
40
|
+
for (const child of node.children) {
|
|
41
|
+
walk(child, node);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const nodeTokens = countTokens(node);
|
|
45
|
+
if (node.type !== "heading" &&
|
|
46
|
+
node.type !== "document" &&
|
|
47
|
+
!(parent && isNodeOfType(parent, "heading"))) {
|
|
48
|
+
currentNodes.push(node);
|
|
49
|
+
globalOffset += nodeTokens;
|
|
50
|
+
}
|
|
51
|
+
if (nodeTokens > 0 && countTokensArray(currentNodes) >= maxTokens) {
|
|
52
|
+
flushChunk();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function countTokensArray(nodes) {
|
|
58
|
+
return nodes.reduce((sum, n) => sum + countTokens(n), 0);
|
|
59
|
+
}
|
|
60
|
+
function splitLargeChunk(nodes, headingPath, options, maxTokens, startIndex) {
|
|
61
|
+
const chunks = [];
|
|
62
|
+
let buffer = [];
|
|
63
|
+
let offset = startIndex;
|
|
64
|
+
for (const node of nodes) {
|
|
65
|
+
const nodeTokens = countTokens(node);
|
|
66
|
+
const bufferTokens = countTokensArray(buffer);
|
|
67
|
+
if (bufferTokens + nodeTokens > maxTokens && buffer.length > 0) {
|
|
68
|
+
const chunk = createChunk(buffer, headingPath, options, offset, offset + bufferTokens);
|
|
69
|
+
if (chunk)
|
|
70
|
+
chunks.push(chunk);
|
|
71
|
+
offset += bufferTokens;
|
|
72
|
+
buffer = [];
|
|
73
|
+
}
|
|
74
|
+
if (nodeTokens > maxTokens && node.type === "paragraph" && "children" in node) {
|
|
75
|
+
const subChunks = splitParagraph(node, headingPath, options, maxTokens, offset);
|
|
76
|
+
chunks.push(...subChunks);
|
|
77
|
+
offset += nodeTokens;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
buffer.push(node);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (buffer.length > 0) {
|
|
84
|
+
const bufferTokens = countTokensArray(buffer);
|
|
85
|
+
const chunk = createChunk(buffer, headingPath, options, offset, offset + bufferTokens);
|
|
86
|
+
if (chunk)
|
|
87
|
+
chunks.push(chunk);
|
|
88
|
+
}
|
|
89
|
+
return chunks;
|
|
90
|
+
}
|
|
91
|
+
function splitParagraph(node, headingPath, options, maxTokens, startIndex) {
|
|
92
|
+
const text = getNodeText(node);
|
|
93
|
+
const words = text.split(/\s+/).filter(Boolean);
|
|
94
|
+
const chunks = [];
|
|
95
|
+
let offset = startIndex;
|
|
96
|
+
for (let i = 0; i < words.length; i += maxTokens) {
|
|
97
|
+
const slice = words.slice(i, i + maxTokens);
|
|
98
|
+
const value = slice.join(" ");
|
|
99
|
+
const tokenCount = slice.length;
|
|
100
|
+
chunks.push({
|
|
101
|
+
id: crypto.randomUUID(),
|
|
102
|
+
content: value,
|
|
103
|
+
metadata: {
|
|
104
|
+
chunkId: crypto.randomUUID(),
|
|
105
|
+
headingPath: [...headingPath],
|
|
106
|
+
tokenCount,
|
|
107
|
+
sourceFile: options.sourceFile,
|
|
108
|
+
startIndex: offset,
|
|
109
|
+
endIndex: offset + tokenCount,
|
|
110
|
+
},
|
|
111
|
+
ast: { type: "paragraph", children: [{ type: "text", value }] },
|
|
112
|
+
});
|
|
113
|
+
offset += tokenCount;
|
|
114
|
+
}
|
|
115
|
+
return chunks;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=heading-strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heading-strategy.js","sourceRoot":"","sources":["../../src/strategies/heading-strategy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AnyNode, DocumentChunk, ChunkingOptions } from "@markitdownjs/shared";
|
|
2
|
+
import type { ChunkingStrategy } from "../chunker.js";
|
|
3
|
+
/** Splits a document by page break boundaries */
|
|
4
|
+
export declare class PageChunkingStrategy implements ChunkingStrategy {
|
|
5
|
+
name: string;
|
|
6
|
+
chunk(ast: AnyNode, options: ChunkingOptions): DocumentChunk[];
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=page-strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-strategy.d.ts","sourceRoot":"","sources":["../../src/strategies/page-strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,aAAa,EACb,eAAe,EAEhB,MAAM,sBAAsB,CAAC;AAM9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAKtD,iDAAiD;AACjD,qBAAa,oBAAqB,YAAW,gBAAgB;IAC3D,IAAI,SAAU;IAEd,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,GAAG,aAAa,EAAE;CAsE/D"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { walkAst, isNodeOfType, countTokens, } from "@markitdownjs/shared";
|
|
2
|
+
import { createChunk } from "../chunker.js";
|
|
3
|
+
const DEFAULT_MAX_TOKENS = 512;
|
|
4
|
+
/** Splits a document by page break boundaries */
|
|
5
|
+
export class PageChunkingStrategy {
|
|
6
|
+
name = "page";
|
|
7
|
+
chunk(ast, options) {
|
|
8
|
+
const maxTokens = options.maxTokens ?? DEFAULT_MAX_TOKENS;
|
|
9
|
+
const chunks = [];
|
|
10
|
+
let currentNodes = [];
|
|
11
|
+
let currentPage;
|
|
12
|
+
let startIndex = 0;
|
|
13
|
+
let globalOffset = 0;
|
|
14
|
+
let hasPageBreaks = false;
|
|
15
|
+
const flushChunk = (page) => {
|
|
16
|
+
if (currentNodes.length === 0)
|
|
17
|
+
return;
|
|
18
|
+
const chunk = createChunk([...currentNodes], [], options, startIndex, globalOffset, page);
|
|
19
|
+
if (chunk) {
|
|
20
|
+
if (countTokens(chunk.ast) > maxTokens) {
|
|
21
|
+
const split = splitLargeChunk(currentNodes, options, maxTokens, startIndex, page);
|
|
22
|
+
chunks.push(...split);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
chunks.push(chunk);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
currentNodes = [];
|
|
29
|
+
startIndex = globalOffset;
|
|
30
|
+
};
|
|
31
|
+
walkAst(ast, (node, _parent) => {
|
|
32
|
+
if (isNodeOfType(node, "page-break")) {
|
|
33
|
+
hasPageBreaks = true;
|
|
34
|
+
flushChunk(currentPage);
|
|
35
|
+
currentPage = node.pageNumber;
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
currentNodes.push(node);
|
|
39
|
+
const tokens = countTokens(node);
|
|
40
|
+
globalOffset += tokens;
|
|
41
|
+
if (tokens > 0 && countTokensArray(currentNodes) >= maxTokens) {
|
|
42
|
+
flushChunk(currentPage);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
flushChunk(currentPage);
|
|
46
|
+
if (!hasPageBreaks) {
|
|
47
|
+
if (chunks.length === 0)
|
|
48
|
+
return [];
|
|
49
|
+
if (chunks.length === 1) {
|
|
50
|
+
const single = chunks[0];
|
|
51
|
+
const totalTokens = countTokens(single.ast);
|
|
52
|
+
if (totalTokens > maxTokens) {
|
|
53
|
+
return splitLargeChunk([single.ast], options, maxTokens, single.metadata.startIndex, single.metadata.page);
|
|
54
|
+
}
|
|
55
|
+
return chunks;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return chunks;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function countTokensArray(nodes) {
|
|
62
|
+
return nodes.reduce((sum, n) => sum + countTokens(n), 0);
|
|
63
|
+
}
|
|
64
|
+
function splitLargeChunk(nodes, options, maxTokens, startIndex, page) {
|
|
65
|
+
const chunks = [];
|
|
66
|
+
let buffer = [];
|
|
67
|
+
let offset = startIndex;
|
|
68
|
+
for (const node of nodes) {
|
|
69
|
+
const nodeTokens = countTokens(node);
|
|
70
|
+
const bufferTokens = countTokensArray(buffer);
|
|
71
|
+
if (bufferTokens + nodeTokens > maxTokens && buffer.length > 0) {
|
|
72
|
+
const chunk = createChunk(buffer, [], options, offset, offset + bufferTokens, page);
|
|
73
|
+
if (chunk)
|
|
74
|
+
chunks.push(chunk);
|
|
75
|
+
offset += bufferTokens;
|
|
76
|
+
buffer = [];
|
|
77
|
+
}
|
|
78
|
+
buffer.push(node);
|
|
79
|
+
}
|
|
80
|
+
if (buffer.length > 0) {
|
|
81
|
+
const bufferTokens = countTokensArray(buffer);
|
|
82
|
+
const chunk = createChunk(buffer, [], options, offset, offset + bufferTokens, page);
|
|
83
|
+
if (chunk)
|
|
84
|
+
chunks.push(chunk);
|
|
85
|
+
}
|
|
86
|
+
return chunks;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=page-strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-strategy.js","sourceRoot":"","sources":["../../src/strategies/page-strategy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AnyNode, DocumentChunk, ChunkingOptions } from "@markitdownjs/shared";
|
|
2
|
+
import type { ChunkingStrategy } from "../chunker.js";
|
|
3
|
+
/** Splits a document by semantic boundaries with configurable overlap */
|
|
4
|
+
export declare class SemanticChunkingStrategy implements ChunkingStrategy {
|
|
5
|
+
name: string;
|
|
6
|
+
chunk(ast: AnyNode, options: ChunkingOptions): DocumentChunk[];
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=semantic-strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-strategy.d.ts","sourceRoot":"","sources":["../../src/strategies/semantic-strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,aAAa,EACb,eAAe,EAGhB,MAAM,sBAAsB,CAAC;AAO9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAMtD,yEAAyE;AACzE,qBAAa,wBAAyB,YAAW,gBAAgB;IAC/D,IAAI,SAAc;IAElB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,GAAG,aAAa,EAAE;CA2D/D"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { walkAst, getNodeText, isNodeOfType, countTokens, } from "@markitdownjs/shared";
|
|
2
|
+
import { createChunk } from "../chunker.js";
|
|
3
|
+
const DEFAULT_MAX_TOKENS = 512;
|
|
4
|
+
const DEFAULT_OVERLAP = 50;
|
|
5
|
+
/** Splits a document by semantic boundaries with configurable overlap */
|
|
6
|
+
export class SemanticChunkingStrategy {
|
|
7
|
+
name = "semantic";
|
|
8
|
+
chunk(ast, options) {
|
|
9
|
+
const maxTokens = options.maxTokens ?? DEFAULT_MAX_TOKENS;
|
|
10
|
+
const overlap = options.overlap ?? DEFAULT_OVERLAP;
|
|
11
|
+
const nodes = [];
|
|
12
|
+
walkAst(ast, (node, _parent) => {
|
|
13
|
+
if (node.type === "paragraph" ||
|
|
14
|
+
node.type === "heading" ||
|
|
15
|
+
node.type === "list" ||
|
|
16
|
+
node.type === "table" ||
|
|
17
|
+
node.type === "code" ||
|
|
18
|
+
node.type === "blockquote" ||
|
|
19
|
+
node.type === "thematic-break" ||
|
|
20
|
+
node.type === "horizontal-rule") {
|
|
21
|
+
nodes.push(node);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
if (nodes.length === 0)
|
|
25
|
+
return [];
|
|
26
|
+
const semanticGroups = groupBySemanticBoundary(nodes);
|
|
27
|
+
const chunks = [];
|
|
28
|
+
let overlapText = "";
|
|
29
|
+
for (const group of semanticGroups) {
|
|
30
|
+
const groupTokens = group.reduce((sum, n) => sum + countTokens(n), 0);
|
|
31
|
+
if (overlapText && overlap > 0) {
|
|
32
|
+
const overlapWords = overlapText.split(/\s+/).filter(Boolean).slice(-overlap);
|
|
33
|
+
const overlapToken = overlapWords.join(" ");
|
|
34
|
+
if (overlapToken) {
|
|
35
|
+
group.unshift({
|
|
36
|
+
type: "paragraph",
|
|
37
|
+
children: [{ type: "text", value: overlapToken }],
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (groupTokens <= maxTokens) {
|
|
42
|
+
const chunk = createChunk(group, extractHeadingPath(group), options, 0, groupTokens);
|
|
43
|
+
if (chunk)
|
|
44
|
+
chunks.push(chunk);
|
|
45
|
+
const lastText = getNodeText(group[group.length - 1]);
|
|
46
|
+
const words = lastText.split(/\s+/).filter(Boolean);
|
|
47
|
+
overlapText = words.slice(-overlap).join(" ");
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
const subChunks = splitGroupByTokens(group, maxTokens, overlap, options);
|
|
51
|
+
chunks.push(...subChunks);
|
|
52
|
+
if (subChunks.length > 0) {
|
|
53
|
+
const lastChunk = subChunks[subChunks.length - 1];
|
|
54
|
+
const words = lastChunk.content.split(/\s+/).filter(Boolean);
|
|
55
|
+
overlapText = words.slice(-overlap).join(" ");
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return chunks;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function groupBySemanticBoundary(nodes) {
|
|
63
|
+
const groups = [];
|
|
64
|
+
let currentGroup = [];
|
|
65
|
+
for (const node of nodes) {
|
|
66
|
+
if (isNodeOfType(node, "heading")) {
|
|
67
|
+
if (currentGroup.length > 0) {
|
|
68
|
+
groups.push(currentGroup);
|
|
69
|
+
currentGroup = [];
|
|
70
|
+
}
|
|
71
|
+
currentGroup.push(node);
|
|
72
|
+
}
|
|
73
|
+
else if (node.type === "thematic-break" ||
|
|
74
|
+
node.type === "horizontal-rule") {
|
|
75
|
+
if (currentGroup.length > 0) {
|
|
76
|
+
groups.push(currentGroup);
|
|
77
|
+
currentGroup = [];
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
currentGroup.push(node);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (currentGroup.length > 0) {
|
|
85
|
+
groups.push(currentGroup);
|
|
86
|
+
}
|
|
87
|
+
return groups;
|
|
88
|
+
}
|
|
89
|
+
function extractHeadingPath(nodes) {
|
|
90
|
+
const path = [];
|
|
91
|
+
for (const node of nodes) {
|
|
92
|
+
if (isNodeOfType(node, "heading")) {
|
|
93
|
+
path.length = node.level - 1;
|
|
94
|
+
path[node.level - 1] = getNodeText(node);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return path;
|
|
98
|
+
}
|
|
99
|
+
function splitGroupByTokens(nodes, maxTokens, overlap, options) {
|
|
100
|
+
const chunks = [];
|
|
101
|
+
let buffer = [];
|
|
102
|
+
let bufferTokens = 0;
|
|
103
|
+
for (const node of nodes) {
|
|
104
|
+
const nodeTokens = countTokens(node);
|
|
105
|
+
if (bufferTokens + nodeTokens > maxTokens && buffer.length > 0) {
|
|
106
|
+
const chunk = createChunk(buffer, extractHeadingPath(buffer), options, 0, bufferTokens);
|
|
107
|
+
if (chunk)
|
|
108
|
+
chunks.push(chunk);
|
|
109
|
+
const lastText = getNodeText(buffer[buffer.length - 1]);
|
|
110
|
+
const overlapWords = lastText.split(/\s+/).filter(Boolean).slice(-overlap);
|
|
111
|
+
const overlapToken = overlapWords.join(" ");
|
|
112
|
+
buffer = [];
|
|
113
|
+
bufferTokens = 0;
|
|
114
|
+
if (overlapToken && overlap > 0) {
|
|
115
|
+
buffer.push({
|
|
116
|
+
type: "paragraph",
|
|
117
|
+
children: [{ type: "text", value: overlapToken }],
|
|
118
|
+
});
|
|
119
|
+
bufferTokens = overlap;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
buffer.push(node);
|
|
123
|
+
bufferTokens += nodeTokens;
|
|
124
|
+
}
|
|
125
|
+
if (buffer.length > 0) {
|
|
126
|
+
const chunk = createChunk(buffer, extractHeadingPath(buffer), options, 0, bufferTokens);
|
|
127
|
+
if (chunk)
|
|
128
|
+
chunks.push(chunk);
|
|
129
|
+
}
|
|
130
|
+
return chunks;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=semantic-strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-strategy.js","sourceRoot":"","sources":["../../src/strategies/semantic-strategy.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@markitdownjs/chunking",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "AI-ready document chunking strategies for MarkItDownJS",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"module": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"@markitdownjs/shared": "0.1.0"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"typescript": "^5.5.0"
|
|
24
|
+
},
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "tsc --project tsconfig.json",
|
|
27
|
+
"dev": "tsc --watch --project tsconfig.json",
|
|
28
|
+
"typecheck": "tsc --noEmit",
|
|
29
|
+
"clean": "rm -rf dist tsconfig.tsbuildinfo"
|
|
30
|
+
}
|
|
31
|
+
}
|