/dnlp

📚 Сборник полезных штук из Natural Language Processing: Определение языка текста, Разделение текста на предложения, Получение основного содержимого из html документа

Primary LanguagePythonMIT LicenseMIT

dNLP

Сборник полезных штук из Natural Language Processing, завернутый в API в виде Docker-контейнера.

📖 Содержимое dNLP

В данный момент в состав входит:

  1. Определение языка текста – с помощью пакета fastText с её предобученной моделью для распознавания 176 языков.
  2. Разделение текста на предложения – за основу взяты токенайзеры от NLTK.
  3. Получение основного содержимого из html документа – используя пакет Trafilatura.
  4. Удаление нечётких дублей приложений – с помощью расстояния Левенштейна и пакета Levenshtein.

📦 Установка Docker

Для использования необходимо установить Docker Engine последней версии.

🚀 Запуск dNLP

Клонируем репу:

git clone https://github.com/lord-alfred/dnlp.git

Или качаем её по ссылке в zip-архиве (не забудьте распаковать архив).

И запускаем контейнер:

cd dnlp
docker compose up --build -d

Для остановки контейнера необходимо перейти в папку, куда склонирован dnlp и выполнить:

docker compose stop

🚦 Проверка работоспособности

После запуска на той же машине можно стрельнуть в контейнер запросами (для проверки необходим установленный curl):

# проверка определения языка:
curl -v -XPOST -d 'text=some+useful+info' http://127.0.0.1:9090/detect

# проверка токенизации:
curl -v -XPOST -d 'text=Test+sent%3F+Don%27t+or+ms.+Not%21+Yes%2C+of+course.+Maybe+mr.Jeck+and+band.&lang=en' http://127.0.0.1:9090/tokenize

# получение текста из html документа:
curl -v XPOST -d 'html=%3Chtml%3E%3Cbody%3E%3Ch1%3Etest%3C%2Fh1%3E%3Cp%3Ethis%20is%20test%3C%2Fp%3E%3C%2Fbody%3E%3C%2Fhtml%3E' http://127.0.0.1:9090/extract

# удаление дублей предложений:
curl -v XPOST -d '{"sentences": ["1 sentence", "2 sentence", "Another sentence"], "threshold": 0.8}' http://127.0.0.1:9090/deduplicate

Для проверки с другого сервера – нужно поменять IP адрес и убедиться что во встроенном фаерволле не закрыт порт 9090.

📚 Описание API ручек

Все эндпоинты обрабатывают только запросы с HTTP-методом POST.

Определение языка текста

API Endpoint: /detect

Поддерживает следующие входные параметры:

  • text – строка с текстом, у которой нужно определить язык;
  • count – количество результатов. По дефолту: 3.

В результате будет json в виде массива словарей:

[
  {
    "confidence": 0.5937589406967163,
    "code": "en",
    "name": "English",
    "family": "Indo-European",
    "endonym": "English",
    "iso639-1": "en",
    "iso639-2/T": "eng",
    "iso639-2/B": "eng",
    "iso639-3": "eng"
  }
]

Разделение текста на предложения

API Endpoint: /tokenize

Поддерживает следующие входные параметры:

  • text – строка с текстом, которую нужно разбить на предложения;
  • lang – код язык текста. По дефолту: en.

Поддерживаемые языки для токенизации:

{
    "en": "english",
    "ru": "russian",
    "cs": "czech",
    "da": "danish",
    "nl": "dutch",
    "et": "estonian",
    "fi": "finnish",
    "fr": "french",
    "de": "german",
    "el": "greek",
    "it": "italian",
    "ml": "malayalam",
    "no": "norwegian",
    "pl": "polish",
    "pt": "portuguese",
    "sl": "slovene",
    "es": "spanish",
    "sv": "swedish",
    "tr": "turkish"
}

В результате будет json в виде массива строк:

[
  "Test sent?",
  "Don't or ms. Not!",
  "Yes, of course.",
  "Maybe mr.Jeck and band."
]

Получение основного содержимого из html документа

API Endpoint: /extract

Поддерживает только один входной параметр:

  • html – содержимое HTML-страницы, закодированное с помощью urlencode функции (страницу нужно скачать самостоятельно).

Очень важно закодировать в URL-encoding формат передаваемую страницу, т.к. в случае отсутствия кодирования – парсер обработает только часть из страницы (до первого символа &)!

В результате будет отдан основной контент страницы без html-тегов.

Удаление нечётких дублей приложений

API Endpoint: /deduplicate

❗️ На вход принимается только JSON.

Внутри json должны быть следующие ключи со значениями:

  • sentences – массив строк (предложений) для удаления из них дублей;
  • threshold – пороговое значение в интервале [0.0, 1.0], при срабатывании которого предложение считается нечётким дублем (параметр не обязателен, по-умолчанию: 0.8).

В результате будет json в виде массива строк:

[
  "2 sentence",
  "Another sentence"
]

👹 Автор

Lord_Alfred

Блог: https://t.me/Lord_Alfred