Перейти к содержанию

Команда rumorph

rumorph [параметры] [файл ...]

Команда разбирает текст из файлов или стандартного ввода и пишет леммы, части речи и признаки Universal Dependencies в одном из четырех форматов. Она ставится вместе с пакетом (pip install rumorph) и запускается и как python -m rumorph; без Python ее ставит cargo install rumorph --features cli. Разбор и вывод выполняет ядро на Rust в одном потоке: около 100 тыс. токенов в секунду с контекстом и около миллиона без него (--no-context).

echo "Мы стали друзьями в ковиде." | rumorph
мы стать друг в ковид .

Параметры

Параметр По умолчанию Описание
-f, --format lemmas Формат вывода: lemmas, conllu, tsv, jsonl
-i, --input text Вход: text, tokens, conllu
-d, --dictionary словарь пакета Файл словаря ruMorph
-w, --words Файл своих слов: в строке слово и образец через табуляцию, а если у образца несколько частей речи - и часть речи; пробелы по краям полей не учитываются, пустые строки и строки с # в начале пропускаются. Параметр можно повторить
-o, --output стандартный вывод Файл результата; - - стандартный вывод
--no-context Разбор каждого слова без соседних: разборы по частотам словаря, как у analyze, в разы быстрее
-h, --help Показать справку
-V, --version Показать версию

Файлы читаются по очереди, без файлов и вместо - - стандартный ввод; вход - в UTF-8: файл в другой кодировке (cp1251, UTF-16) не разбирается, а отдельная строка с неверными байтами разбирается с U+FFFD вместо них. Значение параметра пишется отдельно или слитно: -f conllu, -fconllu, --format=conllu. В терминал результат выводится после каждого предложения, а в канал и файл - всякий раз, когда команда ждет следующую строку входа: ее можно держать открытой и подавать текст по строке.

В Windows PowerShell 5.1 перенаправление > и конвейер (Get-Content text.txt | rumorph) портят кириллицу: передавайте файл аргументом, а результат пишите параметром -o (в PowerShell 7 работают и они). Текст из echo в cmd приходит в кодировке консоли: перед ним нужна команда chcp 65001. Шаблоны файлов (*.txt) cmd и PowerShell не раскрывают.

Вход

  • text - текст, предложение - строка. Текст делится на токены просто: слова - с дефисами и апострофами между буквами («кто-то», «д’Артаньян»), числа - с точкой или запятой между цифрами («3,14»), остальные знаки - по одному, одинаковые знаки подряд - вместе («...»), эмодзи с модификаторами и флаги - целиком. Пробел нулевой ширины и другие невидимые разделители делят токены, а мягкий перенос и соединитель слов (U+2060) внутри слова - нет. Точка сокращения отделяется: «т.е.» - четыре токена; для точного деления текста подайте готовые токены. Контекстная модель разбирает строку по предложениям - кускам до знака конца предложения (., !, ?, …).
  • tokens - токен в строке, пустая строка разделяет предложения; пробелы по краям и все после табуляции не учитываются, так что подходит и таблица с токеном в первом столбце. Список отдельных слов разбирайте с --no-context: иначе модель примет соседние слова за предложение.
  • conllu - CoNLL-U: заполняются столбцы LEMMA, UPOS и FEATS, а остальные столбцы, комментарии, многословные токены и пустые узлы остаются как есть.
printf '1\tМы\t_\t_\t_\t_\t2\tnsubj\t_\t_\n2\tстали\t_\t_\t_\t_\t0\troot\t_\t_\n' | rumorph -i conllu -f conllu
1   Мы  мы  PRON    _   Case=Nom|Number=Plur|Person=1|PronType=Prs  2   nsubj   _   _
2   стали   стать   VERB    _   Aspect=Perf|Mood=Ind|Number=Plur|Tense=Past|VerbForm=Fin|Voice=Act  0   root    _   _

Форматы вывода

