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
JavaScript
;
/**
* 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