Набор инструментов для текстовой нормализации, который можно использовать для:
- Лемматизации
- Морфологического анализа
- Токенизации и определения типов токенов
- Конвертации имен числительных в числа и цифры
- Конвертации сокращенных порядковых числительных в число
- Конвертации цифр и чисел с тысячным постфиксом (e.g 5к - 5000)
- Замены биграм пользовательскими значениями (eg. кредитная карта - карта)
- Выделения номеров кредитных карт
- Определения и фильтрации стоп-слов
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
для построения окружения
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]]
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