PBThuong96 commited on
Commit
87c3fc4
·
verified ·
1 Parent(s): c4a14d2

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +56 -47
app.py CHANGED
@@ -5,6 +5,11 @@ sys.modules['sqlite3'] = sys.modules.pop('pysqlite3')
5
  import os
6
  import gradio as gr
7
 
 
 
 
 
 
8
  # --- IMPORT CÁC THƯ VIỆN ---
9
  from langchain_google_genai import ChatGoogleGenerativeAI
10
  from langchain_chroma import Chroma
@@ -40,74 +45,78 @@ if not GOOGLE_API_KEY:
40
  # XỬ LÝ DỮ LIỆU ĐA ĐỊNH DẠNG (BẢN SỬA LỖI TXT)
41
  # ==========================================
42
  def load_documents_from_folder(folder_path):
43
- """Hàm đọc nhiều loại file khác nhau từ thư mục, hỗ trợ dò bảng mã TXT"""
44
  documents = []
 
45
  if not os.path.exists(folder_path):
46
  os.makedirs(folder_path)
47
  return []
48
 
49
  for filename in os.listdir(folder_path):
50
  file_path = os.path.join(folder_path, filename)
51
- loader = None
52
-
53
- # Chuyển tên file về chữ thường để so sánh (.TXT cũng như .txt)
54
  filename_lower = filename.lower()
55
 
56
  try:
 
57
  if filename_lower.endswith(".pdf"):
 
58
  loader = PyPDFLoader(file_path)
59
-
60
- elif filename_lower.endswith(".docx") or filename_lower.endswith(".doc"):
61
- loader = Docx2txtLoader(file_path)
62
-
 
 
 
 
 
 
 
 
 
 
 
63
  elif filename_lower.endswith(".xlsx") or filename_lower.endswith(".xls"):
64
- # Xử lý Excel: Chuyển thành text để tránh lỗi
65
- import pandas as pd
66
  try:
 
67
  df = pd.read_excel(file_path)
 
68
  text_data = df.to_string(index=False)
69
- # Tạo loader giả lập từ text
70
- from langchain_community.docstore.document import Document
71
- loader = type('obj', (object,), {'load': lambda: [Document(page_content=text_data, metadata={"source": filename})]})
 
 
 
72
  except Exception as e:
73
- print(f"Lỗi đọc Excel {filename}: {e}")
74
- continue
75
 
 
76
  elif filename_lower.endswith(".txt"):
77
- # --- SỬA LỖI TXT: Thử lần lượt các bảng mã ---
78
- encodings = ['utf-8', 'utf-16', 'cp1258', 'latin-1']
79
- success = False
80
-
81
- for enc in encodings:
82
- try:
83
- # Thử load với bảng mã này
84
- temp_loader = TextLoader(file_path, encoding=enc)
85
- docs = temp_loader.load()
86
- documents.extend(docs) # Nếu đọc được thì lưu luôn
87
- print(f"-> Đọc file {filename} thành công (Encoding: {enc})")
88
- success = True
89
- break
90
- except Exception:
91
- continue
92
-
93
- if not success:
94
- print(f"Lỗi: Không thể đọc file {filename} với bất kỳ bảng mã nào.")
95
-
96
- # Vì đã xử lý add documents trong vòng lặp, ta continue để skip đoạn code chung bên dưới
97
- continue
98
-
99
- # Xử lý chung cho PDF, DOCX (vì TXT đã xử lý riêng ở trên)
100
- if loader:
101
- print(f"-> Đang đọc file: {filename}")
102
- docs = loader.load()
103
- for doc in docs:
104
- if "source" not in doc.metadata:
105
- doc.metadata["source"] = filename
106
- documents.extend(docs)
107
 
 
 
 
 
 
 
 
108
  except Exception as e:
109
- print(f"Lỗi không xác định khi đọc file {filename}: {e}")
110
-
 
111
  return documents
112
 
113
  def get_retriever():
 
5
  import os
6
  import gradio as gr
