ruMorpheme


NameruMorpheme JSON
Version 0.3.0 PyPI version JSON
download
home_pagehttps://github.com/EvilFreelancer/ruMorpheme
SummaryПроект языковой модели для проведения морфемного анализа и сегментации слов русского языка.
upload_time2024-11-14 10:27:26
maintainerNone
docs_urlNone
authorPavel Rykov
requires_python>=3.11
licenseNone
keywords natural language processing nlp morpheme russian
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # ruMorpheme - Russian Morphemes Segmentation

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

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

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

Веса модели [evilfreelancer/ruMorpheme-v0.2](https://huggingface.co/evilfreelancer/ruMorpheme-v0.2) на HuggingFace.

Вдохновлён кодовой базой
проекта [AlexeySorokin/NeuralMorphemeSegmentation](https://github.com/AlexeySorokin/NeuralMorphemeSegmentation), который
реализован в рамках
публикации "[Deep Convolutional Networks for Supervised Morpheme Segmentation of Russian Language](https://github.com/AlexeySorokin/NeuralMorphemeSegmentation/blob/master/Articles/MorphemeSegmentation_final.pdf)"
за авторством Алексея Сорокина и Анастасии Кравцовой.

## Установка

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

```shell
pip install rumorpheme
```

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

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

```python
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))
```

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

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

```json lines
{"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"}]}
```

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

```shell
В	в: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
```

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

```python
# Обработка и отображение результатов
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)
```

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

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

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

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

```shell
source venv/bin/activate
```

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

```shell
python3 train.py config/ruMorpheme.json
```

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

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

### Валидация обученной модели

```shell
python3 eval.py
```

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

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

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

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

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

## Лицензия

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

## Цитирование

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

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/EvilFreelancer/ruMorpheme",
    "name": "ruMorpheme",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.11",
    "maintainer_email": null,
    "keywords": "natural language processing, nlp, morpheme, russian",
    "author": "Pavel Rykov",
    "author_email": "paul@drteam.rocks",
    "download_url": "https://files.pythonhosted.org/packages/ea/f7/130d88b2705919be4f6993a8f4d9ab965b2d53e4aa6c842a54be6fcbca90/rumorpheme-0.3.0.tar.gz",
    "platform": null,
    "description": "# ruMorpheme - Russian Morphemes Segmentation\n\n\u041f\u0440\u043e\u0435\u043a\u0442 \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043c\u043e\u0440\u0444\u0435\u043c\u043d\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0441\u043b\u043e\u0432 \u0440\u0443\u0441\u0441\u043a\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430.\n\n\u041e\u0431\u0443\u0447\u0435\u043d\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0432\u0430, \u0432\u044b\u0434\u0435\u043b\u044f\u044f \u0432 \u043d\u0438\u0445:\n\n- \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0438 (PREF)\n- \u043a\u043e\u0440\u043d\u0438 (ROOT)\n- \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0433\u043b\u0430\u0441\u043d\u044b\u0435 (LINK)\n- \u0434\u0435\u0444\u0438\u0441\u044b (HYPH)\n- \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u044b (SUFF)\n- \u043f\u043e\u0441\u0442\u0444\u0438\u043a\u0441\u044b (POSTFIX)\n- \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f (END)\n\n\u0412\u0435\u0441\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 [evilfreelancer/ruMorpheme-v0.2](https://huggingface.co/evilfreelancer/ruMorpheme-v0.2) \u043d\u0430 HuggingFace.\n\n\u0412\u0434\u043e\u0445\u043d\u043e\u0432\u043b\u0451\u043d \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u043e\u0439\n\u043f\u0440\u043e\u0435\u043a\u0442\u0430 [AlexeySorokin/NeuralMorphemeSegmentation](https://github.com/AlexeySorokin/NeuralMorphemeSegmentation), \u043a\u043e\u0442\u043e\u0440\u044b\u0439\n\u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0432 \u0440\u0430\u043c\u043a\u0430\u0445\n\u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \"[Deep Convolutional Networks for Supervised Morpheme Segmentation of Russian Language](https://github.com/AlexeySorokin/NeuralMorphemeSegmentation/blob/master/Articles/MorphemeSegmentation_final.pdf)\"\n\u0437\u0430 \u0430\u0432\u0442\u043e\u0440\u0441\u0442\u0432\u043e\u043c \u0410\u043b\u0435\u043a\u0441\u0435\u044f \u0421\u043e\u0440\u043e\u043a\u0438\u043d\u0430 \u0438 \u0410\u043d\u0430\u0441\u0442\u0430\u0441\u0438\u0438 \u041a\u0440\u0430\u0432\u0446\u043e\u0432\u043e\u0439.\n\n## \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\n\n\u041f\u0440\u043e\u0435\u043a\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0447\u0435\u0440\u0435\u0437 PyPi, \u0438 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e pip:\n\n```shell\npip install rumorpheme\n```\n\n## \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f\n\n\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043c\u043e\u0440\u0444\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430:\n\n```python\nimport sys\nimport json\nfrom rumorpheme.model import RuMorphemeModel\nfrom rumorpheme.utils import labels_to_morphemes\n\n# \u0427\u0442\u0435\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0441\u043b\u043e\u0432 \u0438\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\nwords = sys.argv[1:]  # \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043b\u043e\u0432, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443\n\n# \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043c\u043e\u0434\u0435\u043b\u0438\nmodel = RuMorphemeModel.from_pretrained(\"evilfreelancer/ruMorpheme-v0.1\")\nmodel.to(\"cuda\")\nmodel.eval()\n\n# \u0418\u043d\u0444\u0435\u0440\u0435\u043d\u0441\nall_predictions, all_log_probs = model.predict(words)\n\n# \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432\nfor idx, word in enumerate(words):\n    morphs, morph_types, morph_probs = labels_to_morphemes(\n        word.lower(),\n        all_predictions[idx],\n        all_log_probs[idx]\n    )\n\n    results = []\n    for morpheme, morpheme_type, morpheme_prob in zip(morphs, morph_types, morph_probs):\n        results.append({\"text\": morpheme, \"type\": morpheme_type, \"prob\": str(morpheme_prob.round(2))})\n\n    output = {\"word\": word, \"morphemes\": results}\n    print(json.dumps(output, ensure_ascii=False))\n```\n\n## \u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u043e\u0434\u0435\u043b\u0438\n\n\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u0440\u0435\u0434\u0438\u043a\u0448\u0435\u043d\u0430 \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u044b\u0448\u0435, \u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:\n\n```json lines\n{\"word\": \"\u0412\", \"morphemes\": [{\"text\": \"\u0432\", \"type\": \"ROOT\", \"prob\": \"98.59\"}]}\n{\"word\": \"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435\", \"morphemes\": [{\"text\": \"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\", \"type\": \"ROOT\", \"prob\": \"99.3\"}, {\"text\": \"\u0435\u043d\u044c\", \"type\": \"SUFF\", \"prob\": \"96.58\"}, {\"text\": \"\u0435\", \"type\": \"END\", \"prob\": \"100.0\"}]}\n{\"word\": \"\u043c\u044b\", \"morphemes\": [{\"text\": \"\u043c\u044b\", \"type\": \"ROOT\", \"prob\": \"99.77\"}]}\n{\"word\": \"\u0440\u0435\u0448\u0438\u043b\u0438\", \"morphemes\": [{\"text\": \"\u0440\u0435\u0448\u0438\u043b\", \"type\": \"ROOT\", \"prob\": \"85.8\"}, {\"text\": \"\u0438\", \"type\": \"END\", \"prob\": \"100.0\"}]}\n{\"word\": \"\u043f\u0435\u0440\u0435\u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c\", \"morphemes\": [{\"text\": \"\u043f\u0435\u0440\u0435\", \"type\": \"PREF\", \"prob\": \"100.0\"}, {\"text\": \"\u0437\u0430\", \"type\": \"PREF\", \"prob\": \"77.91\"}, {\"text\": \"\u043f\u043b\u0430\u043d\", \"type\": \"ROOT\", \"prob\": \"98.43\"}, {\"text\": \"\u0438\u0440\", \"type\": \"SUFF\", \"prob\": \"100.0\"}, {\"text\": \"\u043e\u0432\u0430\", \"type\": \"SUFF\", \"prob\": \"99.98\"}, {\"text\": \"\u0442\u044c\", \"type\": \"SUFF\", \"prob\": \"98.37\"}]}\n```\n\n\u0410 \u0432\u043e\u0442 \u0442\u0430\u043a \u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:\n\n```shell\n\u0412\t\u0432:ROOT\t98.59\n\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435\t\u0432\u043e\u0441\u043a\u0440\u0435\u0441:ROOT/\u0435\u043d\u044c:SUFF/\u0435:END\t99.30 96.58 100.00\n\u043c\u044b\t\u043c\u044b:ROOT\t99.77\n\u0440\u0435\u0448\u0438\u043b\u0438\t\u0440\u0435\u0448\u0438\u043b:ROOT/\u0438:END\t85.80 100.00\n\u043f\u0435\u0440\u0435\u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c\t\u043f\u0435\u0440\u0435:PREF/\u0437\u0430:PREF/\u043f\u043b\u0430\u043d:ROOT/\u0438\u0440:SUFF/\u043e\u0432\u0430:SUFF/\u0442\u044c:SUFF\t100.00 77.91 98.43 100.00 99.98 98.37\n```\n\n\u0415\u0441\u043b\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0432\u043e\u0434:\n\n```python\n# \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432\nfor idx, word in enumerate(words):\n    morphs, morph_types, morph_probs = labels_to_morphemes(\n        word.lower(),\n        all_predictions[idx],\n        all_log_probs[idx]\n    )\n\n    # \u041a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0435\u043c \u043c\u043e\u0440\u0444\u0435\u043c\u044b \u0438 \u0438\u0445 \u0442\u0438\u043f\u044b \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0441\u0443\u044e \u0447\u0435\u0440\u0442\u0443\n    morpheme_with_types = [\n        f\"{morpheme}:{morpheme_type}\"\n        for morpheme, morpheme_type in zip(morphs, morph_types)\n    ]\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0438 \u043a \u043c\u043e\u0440\u0444\u0435\u043c\u0430\u043c\n    morpheme_str = '/'.join(morpheme_with_types)\n    probs_str = \" \".join(f\"{prob:.2f}\" for prob in morph_probs)\n    output_line = f\"{word}\\t{morpheme_str}\\t{probs_str}\\n\"\n    print(output_line)\n```\n\n## \u041f\u0440\u043e \u0440\u0443\u0447\u043d\u043e\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435\n\n\u0421\u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435:\n\n```shell\ngit clone https://github.com/EvilFreelancer/ruMorpheme.git\ncd ruMorpheme\npython3 -m venv venv\npip install -r requirements.txt\n```\n\n\u0410\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435:\n\n```shell\nsource venv/bin/activate\n```\n\n### \u0422\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u043a\u0430 \u043c\u043e\u0434\u0435\u043b\u0438\n\n```shell\npython3 train.py config/ruMorpheme.json\n```\n\n\u041f\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044e \u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u044b:\n\n- `model/pytorch_model.bin` - \u0432\u0435\u0441\u0430 \u043c\u043e\u0434\u0435\u043b\u0438\n- `model/config.json` - \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438\n- `model/vocab.json` - \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0435\u0434\u0438\u043a\u0448\u0435\u043d\u0430\n\n### \u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438\n\n```shell\npython3 eval.py\n```\n\n\u041e\u0442\u0447\u0451\u0442 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0432 `models/evaluation_report.txt`.\n\n### \u0418\u043d\u0444\u0435\u0440\u0435\u043d\u0441 \u043e\u0431\u0443\u0447\u0435\u043d\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438\n\n\u0417\u0430\u043f\u0443\u0441\u043a \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441\u0430 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 [input_text.txt](./input_text.txt):\n\n```shell\npython predict_file.py input_text.txt --model-path=evilfreelancer/ruMorpheme-v0.1\n```\n\n\u0415\u0441\u043b\u0438 \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c `--model-path` \u0442\u043e \u043c\u043e\u0434\u0435\u043b\u044c \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u044b \u0438\u0437 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 `./model`.\n\n## \u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f\n\n\u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u043e\u0434 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0435\u0439 `MIT`. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0441\u043c. \u0432 \u0444\u0430\u0439\u043b\u0435 [LICENSE](./LICENSE).\n\n## \u0426\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\n\n```\n@misc{rumorpheme2024sources,\n    title={ruMorpheme - Russian Morphemes Segmentation},\n    author={Pavel Rykov},\n    year={2024}\n}\n```\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "\u041f\u0440\u043e\u0435\u043a\u0442 \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043c\u043e\u0440\u0444\u0435\u043c\u043d\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0441\u043b\u043e\u0432 \u0440\u0443\u0441\u0441\u043a\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430.",
    "version": "0.3.0",
    "project_urls": {
        "Homepage": "https://github.com/EvilFreelancer/ruMorpheme"
    },
    "split_keywords": [
        "natural language processing",
        " nlp",
        " morpheme",
        " russian"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a55c156d56abeefa2b2c73a65b87e24c512fa3d9091cf827af6502b8c66c0f07",
                "md5": "09e2878a54ae7d5e93f837d19b47ed8e",
                "sha256": "e3bf023fee602423ec363edde083b94a3f711b2283b20f15f3e76cc9c1282054"
            },
            "downloads": -1,
            "filename": "ruMorpheme-0.3.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "09e2878a54ae7d5e93f837d19b47ed8e",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.11",
            "size": 11599,
            "upload_time": "2024-11-14T10:27:24",
            "upload_time_iso_8601": "2024-11-14T10:27:24.786253Z",
            "url": "https://files.pythonhosted.org/packages/a5/5c/156d56abeefa2b2c73a65b87e24c512fa3d9091cf827af6502b8c66c0f07/ruMorpheme-0.3.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "eaf7130d88b2705919be4f6993a8f4d9ab965b2d53e4aa6c842a54be6fcbca90",
                "md5": "42225332c750033d8e597d597d826b4b",
                "sha256": "323af9f7ce5128d90cdc029b503c8c109aa73e382a720358bf2c6ed8fbff6c8f"
            },
            "downloads": -1,
            "filename": "rumorpheme-0.3.0.tar.gz",
            "has_sig": false,
            "md5_digest": "42225332c750033d8e597d597d826b4b",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.11",
            "size": 10703,
            "upload_time": "2024-11-14T10:27:26",
            "upload_time_iso_8601": "2024-11-14T10:27:26.583930Z",
            "url": "https://files.pythonhosted.org/packages/ea/f7/130d88b2705919be4f6993a8f4d9ab965b2d53e4aa6c842a54be6fcbca90/rumorpheme-0.3.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-11-14 10:27:26",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "EvilFreelancer",
    "github_project": "ruMorpheme",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "requirements": [],
    "lcname": "rumorpheme"
}
        
Elapsed time: 0.37203s