arkataev / text_normalizer

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Текстовый нормализатор

Набор инструментов для текстовой нормализации, который можно использовать для:

  • Лемматизации
  • Морфологического анализа
  • Токенизации и определения типов токенов
  • Конвертации имен числительных в числа и цифры
  • Конвертации сокращенных порядковых числительных в число
  • Конвертации цифр и чисел с тысячным постфиксом (e.g 5к - 5000)
  • Замены биграм пользовательскими значениями (eg. кредитная карта - карта)
  • Выделения номеров кредитных карт
  • Определения и фильтрации стоп-слов

Установка

Linux

VertualEnv

pip3 install virtualenv

# активация виртуального окружения
cd ivr_tn
virtualenv venv
. venv/bin/activate

# venv
pip install ipython

# установка нормализатора

## дистрибутив 
pip install text_normalizer-[current_version]

## source
cd text_normalizer
python setup.py install 

# загрузка mystem
curl -sL http://download.cdn.yandex.net/mystem/mystem-3.1-linux-64bit.tar.gz -o /tmp/mystem-3.1-linux-64bit.tar.gz
cd /tmp
tar -xzf mystem-3.1-linux-64bit.tar.gz
mv mystem /usr/local/bin/mystem
cd /tmp
rm -rf /tmp/mystem*

# добавление переменных окружения
export NLTK_DATA=/usr/local/share/nltk_data
export MYSTEM_BIN=/usr/local/bin/mystem

Рекомендуется использовать docker для построения окружения

Docker-compose

cd ivr_tn/build
docker-compose build tn

Использование

Запуск примера в контейнере

docker run -it --env-file=.env --rm ivr:tn ipython

в примере применяются по-умолчанию все опции конвертации результатов морф.анализа

from text_normalizer.sample import normalize
from text_normalizer.stemming import jstem_ctx

with jstem_ctx() as stemmer:
    print(list(normalize("мама мыла раму", stemmer)))
    print(list(normalize("папа красил окно", stemmer)))
    print(list(normalize("сто двадцать три рубля", stemmer)))
    print(list(
        normalize('номер карты один один два четыре четыре нуля сто двадцать восемь один пятнадцать десять', stemmer)))
    print(list(normalize('двадцать второе марта две тысячи двадцатого года', stemmer)))

# benchmark ipython
with jstem_ctx() as stemmer:
    %timeit list(
        normalize('номер карты один один два четыре четыре нуля сто двадцать восемь один пятнадцать десять', stemmer))

Конфигурация нормализации

Доступные пайплайны

from text_normalizer.stemming import Pipeline

Pipeline.WORD2NUM       # замена числительных
Pipeline.STOPWORDS      # фильтрация стоп-слов 
Pipeline.ORD_UNFOLD     # замена сокращенных числительных (5й -> 5)   
Pipeline.CCN            # определение номеров кридитных карт   
Pipeline.MAKE_DATE      # создание дат
Pipeline.KILO           # замена тысячного постфикса (5к -> 5000)
from text_normalizer.stemming import Pipeline, jstem_ctx
from text_normalizer.sample import normalize

with jstem_ctx() as stemmer:
    # Включить только замену числительных
    print(list(normalize("мама мыла раму", stemmer, pipeline=[Pipeline.WORD2NUM])))
    # Включить замену числительных и фильтрацию стоп-слов
    print(list(normalize("мама мыла раму", stemmer, pipeline=[Pipeline.WORD2NUM, Pipeline.STOPWORDS])))
    # Выключить замену биграмм данными из словаря ("когда то" -> "когда-то", "окко" -> "окко-тв")
    # по-умолчанию - включена
    print(list(normalize("мама мыла раму", stemmer, bigrams=False)))

Нормализация в контейнере

docker-compose run --rm tn --help

# Разбор строки
docker-compose run --rm tn "сто двадцать пять"

# [["сто", "сто", [["pos", "NUM"], ["ambiguous", "(вин|им)"]], true], ["двадцать", "двадцать", [["pos", "NUM"], ["ambiguous", "(вин|им)"]], true], ["пять", "пять", [["pos", "NUM"], ["ambiguous", "(вин|им)"]], true]]


# Преобразование числительных
docker-compose run --rm tn "сто двадцать пять" --word2num

# [["125", "125", [["pos", "NUM"], ["ambiguous", "(вин|им)"]], true]]

Удаленный нормализатор (RTN)

cd build
docker-compose run --rm --name=rtn rtn [OPTIONS]

Открыть новый терминал

cd build
docker run -it --env-file=.env --rm ivr:tn ipython
from text_normalizer.api.ipc.client import rtn_ctx

with rtn_ctx() as normalizer:
    print(normalizer.normalize('мама мыла раму'))

Тестирование

cd build
docker-compose run --rm test

# benchmarks
docker-compose run --rm test -c benchmark.ini

# coverage
docker-compose run --rm test --cov-report html:/app/coverage 

Сборка

python setup.py sdist
mv dist/* build/lib
cd build 
docker-compose build tn

About

License:MIT License


Languages

Language:Python 98.6%Language:Shell 0.8%Language:Dockerfile 0.6%