Update core/multilingual_manager.py
Browse files- core/multilingual_manager.py +38 -5
core/multilingual_manager.py
CHANGED
|
@@ -146,7 +146,8 @@
|
|
| 146 |
import re
|
| 147 |
from typing import Dict, Tuple, Optional
|
| 148 |
from sentence_transformers import SentenceTransformer
|
| 149 |
-
from langdetect import detect, detect_langs
|
|
|
|
| 150 |
from config.settings import settings
|
| 151 |
|
| 152 |
class MultilingualManager:
|
|
@@ -222,7 +223,7 @@ class MultilingualManager:
|
|
| 222 |
print(f"🔍 Phát hiện ngôn ngữ: {detected_lang} (độ tin cậy: {confidence:.2f})")
|
| 223 |
return detected_lang
|
| 224 |
|
| 225 |
-
except
|
| 226 |
print(f"⚠️ LangDetect lỗi, sử dụng fallback: {e}")
|
| 227 |
return self._fallback_language_detection(text) if fallback_method else 'vi'
|
| 228 |
except Exception as e:
|
|
@@ -238,12 +239,14 @@ class MultilingualManager:
|
|
| 238 |
# Vietnamese detection với các từ đặc trưng
|
| 239 |
vietnamese_indicators = [
|
| 240 |
'của', 'và', 'là', 'có', 'được', 'trong', 'cho', 'với', 'như', 'tôi',
|
| 241 |
-
'bạn', 'ông', 'bà', 'anh', 'chị', 'em', 'này', 'kia', 'đó', 'đây'
|
|
|
|
| 242 |
]
|
| 243 |
|
| 244 |
english_indicators = [
|
| 245 |
'the', 'and', 'is', 'are', 'for', 'with', 'this', 'that', 'you', 'they',
|
| 246 |
-
'what', 'where', 'when', 'why', 'how', 'which', 'who', 'their', 'have', 'has'
|
|
|
|
| 247 |
]
|
| 248 |
|
| 249 |
# Đếm số từ chỉ định
|
|
@@ -307,10 +310,36 @@ class MultilingualManager:
|
|
| 307 |
|
| 308 |
return detected_lang, confidence_score
|
| 309 |
|
|
|
|
|
|
|
|
|
|
| 310 |
except Exception as e:
|
| 311 |
print(f"⚠️ Lỗi phát hiện ngôn ngữ với confidence: {e}")
|
| 312 |
return 'vi', 0.5
|
| 313 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 314 |
def get_embedding_model(self, language: str = None) -> Optional[SentenceTransformer]:
|
| 315 |
"""Lấy mô hình embedding dựa trên ngôn ngữ đã phát hiện"""
|
| 316 |
if language and language in settings.SUPPORTED_LANGUAGES:
|
|
@@ -372,4 +401,8 @@ class MultilingualManager:
|
|
| 372 |
'ja': '日本語',
|
| 373 |
'ko': '한국어',
|
| 374 |
'zh': '中文'
|
| 375 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 146 |
import re
|
| 147 |
from typing import Dict, Tuple, Optional
|
| 148 |
from sentence_transformers import SentenceTransformer
|
| 149 |
+
from langdetect import detect, detect_langs
|
| 150 |
+
from langdetect.lang_detect_exception import LangDetectException
|
| 151 |
from config.settings import settings
|
| 152 |
|
| 153 |
class MultilingualManager:
|
|
|
|
| 223 |
print(f"🔍 Phát hiện ngôn ngữ: {detected_lang} (độ tin cậy: {confidence:.2f})")
|
| 224 |
return detected_lang
|
| 225 |
|
| 226 |
+
except LangDetectException as e:
|
| 227 |
print(f"⚠️ LangDetect lỗi, sử dụng fallback: {e}")
|
| 228 |
return self._fallback_language_detection(text) if fallback_method else 'vi'
|
| 229 |
except Exception as e:
|
|
|
|
| 239 |
# Vietnamese detection với các từ đặc trưng
|
| 240 |
vietnamese_indicators = [
|
| 241 |
'của', 'và', 'là', 'có', 'được', 'trong', 'cho', 'với', 'như', 'tôi',
|
| 242 |
+
'bạn', 'ông', 'bà', 'anh', 'chị', 'em', 'này', 'kia', 'đó', 'đây',
|
| 243 |
+
'không', 'có', 'phải', 'rất', 'nhất', 'các', 'những', 'một', 'hai', 'ba'
|
| 244 |
]
|
| 245 |
|
| 246 |
english_indicators = [
|
| 247 |
'the', 'and', 'is', 'are', 'for', 'with', 'this', 'that', 'you', 'they',
|
| 248 |
+
'what', 'where', 'when', 'why', 'how', 'which', 'who', 'their', 'have', 'has',
|
| 249 |
+
'from', 'your', 'will', 'would', 'could', 'should', 'about', 'into', 'through'
|
| 250 |
]
|
| 251 |
|
| 252 |
# Đếm số từ chỉ định
|
|
|
|
| 310 |
|
| 311 |
return detected_lang, confidence_score
|
| 312 |
|
| 313 |
+
except LangDetectException as e:
|
| 314 |
+
print(f"⚠️ Lỗi phát hiện ngôn ngữ với confidence: {e}")
|
| 315 |
+
return 'vi', 0.5
|
| 316 |
except Exception as e:
|
| 317 |
print(f"⚠️ Lỗi phát hiện ngôn ngữ với confidence: {e}")
|
| 318 |
return 'vi', 0.5
|
| 319 |
|
| 320 |
+
def detect_language_simple(self, text: str) -> str:
|
| 321 |
+
"""
|
| 322 |
+
Phát hiện ngôn ngữ đơn giản (nhanh hơn, ít chính xác hơn)
|
| 323 |
+
"""
|
| 324 |
+
if not text or len(text.strip()) < 3:
|
| 325 |
+
return 'vi'
|
| 326 |
+
|
| 327 |
+
try:
|
| 328 |
+
# Sử dụng detect đơn giản thay vì detect_langs
|
| 329 |
+
lang_code = detect(text)
|
| 330 |
+
|
| 331 |
+
lang_map = {
|
| 332 |
+
'vi': 'vi', 'en': 'en', 'fr': 'fr', 'es': 'es',
|
| 333 |
+
'de': 'de', 'ja': 'ja', 'ko': 'ko', 'zh-cn': 'zh', 'zh-tw': 'zh'
|
| 334 |
+
}
|
| 335 |
+
|
| 336 |
+
return lang_map.get(lang_code, 'en')
|
| 337 |
+
|
| 338 |
+
except LangDetectException:
|
| 339 |
+
return self._fallback_language_detection(text)
|
| 340 |
+
except Exception:
|
| 341 |
+
return 'vi'
|
| 342 |
+
|
| 343 |
def get_embedding_model(self, language: str = None) -> Optional[SentenceTransformer]:
|
| 344 |
"""Lấy mô hình embedding dựa trên ngôn ngữ đã phát hiện"""
|
| 345 |
if language and language in settings.SUPPORTED_LANGUAGES:
|
|
|
|
| 401 |
'ja': '日本語',
|
| 402 |
'ko': '한국어',
|
| 403 |
'zh': '中文'
|
| 404 |
+
}
|
| 405 |
+
|
| 406 |
+
def is_language_supported(self, language: str) -> bool:
|
| 407 |
+
"""Kiểm tra xem ngôn ngữ có được hỗ trợ không"""
|
| 408 |
+
return language in self.get_supported_languages()
|