UNPKG

n8n-nodes-extract-pdf

Version:

n8n node to extract text, images and tables from PDF with multilingual support, language detection and comprehensive test suite

220 lines 8.73 kB
"use strict"; /** * Module phát hiện ngôn ngữ cho ExtractPdfNode * @author AI Assistant * @version 1.0.0 */ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.loadLanguageModules = exports.getIso6391Code = exports.getLanguageName = exports.languageData = exports.detectLanguageSimple = exports.generateLanguageStats = exports.detectLanguage = exports.mapLanguageCodeToTesseract = void 0; const franc_1 = __importDefault(require("franc")); /** * Ánh xạ từ mã ngôn ngữ ISO 639-3 sang mã ngôn ngữ Tesseract */ const languageMap = { 'eng': 'eng', 'vie': 'vie', 'fra': 'fra', 'deu': 'deu', 'spa': 'spa', 'ita': 'ita', 'rus': 'rus', 'jpn': 'jpn', 'kor': 'kor', 'zho': 'chi_sim', 'chi': 'chi_sim', 'cmn': 'chi_sim', 'yue': 'chi_tra', 'arb': 'ara', 'hin': 'hin', 'ben': 'ben', 'por': 'por', 'tha': 'tha', 'ind': 'ind', 'tam': 'tam', 'urd': 'urd', 'ukr': 'ukr', 'nld': 'nld', 'swe': 'swe', 'fin': 'fin', 'pol': 'pol', 'tur': 'tur', 'ell': 'ell', 'ces': 'ces', 'heb': 'heb' // Tiếng Do Thái }; /** * Ánh xạ mã ngôn ngữ về mã Tesseract * @param langCode Mã ngôn ngữ ISO 639 * @returns Mã ngôn ngữ Tesseract */ function mapLanguageCodeToTesseract(langCode) { if (!langCode || langCode.length < 2) { return 'eng'; // Mặc định là tiếng Anh } // Chuẩn hóa mã ngôn ngữ const normalizedCode = langCode.toLowerCase().trim(); // Tìm trong bảng ánh xạ return languageMap[normalizedCode] || 'eng'; } exports.mapLanguageCodeToTesseract = mapLanguageCodeToTesseract; /** * Phát hiện ngôn ngữ của văn bản * @param text Văn bản cần phát hiện ngôn ngữ * @returns Mã ngôn ngữ đã phát hiện (mã ISO 639-3) */ async function detectLanguage(text) { try { // Đảm bảo có đủ văn bản để phát hiện chính xác if (!text || text.length < 50) { return 'eng'; // Mặc định là tiếng Anh cho các đoạn văn bản ngắn } // Sử dụng franc để phát hiện ngôn ngữ const detectedLanguage = (0, franc_1.default)(text, { minLength: 50 }); // Trả về mã Tesseract tương ứng if (detectedLanguage === 'und') { return 'eng'; // Không xác định được ngôn ngữ, mặc định là tiếng Anh } return detectedLanguage; } catch (error) { console.error('Error detecting language:', error); return 'eng'; // Mặc định là tiếng Anh nếu có lỗi } } exports.detectLanguage = detectLanguage; /** * Tạo thống kê ngôn ngữ từ văn bản * @param text Văn bản cần phân tích * @returns Mảng các kết quả phát hiện ngôn ngữ và độ tin cậy */ async function generateLanguageStats(text) { try { // Nếu văn bản quá ngắn, không thể tạo thống kê chính xác if (!text || text.length < 100) { return [{ language: 'eng', confidence: 1 }]; } // Chia văn bản thành các đoạn để phát hiện ngôn ngữ const paragraphs = text.split(/\n\s*\n/).filter(p => p.trim().length >= 50); if (paragraphs.length === 0) { return [{ language: 'eng', confidence: 1 }]; } // Phát hiện ngôn ngữ cho từng đoạn const detections = {}; const total = paragraphs.length; for (const paragraph of paragraphs) { const detectedLang = await detectLanguage(paragraph); // Chuyển đổi sang mã Tesseract const tesseractCode = mapLanguageCodeToTesseract(detectedLang); // Tính tần suất detections[tesseractCode] = (detections[tesseractCode] || 0) + 1; } // Chuyển đổi thành mảng kết quả với độ tin cậy const result = Object.entries(detections).map(([language, count]) => ({ language, confidence: count / total })); // Sắp xếp theo độ tin cậy giảm dần result.sort((a, b) => b.confidence - a.confidence); return result.length > 0 ? result : [{ language: 'eng', confidence: 1 }]; } catch (error) { console.error('Error generating language statistics:', error); return [{ language: 'eng', confidence: 1 }]; // Mặc định là tiếng Anh nếu có lỗi } } exports.generateLanguageStats = generateLanguageStats; /** * Phát hiện ngôn ngữ của văn bản bằng phương pháp đơn giản dựa trên mẫu ký tự * @param text Văn bản cần phát hiện ngôn ngữ * @returns Mã ISO 639-3 của ngôn ngữ phát hiện được */ function detectLanguageSimple(text) { // Nếu văn bản quá ngắn, trả về undefined if (!text || text.length < 10) { return 'und'; } // Mạng lưới ký tự đặc trưng cho từng ngôn ngữ const langPatterns = { 'vie': [/[ăâđêôơưĂÂĐÊÔƠƯ]/], 'fra': [/[éèêàùëïçÉÈÊÀÙËÏÇ]/], 'deu': [/[äöüßÄÖÜ]/], 'spa': [/[áéíóúñÁÉÍÓÚÑ¿¡]/], 'jpn': [/[\u3040-\u309F\u30A0-\u30FF]/], 'zho': [/[\u4E00-\u9FFF]/], 'kor': [/[\uAC00-\uD7AF\u1100-\u11FF]/], 'rus': [/[а-яА-ЯёЁ]/], 'tha': [/[\u0E00-\u0E7F]/] }; // Đếm matches const langScores = {}; // Kiểm tra mỗi ngôn ngữ for (const [lang, patterns] of Object.entries(langPatterns)) { langScores[lang] = 0; for (const pattern of patterns) { const matches = (text.match(pattern) || []).length; langScores[lang] += matches; } } // Tìm ngôn ngữ có điểm cao nhất let bestLang = 'eng'; // Default là tiếng Anh let highestScore = 0; for (const [lang, score] of Object.entries(langScores)) { if (score > highestScore && score > 0) { highestScore = score; bestLang = lang; } } // Trả về mã ISO 639-3 return bestLang; } exports.detectLanguageSimple = detectLanguageSimple; /** * Dữ liệu ngôn ngữ ISO 639-3 giới hạn */ exports.languageData = [ { name: 'English', iso6393: 'eng', iso6391: 'en', type: 'living', scope: 'individual' }, { name: 'Vietnamese', iso6393: 'vie', iso6391: 'vi', type: 'living', scope: 'individual' }, { name: 'French', iso6393: 'fra', iso6391: 'fr', type: 'living', scope: 'individual' }, { name: 'German', iso6393: 'deu', iso6391: 'de', type: 'living', scope: 'individual' }, { name: 'Spanish', iso6393: 'spa', iso6391: 'es', type: 'living', scope: 'individual' }, { name: 'Chinese', iso6393: 'zho', iso6391: 'zh', type: 'living', scope: 'individual' }, { name: 'Japanese', iso6393: 'jpn', iso6391: 'ja', type: 'living', scope: 'individual' }, { name: 'Korean', iso6393: 'kor', iso6391: 'ko', type: 'living', scope: 'individual' }, { name: 'Russian', iso6393: 'rus', iso6391: 'ru', type: 'living', scope: 'individual' }, { name: 'Thai', iso6393: 'tha', iso6391: 'th', type: 'living', scope: 'individual' } ]; /** * Chuyển đổi mã ISO 639-3 sang tên ngôn ngữ * @param iso6393 Mã ISO 639-3 của ngôn ngữ * @returns Tên đầy đủ của ngôn ngữ */ function getLanguageName(iso6393) { const lang = exports.languageData.find(l => l.iso6393 === iso6393); return lang ? lang.name : 'Unknown'; } exports.getLanguageName = getLanguageName; /** * Chuyển đổi mã ISO 639-3 sang mã ISO 639-1 * @param iso6393 Mã ISO 639-3 của ngôn ngữ * @returns Mã ISO 639-1 tương ứng hoặc 'en' nếu không tìm thấy */ function getIso6391Code(iso6393) { const lang = exports.languageData.find(l => l.iso6393 === iso6393); return (lang === null || lang === void 0 ? void 0 : lang.iso6391) || 'en'; } exports.getIso6391Code = getIso6391Code; /** * Hàm tải module franc và iso-639-3 (giả lập) * @returns Module franc và iso-639-3 */ async function loadLanguageModules() { return { franc: (text) => detectLanguageSimple(text), iso6393: exports.languageData }; } exports.loadLanguageModules = loadLanguageModules; //# sourceMappingURL=index.js.map