Все форматы, кроме jsonl, берут первый разбор токена - выбранный контекстной моделью по соседним словам (предложение длиннее 256 токенов модель разбирает частями по 256, как analyze_sentence), а с --no-context - самый вероятный по словарю; jsonl пишет все разборы в этом порядке. Токен без разбора получает лемму в нижнем регистре и часть речи X.

lemmas

Леммы через пробел, строка на предложение; пустая строка текста остается пустой.

conllu

CoNLL-U: номер, токен, лемма, часть речи и признаки, SpaceAfter=No у токена, за которым в тексте нет пробела, и комментарии sent_id и text. Текст в text собирается из токенов, как требует CoNLL-U: пробелы между токенами - по одному, без пробелов по краям и невидимых символов, у входа tokens - токены через пробел.

echo "Мы стали друзьями в ковиде." | rumorph -f conllu
# sent_id = 1
# text = Мы стали друзьями в ковиде.
1   Мы  мы  PRON    _   Case=Nom|Number=Plur|Person=1|PronType=Prs  _   _   _   _
2   стали   стать   VERB    _   Aspect=Perf|Mood=Ind|Number=Plur|Tense=Past|VerbForm=Fin|Voice=Act  _   _   _   _
3   друзьями    друг    NOUN    _   Animacy=Anim|Case=Ins|Gender=Masc|Number=Plur   _   _   _   _
4   в   в   ADP _   _   _   _   _   _
5   ковиде  ковид   NOUN    _   Animacy=Inan|Case=Loc|Gender=Masc|Number=Sing   _   _   _   SpaceAfter=No
6   .   .   PUNCT   _   _   _   _   _   _

tsv

Токен, лемма, часть речи, признаки и вероятность разбора через табуляцию, без заголовка; предложения разделяет пустая строка.

echo "Мы стали друзьями." | rumorph -f tsv
Мы  мы  PRON    Case=Nom|Number=Plur|Person=1|PronType=Prs  1
стали   стать   VERB    Aspect=Perf|Mood=Ind|Number=Plur|Tense=Past|VerbForm=Fin|Voice=Act  0.9995066255501905
друзьями    друг    NOUN    Animacy=Anim|Case=Ins|Gender=Masc|Number=Plur   1
.   .   PUNCT   _   1

jsonl

JSON Lines: предложение в строке - текст (если он есть на входе) и токены со всеми разборами: лемма, часть речи, признаки, пометы, вероятность и источник разбора. Ниже - одна строка вывода, отформатированная для чтения, у «стали» - два разбора из шести.

echo "Мы стали" | rumorph -f jsonl
{
  "text": "Мы стали",
  "tokens": [
    {"word": "Мы", "analyses": [
      {"lemma": "мы", "pos": "PRON", "feats": {"Case": "Nom", "Number": "Plur", "Person": "1", "PronType": "Prs"},
       "labels": [], "prob": 1, "source": "dictionary"}
    ]},
    {"word": "стали", "analyses": [
      {"lemma": "стать", "pos": "VERB", "feats": {"Aspect": "Perf", "Mood": "Ind", "Number": "Plur", "Tense": "Past", "VerbForm": "Fin", "Voice": "Act"},
       "labels": ["intr"], "prob": 0.9990479553121936, "source": "dictionary"},
      {"lemma": "сталь", "pos": "NOUN", "feats": {"Animacy": "Inan", "Case": "Nom", "Gender": "Fem", "Number": "Plur"},
       "labels": [], "prob": 0.0006122046393944599, "source": "dictionary"}
    ]}
  ]
}

Коды выхода

Код Когда
0 Успех, в том числе если вывод закрыт раньше конца (rumorph text.txt \| head)
1 Входной файл не найден, не читается или не в UTF-8, строка не в UTF-8 (она разбирается с U+FFFD), неверная строка CoNLL-U; остальные файлы все равно разбираются
1 Словарь не читается, в файле своих слов ошибка (файла нет, он не в UTF-8, неверная строка, слово не изменяется по образцу), файл вывода не создается или совпадает с входным файлом, словарем или файлом слов; ничего не разбирается
1 Ошибка записи; разбор останавливается
2 Неверные параметры

Сообщения об ошибках пишутся в стандартный поток ошибок.