Skip to main content

Проект языковой модели для проведения морфемного анализа и сегментации слов русского языка.

Project description

ruMorpheme - Russian Morphemes Segmentation

Проект языковой модели для проведения морфемного анализа и сегментации слов русского языка.

Обученная модель способна сегментировать слова, выделяя в них:

  • приставки (PREF)
  • корни (ROOT)
  • соединительные гласные (LINK)
  • дефисы (HYPH)
  • суффиксы (SUFF)
  • постфиксы (POSTFIX)
  • окончания (END)

Веса модели evilfreelancer/ruMorpheme-v0.1 на HuggingFace.

Вдохновлён кодовой базой проекта AlexeySorokin/NeuralMorphemeSegmentation, который реализован в рамках публикации "Deep Convolutional Networks for Supervised Morpheme Segmentation of Russian Language" за авторством Алексея Сорокина и Анастасии Кравцовой.

Установка

Проект доступен через PyPi, и его можно установить с помощью pip:

pip install rumorpheme

Примеры использования

После установки можно использовать модель для сегментации морфем с помощью следующего скрипта:

import sys
import json
from rumorpheme.model import RuMorphemeModel
from rumorpheme.utils import labels_to_morphemes

# Чтение входных слов из аргументов командной строки
words = sys.argv[1:]  # Список слов, переданных через командную строку

# Загрузка модели
model = RuMorphemeModel.from_pretrained("evilfreelancer/ruMorpheme-v0.1")
model.to("cuda")
model.eval()

# Инференс
all_predictions, all_log_probs = model.predict(words)

# Обработка и отображение результатов
for idx, word in enumerate(words):
    morphs, morph_types, morph_probs = labels_to_morphemes(
        word.lower(),
        all_predictions[idx],
        all_log_probs[idx]
    )

    results = []
    for morpheme, morpheme_type, morpheme_prob in zip(morphs, morph_types, morph_probs):
        results.append({"text": morpheme, "type": morpheme_type, "prob": str(morpheme_prob.round(2))})

    output = {"word": word, "morphemes": results}
    print(json.dumps(output, ensure_ascii=False))

Пример работы модели

В случае если вы используете скрипт предикшена из примера выше, то результат будет выглядеть следующим образом:

{"word": "В", "morphemes": [{"text": "в", "type": "ROOT", "prob": "98.59"}]}
{"word": "воскресенье", "morphemes": [{"text": "воскрес", "type": "ROOT", "prob": "99.3"}, {"text": "ень", "type": "SUFF", "prob": "96.58"}, {"text": "е", "type": "END", "prob": "100.0"}]}
{"word": "мы", "morphemes": [{"text": "мы", "type": "ROOT", "prob": "99.77"}]}
{"word": "решили", "morphemes": [{"text": "решил", "type": "ROOT", "prob": "85.8"}, {"text": "и", "type": "END", "prob": "100.0"}]}
{"word": "перезапланировать", "morphemes": [{"text": "пере", "type": "PREF", "prob": "100.0"}, {"text": "за", "type": "PREF", "prob": "77.91"}, {"text": "план", "type": "ROOT", "prob": "98.43"}, {"text": "ир", "type": "SUFF", "prob": "100.0"}, {"text": "ова", "type": "SUFF", "prob": "99.98"}, {"text": "ть", "type": "SUFF", "prob": "98.37"}]}

А вот так её можно будет заставить выводить результат:

В	в:ROOT	98.59
воскресенье	воскрес:ROOT/ень:SUFF/е:END	99.30 96.58 100.00
мы	мы:ROOT	99.77
решили	решил:ROOT/и:END	85.80 100.00
перезапланировать	пере:PREF/за:PREF/план:ROOT/ир:SUFF/ова:SUFF/ть:SUFF	100.00 77.91 98.43 100.00 99.98 98.37

Если форматировать вывод:

# Обработка и отображение результатов
for idx, word in enumerate(words):
    morphs, morph_types, morph_probs = labels_to_morphemes(
        word.lower(),
        all_predictions[idx],
        all_log_probs[idx]
    )

    # Комбинируем морфемы и их типы через косую черту
    morpheme_with_types = [
        f"{morpheme}:{morpheme_type}"
        for morpheme, morpheme_type in zip(morphs, morph_types)
    ]

    # Добавляем вероятности к морфемам
    morpheme_str = '/'.join(morpheme_with_types)
    probs_str = " ".join(f"{prob:.2f}" for prob in morph_probs)
    output_line = f"{word}\t{morpheme_str}\t{probs_str}\n"
    print(output_line)

Про ручное обучение

Склонируем проект и подготовим окружение:

git clone https://github.com/EvilFreelancer/ruMorpheme.git
cd ruMorpheme
python3 -m venv venv
pip install -r requirements.txt

Активируем окружение:

source venv/bin/activate

Тренировка модели

python3 train.py config/ruMorpheme.json

По завершению тренировки будут созданы:

  • model/pytorch-model.bin - веса модели
  • model/config.json - конфигурация модели
  • model/vocab.json - словарь необходимый для работы предикшена

Валидация модели

python3 eval.py config/ruMorpheme.json

Отчёт валидации будет в models/evaluation_report.txt.

Инференс обученной модели

Запуск тестового предикшена из файла input_text.txt:

python predict_file.py input_text.txt --model-path=evilfreelancer/ruMorpheme-v0.1

Если не указывать --model-path то модель и конфигурация будут прочитаны из директории ./model.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rumorpheme-0.1.1.tar.gz (7.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ruMorpheme-0.1.1-py3-none-any.whl (8.0 kB view details)

Uploaded Python 3

File details

Details for the file rumorpheme-0.1.1.tar.gz.

File metadata

  • Download URL: rumorpheme-0.1.1.tar.gz
  • Upload date:
  • Size: 7.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.6

File hashes

Hashes for rumorpheme-0.1.1.tar.gz
Algorithm Hash digest
SHA256 7617749030c9cd17f7643dc6a084e7587db50d0fa0a88c743b8344fa9f49b22e
MD5 d3baa75b695a0d015627a587349bd3fd
BLAKE2b-256 b9b20d4bb6b11fdff9466af365b4f0d2bf8f15cf4f3e7f595921648e66b401ca

See more details on using hashes here.

File details

Details for the file ruMorpheme-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: ruMorpheme-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 8.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.6

File hashes

Hashes for ruMorpheme-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 684d8e1f26e9f44ad7582423c8642a34cf983783b2c550d4a3bec3e448cad58d
MD5 f16a3bc4bcf23922080e1545fc60dcdb
BLAKE2b-256 39082e6f9e8296d4e88b45c598c924407b83df5194e3727f413207acd5ec0209

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page