-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdocument_processor.py
More file actions
65 lines (57 loc) · 2.51 KB
/
Copy pathdocument_processor.py
File metadata and controls
65 lines (57 loc) · 2.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
from typing import List
from langchain.text_splitter import RecursiveCharacterTextSplitter, Language
from langchain.schema import Document
from config import config
class AdvancedDocumentProcessor:
"""Advanced document processing with LangChain"""
def __init__(self):
# Initialize different splitters for different file types
self.splitters = {
'python': RecursiveCharacterTextSplitter.from_language(
language=Language.PYTHON,
chunk_size=config.CHUNK_SIZE,
chunk_overlap=config.CHUNK_OVERLAP
),
'javascript': RecursiveCharacterTextSplitter.from_language(
language=Language.JS,
chunk_size=config.CHUNK_SIZE,
chunk_overlap=config.CHUNK_OVERLAP
),
'java': RecursiveCharacterTextSplitter.from_language(
language=Language.JAVA,
chunk_size=config.CHUNK_SIZE,
chunk_overlap=config.CHUNK_OVERLAP
),
'cpp': RecursiveCharacterTextSplitter.from_language(
language=Language.CPP,
chunk_size=config.CHUNK_SIZE,
chunk_overlap=config.CHUNK_OVERLAP
),
'documentation': RecursiveCharacterTextSplitter.from_language(
language=Language.MARKDOWN,
chunk_size=config.CHUNK_SIZE,
chunk_overlap=config.CHUNK_OVERLAP
),
'default': RecursiveCharacterTextSplitter(
chunk_size=config.CHUNK_SIZE,
chunk_overlap=config.CHUNK_OVERLAP,
separators=["\n\n", "\n", " ", ""]
)
}
def process_documents(self, documents: List[Document]) -> List[Document]:
"""Process documents with appropriate splitters"""
processed_docs = []
for doc in documents:
file_type = doc.metadata.get('file_type', 'default')
splitter = self.splitters.get(file_type, self.splitters['default'])
# Split the document
chunks = splitter.split_documents([doc])
# Add chunk information to metadata
for i, chunk in enumerate(chunks):
chunk.metadata.update({
'chunk_id': i,
'total_chunks': len(chunks),
'chunk_size': len(chunk.page_content)
})
processed_docs.extend(chunks)
return processed_docs