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

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

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

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

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

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

Лицензия

Этот проект лицензирован под лицензией MIT. Подробности см. в файле LICENSE.

Цитирование

@misc{rumorpheme2024sources,
    title={ruMorpheme - Russian Morphemes Segmentation},
    author={Pavel Rykov},
    year={2024}
}

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.2.tar.gz (7.7 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.2-py3-none-any.whl (8.1 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: rumorpheme-0.1.2.tar.gz
  • Upload date:
  • Size: 7.7 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.2.tar.gz
Algorithm Hash digest
SHA256 64986e7498d2aaa5cd23b0bb18adc9e8ae359ad92fc099f31ae6a10eacdbb0d4
MD5 a2b80ed46c37099147b5508c7ab3722d
BLAKE2b-256 b5740cca01c9541bd66ebfb804c16497c19626816e4d91ebdc23ab0d6616b092

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruMorpheme-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 8.1 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.2-py3-none-any.whl
Algorithm Hash digest
SHA256 89f0cd02e858903e219d4d935f8a545c96b99b200f3035d063669ab800b7c01b
MD5 d5fce20d2d5b4de182ea4ca8c87d4cd7
BLAKE2b-256 9c521792786cc368db175ab6a60a72bdf35c2a68478a687f955582024a966a04

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