Команда 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 | Неверные параметры |
Сообщения об ошибках пишутся в стандартный поток ошибок.