7
 
8
+ import pandas as pd
9
+ import docx2txt
10
+ from langchain_community.document_loaders import PyPDFLoader, TextLoader
11
+ from langchain_core.documents import Document
12
+
13
  # --- IMPORT CÁC THƯ VIỆN ---
14
  from langchain_google_genai import ChatGoogleGenerativeAI
15
  from langchain_chroma import Chroma
 
45
  # XỬ LÝ DỮ LIỆU ĐA ĐỊNH DẠNG (BẢN SỬA LỖI TXT)
46
  # ==========================================
47
  def load_documents_from_folder(folder_path):
48
+ print(f"--- Bắt đầu quét thư mục: {folder_path} ---")
49
  documents = []
50
+
51
  if not os.path.exists(folder_path):
52
  os.makedirs(folder_path)
53
  return []
54
 
55
  for filename in os.listdir(folder_path):
56
  file_path = os.path.join(folder_path, filename)
 
 
 
57
  filename_lower = filename.lower()
58
 
59
  try:
60
+ # 1. XỬ LÝ PDF
61
  if filename_lower.endswith(".pdf"):
62
+ print(f"-> Đang xử lý PDF: {filename}")
63
  loader = PyPDFLoader(file_path)
64
+ docs = loader.load()
65
+ documents.extend(docs)
66
+
67
+ # 2. XỬ LÝ WORD (.docx)
68
+ elif filename_lower.endswith(".docx"):
69
+ print(f"-> Đang xử lý Word: {filename}")
70
+ # Dùng docx2txt trực tiếp để lấy text
71
+ text = docx2txt.process(file_path)
72
+ if text.strip():
73
+ doc = Document(page_content=text, metadata={"source": filename})
74
+ documents.append(doc)
75
+ else:
76
+ print(f" Cảnh báo: File Word rỗng ({filename})")
77
+
78
+ # 3. XỬ LÝ EXCEL (.xlsx, .xls) - Dùng Pandas
79
  elif filename_lower.endswith(".xlsx") or filename_lower.endswith(".xls"):
80
+ print(f"-> Đang xử lý Excel: {filename}")
 
81
  try:
82
+ # Đọc Excel thành DataFrame rồi chuyển thành Text
83
  df = pd.read_excel(file_path)
84
+ # Chuyển toàn bộ bảng thành chuỗi string
85
  text_data = df.to_string(index=False)
86
+
87
+ if text_data.strip():
88
+ doc = Document(page_content=text_data, metadata={"source": filename})
89
+ documents.append(doc)
90
+ else:
91
+ print(f" Cảnh báo: File Excel rỗng ({filename})")
92
  except Exception as e:
93
+ print(f" Lỗi đọc Excel {filename}: {e}")
 
94
 
95
+ # 4. XỬ LÝ TEXT (.txt)
96
  elif filename_lower.endswith(".txt"):
97
+ print(f"-> Đang xử lý Text: {filename}")
98
+ text = ""
99
+ # Thử đọc với UTF-8 trước
100
+ try:
101
+ with open(file_path, "r", encoding="utf-8") as f:
102
+ text = f.read()
103
+ except UnicodeDecodeError:
104
+ # Nếu lỗi, thử đọc với Latin-1 (Windows cũ)
105
+ print(f" Encoding UTF-8 thất bại, thử Latin-1...")
106
+ with open(file_path, "r", encoding="latin-1") as f:
107
+ text = f.read()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
 
109
+ if text.strip():
110
+ doc = Document(page_content=text, metadata={"source": filename})
111
+ documents.append(doc)
112
+
113
+ else:
114
+ print(f"-> Bỏ qua file không hỗ trợ: {filename}")
115
+
116
  except Exception as e:
117
+ print(f" LỖI NGHIÊM TRỌNG khi đọc file {filename}: {e}")
118
+
119
+ print(f"--- Hoàn tất! Tổng số tài liệu load được: {len(documents)} ---")
120
  return documents
121
 
122
  def get_retriever():