// 🎯 CODE NODE: Π’Ρ‹Π·ΠΎΠ² Natasha NER API для извлСчСния сущностСй // РазмСсти эту Π½ΠΎΠ΄Ρƒ ΠŸΠžΠ‘Π›Π• получСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΎΡ‚ рСгулярок // Она Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ NER ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ для ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠ΅Π² 1 ΠΈ 2 const NATASHA_API_URL = 'http://localhost:8004/extract_simple'; // ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ NER ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ const NER_CRITERIA = [1, 2]; // 1 - ИНН/ΠžΠ“Π Π (ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ), 2 - АдрСс (Π»ΠΎΠΊΠ°Ρ†ΠΈΠΈ) const items = $input.all(); // ΠžΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΉ const results = await Promise.all(items.map(async (item) => { const data = item.json; const criterionId = parseInt(data.criterion_id); // Если ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΉ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ NER - Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ if (!NER_CRITERIA.includes(criterionId)) { return { json: { ...data, ner_checked: false, ner_score: 0.0, ner_entities: [] } }; } // Если Π½Π΅Ρ‚ тСкста для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ - пропускаСм if (!data.quote || data.quote.length < 10) { return { json: { ...data, ner_checked: false, ner_score: 0.0, ner_entities: [] } }; } try { // Π’Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Natasha API const response = await $http.post(NATASHA_API_URL, { text: data.quote, max_length: 5000 }); const nerResult = response.data; // ΠžΡ†Π΅Π½ΠΊΠ° NER Π² зависимости ΠΎΡ‚ критСрия let nerScore = 0.0; let nerEntities = []; if (criterionId === 1) { // ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΉ 1: Π˜Ρ‰Π΅ΠΌ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ if (nerResult.has_organizations && nerResult.organizations.length > 0) { nerScore = 1.0; nerEntities = nerResult.organizations; } } else if (criterionId === 2) { // ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΉ 2: Π˜Ρ‰Π΅ΠΌ Π»ΠΎΠΊΠ°Ρ†ΠΈΠΈ/адрСса if (nerResult.has_locations && nerResult.locations.length > 0) { nerScore = 1.0; nerEntities = nerResult.locations; } } // ΠšΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΡƒΠ΅ΠΌ с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ рСгулярок const regexScore = parseFloat(data.score) || 0.0; const finalScore = Math.max(regexScore, nerScore); return { json: { ...data, ner_checked: true, ner_score: nerScore, ner_entities: nerEntities, ner_organizations: nerResult.organizations || [], ner_persons: nerResult.persons || [], ner_locations: nerResult.locations || [], final_score: finalScore, method: finalScore === nerScore ? 'Natasha NER' : finalScore === regexScore ? 'РСгулярныС выраТСния' : 'Π“ΠΈΠ±Ρ€ΠΈΠ΄ (Regex + NER)' } }; } catch (error) { console.error(`Ошибка Natasha API для критСрия ${criterionId}:`, error.message); // Если API Π½Π΅ доступСн - Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π±Π΅Π· NER return { json: { ...data, ner_checked: false, ner_score: 0.0, ner_entities: [], ner_error: error.message } }; } })); return results;