Морфологические статистики¶
MorphStats(source, words_extractor=None)
Морфологические статистики текста: часть речи и признаки Universal Dependencies каждого слова, посчитанные по значениям или данные по словам. По умолчанию источник данных - объект Doc библиотеки spaCy с частями речи, которые читаются по token.pos_ и token.morph; строку или Doc без них языковая библиотека читает по-своему.
Исключения:
SourceTypeError- источник, который неDoc,analyze, который дает не объектыMorphWord;SourceError- источник без частей речи или без слов.
В ruTS источник данных - текст или Doc с разметкой частей речи или без нее, а статистики вычисляются при создании объекта. SourceTypeError дают источник, который не строка и не Doc, и экстрактор другого типа, а SourceError - только источник без слов.
Класс расширяет MorphStats ядра anyTS русским разбором слов и маркерами форм глагола. Слова строки извлекает русский WordsExtractor или заданный экстрактор, который для Doc применяется к его тексту; без экстрактора слова Doc берутся из его токенов, а части дефисного слова, разрезанного spaCy, склеиваются. Таблицы print_stats и print_markers и сообщения об ошибках - по-русски (MORPHOLOGY_STATS_DESC, MORPHOLOGY_MARKERS_DESC и CORE_MESSAGES из ruts.constants).
from ruts import MorphStats
text = "Постарайтесь получить то, что любите, иначе придется полюбить то, что получили"
ms = MorphStats(text)
ms.print_stats("pos", "tense", "number", "person", filter_none=True)
---------------Часть речи---------------
Глагол | 6
Сочинительный союз | 2
Подчинительный союз | 2
Наречие | 1
-----------------Время------------------
Настоящее | 1
Будущее | 1
Прошедшее | 1
-----------------Число------------------
Множественное | 3
Единственное | 1
------------------Лицо------------------
2 | 1
3 | 1
Параметры¶
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
source |
str / Doc |
- | Источник данных |
words_extractor |
WordsExtractor |
None |
Инструмент для извлечения слов; применяется и к Doc, к его тексту |
Атрибуты¶
| Атрибут | Тип | Описание |
|---|---|---|
words |
tuple[str] |
Слова текста |
tags |
tuple[str] |
Признаки каждого слова в формате CoNLL-U (Case=Nom|Number=Plur), _ у слова без них |
pos |
tuple[str / None] |
Часть речи каждого слова |
animacy, aspect, ..., voice |
tuple[str / None] |
Значение статистики у каждого слова, None у слова без признака |
В ruTS есть и атрибут lemmas (tuple[str]) - леммы слов, которые pymorphy3 дает по части речи слова.
Статистики¶
Статистики - часть речи pos и признаки из таблицы ниже (MORPHOLOGY_FEATURES из ruts.constants). Для объекта Doc с разметкой частей речи значения берутся из token.pos_ и token.morph, то есть с учетом контекста (стали - глагол или существительное). Для строки, Doc без разметки и Doc с заданным экстрактором слов используется первый разбор pymorphy3: граммемы OpenCorpora переводятся в UD по таблицам OPENCORPORA_TO_UD_POS и OPENCORPORA_TO_UD_GRAMMEMES из ruts.constants, а признак, которому pymorphy3 дает два значения сразу (одушевленность слов на -кки), не определен.
| Статистика | Признак | Значения |
|---|---|---|
pos |
Часть речи | NOUN, PROPN, VERB, AUX, ADJ, DET, PRON, NUM, ADV, ADP, CCONJ, SCONJ, PART, INTJ, X |
animacy |
Одушевленность | Anim, Inan |
aspect |
Вид | Perf, Imp |
case |
Падеж | Nom, Gen, Dat, Acc, Ins, Loc, Par, Voc |
degree |
Степень сравнения | Pos, Cmp, Sup |
gender |
Род | Masc, Fem, Neut, Com |
involvement |
Совместность | In, Ex |
mood |
Наклонение | Ind, Imp, Cnd |
number |
Число | Sing, Plur |
person |
Лицо | 1, 2, 3 |
polarity |
Отрицание | Neg |
style_variant |
Краткая форма | Short |
tense |
Время | Past, Pres, Fut |
transitivity |
Переходность | Tran, Intr |
verb_form |
Форма глагола | Fin, Inf, Part, Conv |
voice |
Залог | Act, Pass, Mid |
Значения для строки и для Doc с разметкой могут отличаться: spaCy проставляет Voice=Act личным формам и Voice=Mid возвратным глаголам, выделяет AUX и снимает омонимию по контексту; pymorphy3 определяет залог только у причастий и берет первый разбор.
Часть речи¶
Для строки части речи OpenCorpora переводятся в UD так:
| OpenCorpora | UD | Примечание |
|---|---|---|
NOUN |
NOUN, PROPN |
имена, фамилии, отчества, топонимы и организации по пометам pymorphy3 - PROPN, но только у словоформ с заглавной буквы: pymorphy3 не учитывает регистр и дает помету имени обычным словам (лев, роза, мороз) |
ADJF, ADJS, COMP |
ADJ, DET, PRON, NUM |
местоименные прилагательные (этот, мой, весь) - DET, «который» - PRON, «один» - NUM; компаратив без контекста считается прилагательным |
VERB, INFN, PRTF, PRTS, GRND |
VERB |
форма записывается в verb_form: Fin, Inf, Part, Conv; вспомогательный AUX выделяет только spaCy |
NUMR, NUMB, ROMN |
NUM |
|
ADVB, PRED |
ADV |
предикативы (надо, нельзя) - наречия без времени, как в русских корпусах UD; у бытийных «нет» и «нету», которые UD считает глаголами, - настоящее время |
NPRO |
PRON |
|
PREP |
ADP |
|
CONJ |
CCONJ, SCONJ |
подчинительные союзы по списку SUBORDINATING_CONJUNCTIONS (что, чтобы, если, когда, хотя, потому) |
PRCL |
PART |
|
INTJ |
INTJ |
|
LATN, UNKN |
X |
«Есть» считается формой «быть», а не «кушать».
Степень сравнения, отрицание и краткая форма¶
Для строки эти признаки выводятся по правилам русского UD. Степень есть у прилагательных (кроме местоименных) и наречий: Cmp у сравнительной степени и у «более», «менее», «выше», «ниже», Sup у превосходной («красивейший»), Pos у остальных. Отрицание - у частиц «не», «ни» и ответного «нет» («Нет, не пойду», но не «Денег нет»). Краткая форма - у кратких прилагательных и причастий («рад», «прочитана»), но не у форм на -о вроде «неверно», «нужно», поэтому у строки она встречается реже, чем у Doc модели.
from ruts import MorphStats
ms = MorphStats("Нет, я не рад: книга прочитана быстрее красивейшей сказки")
ms.explain_text("degree", "polarity", "style_variant", filter_none=True)
(('Нет', {'polarity': 'Neg'}),
('я', {}),
('не', {'polarity': 'Neg'}),
('рад', {'degree': 'Pos', 'style_variant': 'Short'}),
('книга', {}),
('прочитана', {'style_variant': 'Short'}),
('быстрее', {'degree': 'Cmp'}),
('красивейшей', {'degree': 'Sup'}),
('сказки', {}))
Переходность и совместность¶
Признаки OpenCorpora, которых в русском UD нет: переходность (Tran, Intr) и совместность (In - говорящий включен в действие, Ex - не включен). Они считаются через pymorphy3 для глаголов (для Doc - по разбору с леммой spaCy) и в строке признаков tags записываются как Subcat и Clusivity.
from ruts import MorphStats
ms = MorphStats("Постарайтесь получить то, что любите")
ms.tags[0]
ms.transitivity, ms.involvement
'Aspect=Perf|Clusivity=Ex|Mood=Imp|Number=Plur|Subcat=Intr|VerbForm=Fin'
(('Intr', 'Tran', None, None, 'Tran'), ('Ex', None, None, None, None))
Формы глагола¶
Доли грамматических форм глагола (слов с частью речи VERB и AUX), каждая от своей базы; доля с пустой базой - nan.
| Маркер | Доля | База |
|---|---|---|
p_indicative, p_imperative, p_conditional |
изъявительного, повелительного и сослагательного наклонения | личные формы |
p_infinitive, p_participle, p_converb |
инфинитивов, причастий и деепричастий | все формы глагола |
p_perfective |
совершенного вида | формы глагола с видом |
p_passive |
страдательных причастий | все формы глагола |
p_reflexive |
возвратных форм на -ся, -сь | все формы глагола |
Сослагательное наклонение определяется по частице «бы» («б»), поэтому экстрактор слов не должен отбрасывать частицы.
from ruts import MorphStats
ms = MorphStats("Если бы я знал, я бы пришел за книгами, прочитанными вчера")
ms.get_markers()
{'p_indicative': 0.0,
'p_imperative': 0.0,
'p_conditional': 1.0,
'p_infinitive': 0.0,
'p_participle': 0.3333333333333333,
'p_converb': 0.0,
'p_perfective': 0.6666666666666666,
'p_passive': 0.3333333333333333,
'p_reflexive': 0.0}
Методы¶
get_stats(*stats, filter_none=False, flat=False) дает количество слов по значениям каждой выбранной статистики, по умолчанию всех, в порядке первых появлений; None считает слова без признака, а filter_none их отбрасывает. С flat ключи - статистика_значение, например pos_NOUN, без слов без признака, как в to_dataframe. Неизвестная статистика дает UnknownStatError, а filter_none или flat, которые не bool, - ParameterError.
explain_text(*stats, filter_none=False) дает каждое слово со значениями выбранных статистик; filter_none отбрасывает те, которых у слова нет. Неизвестная статистика дает UnknownStatError.
print_stats(*stats, filter_none=False) выводит таблицу для каждой выбранной статистики: описания ее значений, начиная с самого частого, с количеством слов. Значение из нескольких соединяет описания своих частей косой чертой. Неизвестная статистика дает UnknownStatError.
from ruts import MorphStats
text = "Постарайтесь получить то, что любите, иначе придется полюбить то, что получили"
ms = MorphStats(text)
ms.get_stats("pos", "tense", "number", "person", filter_none=True)
ms.get_stats("pos", "tense", flat=True)
ms.explain_text("pos", "tense", "number", "person", filter_none=True)
{'pos': {'VERB': 6, 'CCONJ': 2, 'SCONJ': 2, 'ADV': 1},
'tense': {'Pres': 1, 'Fut': 1, 'Past': 1},
'number': {'Plur': 3, 'Sing': 1},
'person': {'2': 1, '3': 1}}
{'pos_VERB': 6,
'pos_CCONJ': 2,
'pos_SCONJ': 2,
'pos_ADV': 1,
'tense_Pres': 1,
'tense_Fut': 1,
'tense_Past': 1}
(('Постарайтесь', {'pos': 'VERB', 'number': 'Plur'}),
('получить', {'pos': 'VERB'}),
('то', {'pos': 'CCONJ'}),
('что', {'pos': 'SCONJ'}),
('любите', {'pos': 'VERB', 'tense': 'Pres', 'number': 'Plur', 'person': '2'}),
('иначе', {'pos': 'ADV'}),
('придется', {'pos': 'VERB', 'tense': 'Fut', 'number': 'Sing', 'person': '3'}),
('полюбить', {'pos': 'VERB'}),
('то', {'pos': 'CCONJ'}),
('что', {'pos': 'SCONJ'}),
('получили', {'pos': 'VERB', 'tense': 'Past', 'number': 'Plur'}))
to_dataframe() возвращает плоские статистики, get_stats(flat=True), таблицей DataFrame библиотеки pandas из одной строки со столбцом на каждый ключ. Статистика-справочник дает столбцы только для ключей, которые есть у текста, поэтому в таблицах нескольких текстов, объединенных pandas.concat, количество, которого у текста нет, - NaN. Нулями можно заполнять только такие столбцы: в остальных NaN - неопределенное значение.
ms.to_dataframe().iloc[:, :4]
pos_VERB pos_CCONJ pos_SCONJ pos_ADV
0 6 2 2 1
get_markers() дает маркеры языка, вычисленные по признакам, - доли грамматических форм, каждая от своей базы, - по именам markers_desc, а print_markers() выводит их с описаниями. Маркеры вычисляет библиотека; по умолчанию их нет.
В ruTS маркеры - доли форм глагола.
from ruts import MorphStats
MorphStats("Если бы я знал, я бы пришел за книгами, прочитанными вчера").print_markers()
Маркер | Значение
----------------------------------------------------------
Изъявительное наклонение среди личных форм | 0.00
Повелительное наклонение среди личных форм | 0.00
Сослагательное наклонение среди личных форм | 1.00
Инфинитив среди форм глагола | 0.00
Причастие среди форм глагола | 0.33
Деепричастие среди форм глагола | 0.00
Совершенный вид среди форм глагола с видом | 0.67
Страдательные причастия среди форм глагола | 0.33
Возвратные формы (-ся, -сь) среди форм глагола | 0.00
Метод describe - из интерфейса статистик ядра anyTS; шкал у морфологических статистик нет, поэтому он для статистик get_stats возвращает None.
MorphWord - слово analyze: его текст word, часть речи pos (None, если она неизвестна) и признаки features - значения признаков Universal Dependencies по их названиям ({"Case": "Nom"}), значение из нескольких - через запятую.
В ruTS MorphWord импортируется и из ruts.morph_stats.