227 lines
6.6 KiB
Markdown
227 lines
6.6 KiB
Markdown
|
|
# 🤖 NATASHA NER API - ИСПОЛЬЗОВАНИЕ В n8n
|
|||
|
|
|
|||
|
|
## 🚀 **ЗАПУСК API:**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cd /root/engine/public_oversight/hotels
|
|||
|
|
python3 -m uvicorn natasha_ner_api:app --host 0.0.0.0 --port 8004 --reload
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**API будет доступен на:** `http://localhost:8004`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📡 **ENDPOINTS:**
|
|||
|
|
|
|||
|
|
### **1. GET /** - Информация о сервисе
|
|||
|
|
```bash
|
|||
|
|
curl http://localhost:8004/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### **2. GET /health** - Проверка здоровья
|
|||
|
|
```bash
|
|||
|
|
curl http://localhost:8004/health
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### **3. POST /extract** - Полное извлечение сущностей
|
|||
|
|
```bash
|
|||
|
|
curl -X POST http://localhost:8004/extract \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d '{"text": "ИП Фролов С.А. находится по адресу г. Петропавловск-Камчатский"}'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Ответ:**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"organizations": ["ИП"],
|
|||
|
|
"persons": ["Фролов С.А."],
|
|||
|
|
"locations": ["Петропавловск-Камчатский"],
|
|||
|
|
"entities": [
|
|||
|
|
{
|
|||
|
|
"type": "ORG",
|
|||
|
|
"text": "ИП",
|
|||
|
|
"start": 0,
|
|||
|
|
"end": 2
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"type": "PER",
|
|||
|
|
"text": "Фролов С.А.",
|
|||
|
|
"start": 3,
|
|||
|
|
"end": 14
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"type": "LOC",
|
|||
|
|
"text": "Петропавловск-Камчатский",
|
|||
|
|
"start": 35,
|
|||
|
|
"end": 59
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"total_entities": 3
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### **4. POST /extract_simple** - Упрощённое извлечение (для n8n)
|
|||
|
|
```bash
|
|||
|
|
curl -X POST http://localhost:8004/extract_simple \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d '{"text": "ООО Гостиница Певек, ИНН 1234567890"}'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Ответ:**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"organizations": ["ООО", "Гостиница Певек"],
|
|||
|
|
"persons": [],
|
|||
|
|
"locations": [],
|
|||
|
|
"has_organizations": true,
|
|||
|
|
"has_persons": false,
|
|||
|
|
"has_locations": false,
|
|||
|
|
"total": 2
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔗 **ИСПОЛЬЗОВАНИЕ В n8n:**
|
|||
|
|
|
|||
|
|
### **HTTP REQUEST NODE:**
|
|||
|
|
|
|||
|
|
**Настройки:**
|
|||
|
|
- **Method:** POST
|
|||
|
|
- **URL:** `http://localhost:8004/extract_simple`
|
|||
|
|
- **Body:**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"text": "{{ $json.quote }}",
|
|||
|
|
"max_length": 5000
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Headers:**
|
|||
|
|
- `Content-Type: application/json`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 💻 **CODE NODE для обработки NER результатов:**
|
|||
|
|
|
|||
|
|
Используй готовый файл: `n8n_code_natasha_ner.js`
|
|||
|
|
|
|||
|
|
Он:
|
|||
|
|
1. ✅ Проверяет критерии 1 и 2 (ИНН/ОГРН и Адрес)
|
|||
|
|
2. ✅ Вызывает Natasha API
|
|||
|
|
3. ✅ Комбинирует с результатами регулярок
|
|||
|
|
4. ✅ Возвращает улучшенную оценку
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 **WORKFLOW В n8n:**
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌─────────────────────────────┐
|
|||
|
|
│ 1. Generate 17 Criteria │
|
|||
|
|
└──────────────┬──────────────┘
|
|||
|
|
↓
|
|||
|
|
┌─────────────────────────────┐
|
|||
|
|
│ 2. Loop Over Items │
|
|||
|
|
└──────────────┬──────────────┘
|
|||
|
|
↓
|
|||
|
|
┌─────────────────────────────┐
|
|||
|
|
│ 3. PostgreSQL: Regex Search │
|
|||
|
|
└──────────────┬──────────────┘
|
|||
|
|
↓
|
|||
|
|
┌─────────────────────────────┐
|
|||
|
|
│ 4. Code: Process Results │
|
|||
|
|
└──────────────┬──────────────┘
|
|||
|
|
↓
|
|||
|
|
┌─────────────────────────────┐
|
|||
|
|
│ 5. Code: Natasha NER Check │ ← 🆕 Вызывает Natasha API
|
|||
|
|
│ (n8n_code_natasha_ner.js)│
|
|||
|
|
└──────────────┬──────────────┘
|
|||
|
|
↓
|
|||
|
|
┌─────────────────────────────┐
|
|||
|
|
│ 6. Aggregate Results │
|
|||
|
|
└──────────────┬──────────────┘
|
|||
|
|
↓
|
|||
|
|
┌─────────────────────────────┐
|
|||
|
|
│ 7. Calculate Final Score │
|
|||
|
|
└─────────────────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 **ПРИМЕР РЕЗУЛЬТАТА:**
|
|||
|
|
|
|||
|
|
**Критерий 1 (ИНН/ОГРН):**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"criterion_id": 1,
|
|||
|
|
"criterion_name": "Юридическая идентификация",
|
|||
|
|
"score": 0.0, // Регулярки не нашли
|
|||
|
|
"ner_score": 1.0, // Natasha нашла!
|
|||
|
|
"ner_entities": ["ООО Гостиница Певек", "ИП Фролов С.А."],
|
|||
|
|
"final_score": 1.0, // MAX(0.0, 1.0) = 1.0
|
|||
|
|
"method": "Natasha NER"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Критерий 2 (Адрес):**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"criterion_id": 2,
|
|||
|
|
"criterion_name": "Адрес",
|
|||
|
|
"score": 1.0, // Регулярки нашли
|
|||
|
|
"ner_score": 1.0, // Natasha тоже нашла!
|
|||
|
|
"ner_entities": ["Петропавловск-Камчатский", "ул. Пограничная"],
|
|||
|
|
"final_score": 1.0, // MAX(1.0, 1.0) = 1.0
|
|||
|
|
"method": "Гибрид (Regex + NER)"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ⚡ **ПРЕИМУЩЕСТВА:**
|
|||
|
|
|
|||
|
|
✅ **Natasha находит организации**, даже если нет ИНН/ОГРН
|
|||
|
|
✅ **Natasha находит адреса**, даже если формат нестандартный
|
|||
|
|
✅ **Работает через HTTP** - легко интегрировать в n8n
|
|||
|
|
✅ **Быстрая** - обрабатывает текст за ~100-200ms
|
|||
|
|
✅ **Локальная** - не нужен интернет
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔧 **НАСТРОЙКА В n8n:**
|
|||
|
|
|
|||
|
|
### **Вариант 1: Используй готовый Code Node**
|
|||
|
|
|
|||
|
|
Вставь код из `n8n_code_natasha_ner.js` - он всё сделает автоматически!
|
|||
|
|
|
|||
|
|
### **Вариант 2: HTTP Request Node**
|
|||
|
|
|
|||
|
|
1. Добавь **HTTP Request Node**
|
|||
|
|
2. URL: `http://localhost:8004/extract_simple`
|
|||
|
|
3. Method: POST
|
|||
|
|
4. Body: `{"text": "{{ $json.quote }}"}`
|
|||
|
|
5. Обработай ответ в следующей Code Node
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📞 **ПРОВЕРКА РАБОТЫ:**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Проверка здоровья
|
|||
|
|
curl http://localhost:8004/health
|
|||
|
|
|
|||
|
|
# Тест на русском тексте
|
|||
|
|
curl -X POST http://localhost:8004/extract_simple \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d '{"text": "Гостиница Певек находится по адресу г. Певек, ул. Ленина, 10"}'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Готово! Natasha API запущен на порту 8004!** 🚀
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|