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

Синтаксические статистики

SyntaxStats(source)

Синтаксические статистики текста по его дереву зависимостей (Иванов, Солнышкина и Соловьёв 2018): показатели дерева и синтаксических конструкций. Источник данных - объект Doc библиотеки spaCy с разбором зависимостей и частями речи. Знаки препинания, символы и пробелы узлами дерева не являются, а длины считаются в позициях слов. Единицы L2SCA, предложные цепочки и схожесть предложений вычисляются при первом обращении, поэтому подкласс, в stats_desc которого их нет, не тратит на них время.

Исключения:

  • SourceTypeError - источник, который не Doc;
  • SourceError - источник без разбора зависимостей (отношений и границ предложений), без частей речи, без лемм, если класс их требует, или без слов.

Класс расширяет SyntaxStats ядра anyTS русским слоем. Отношения Universal Dependencies берутся из разбора зависимостей модели spaCy (ru_core_news_sm, ru_core_news_md, ru_core_news_lg), части речи и признаки - из разметки пайплайна: в рекомендуемом конвейере - ruMorph, иначе - модели; качество статистик ограничено качеством разбора. Части дефисного слова, разрезанного spaCy, склеиваются (во-первых - одно слово), а клаузы, причастные обороты, отрицания и расщепленные сказуемые определяются по правилам русского языка из карточек метрик. ruTS добавляет свои метрики цепочек родительных падежей и деепричастных оборотов. Синтаксические маркеры канцелярита - пассив, причастные обороты, цепочки родительных падежей, расщепленные сказуемые и отношение существительных к глаголам. Таблица print_stats и сообщения об ошибках - по-русски (SYNTAX_STATS_DESC и CORE_MESSAGES из ruts.constants).

Иванов, Солнышкина и Соловьёв проверили признаки на корпусе школьных учебников: число сочинительных цепочек, причастных оборотов и модификаторов именной группы коррелирует с классом учебника на уровне 0.88-0.93. Карточки метрик называют исходные признаки работы и их коэффициенты корреляции с классом учебника.

from ruts import SyntaxStats, load_pipeline

nlp = load_pipeline()
text = "Дом, построенный рабочими в прошлом году, был продан. Хлопнув дверью, он ушел и сказал, что не придет."
ss = SyntaxStats(nlp(text))
ss.print_stats()
                       Статистика                        | Значение
--------------------------------------------------------------------
Средняя длина зависимости                                |   2.07
Стандартное отклонение длины зависимости                 |   1.61
Средний максимум длины зависимости в предложении         |   5.00
Доля смежных связей                                      |   0.53
Средняя глубина дерева зависимостей предложения          |   3.50
Листьев на предложение                                   |   4.50
Поддеревьев на предложение                               |   4.00
Среднее число узлов на лист в предложении                |   1.90
Среднее число слов до вершины предложения                |   5.00
Валентность финитных глаголов                            |   1.67
Сочинительных цепочек на предложение                     |   0.50
Средняя длина сочинительной цепочки                      |   2.00
Клауз на предложение                                     |   2.00
Средняя длина клаузы (слов)                              |   4.25
Придаточных клауз на предложение                         |   0.50
Доля предложений с придаточными                          |   0.50
Инфинитивных клауз на предложение                        |   0.00
T-единиц на предложение                                  |   1.00
Средняя длина T-единицы (слов)                           |   8.50
Клауз на T-единицу                                       |   1.50
Доля T-единиц с придаточными                             |   0.50
Глагольных групп на T-единицу                            |   2.50
Сочинённых групп на клаузу                               |   0.33
Сложных именных групп на клаузу                          |   1.00
Модификаторов на именную группу                          |   0.50
Предложных цепочек на предложение                        |   0.00
Максимальная длина предложной цепочки                    |    0
Цепочек родительных падежей на предложение               |   0.00
Максимальная длина цепочки родительных падежей           |    0
Именных цепочек на предложение                           |   0.00
Максимальная длина именной цепочки                       |    0
Причастных оборотов на предложение                       |   0.50
Средняя длина причастного оборота (слов)                 |   5.00
Деепричастных оборотов на предложение                    |   0.50
Средняя длина деепричастного оборота (слов)              |   2.00
Доля пассивных форм среди глаголов                       |   0.33
Доля безагентного пассива                                |   0.50
Инфинитивов на предложение                               |   0.00
Отрицаний на предложение                                 |   0.50
Расщеплённых сказуемых на предложение                    |   0.00
Доля именных подлежащих перед вершиной                   |   1.00
Доля именных дополнений перед вершиной                   |   0.00
Редакционное расстояние частей речи соседних предложений |   0.78
Синтаксическая схожесть соседних предложений             |   0.06
Отношение существительных к глаголам                     |   0.67

Параметры

Параметр Тип По умолчанию Описание
source Doc - Источник данных - объект Doc с разбором зависимостей

Атрибуты

Атрибут Тип Описание
sents tuple[tuple[Token]] Слова каждого предложения, в котором есть слова, на копии Doc без его тензора и пользовательских данных
n_sents, n_words int Количество предложений со словами и количество слов
n_leaves, n_subtrees int Количество слов без зависимых слов и с ними
n_coordination_chains int Количество сочинительных цепочек
n_clauses, n_subordinate_clauses, n_complex_sents int Количество клауз, придаточных клауз и предложений с придаточной
n_infinitive_clauses int Количество инфинитивных клауз
n_t_units, n_complex_t_units int Количество T-единиц и T-единиц с придаточной клаузой
n_l2sca_clauses int Количество клауз L2SCA - без сказуемых с общим подлежащим и инфинитивных клауз
n_verb_phrases, n_coordinate_phrases, n_complex_nominals int Количество глагольных групп, сочиненных групп и сложных именных групп
n_nouns, n_verbs int Количество существительных (NOUN, PROPN) и глагольных форм (VERB)
n_prep_chains int Количество предложных цепочек
n_participle_clauses int Количество причастных оборотов
n_passive, n_agentless_passive int Количество пассивных форм и форм без агенса
n_infinitives, n_negations int Количество инфинитивов и слов отрицания
n_split_predicates, split_predicates int, tuple[str] Количество расщепленных сказуемых и сами сказуемые - глагол и существительное
n_nominal_subjects, n_preverbal_subjects int Количество именных подлежащих и подлежащих перед вершиной
n_nominal_objects, n_preverbal_objects int Количество именных прямых дополнений и дополнений перед вершиной
c_children dict[int, int] Количество слов по числу зависимых слов
c_deps dict[str, int] Количество слов по синтаксическим отношениям

Атрибуты конструкций ruTS - n_genitive_chains, n_nominal_chains и n_converb_clauses (int): количество цепочек родительных падежей, именных цепочек и деепричастных оборотов.

ss.n_clauses, ss.n_nouns, ss.n_verbs
ss.c_children
ss.c_deps
ss.sents[0]
(4, 4, 6)
{0: 9, 1: 2, 2: 5, 3: 1}
{'ROOT': 2,
 'acl': 1,
 'advcl': 1,
 'advmod': 1,
 'amod': 1,
 'aux:pass': 1,
 'case': 1,
 'cc': 1,
 'ccomp': 1,
 'conj': 1,
 'mark': 1,
 'nsubj': 1,
 'nsubj:pass': 1,
 'obj': 1,
 'obl': 1,
 'obl:agent': 1}
(Дом, построенный, рабочими, в, прошлом, году, был, продан)

Метрики

Каждая метрика - атрибут объекта, который вычисляется при его создании (единицы L2SCA, предложные цепочки и схожесть предложений - при первом обращении), а get_stats дает их все. Показатели предложения (наибольшая длина зависимости, глубина, число слов на лист) усредняются по предложениям, конструкции даются на предложение.

Метрика Что измеряет Диапазон Чем больше, тем
mean_dependency_distance Среднее расстояние между словом и его вершиной от 1, nan без зависимостей труднее восприятие
std_dependency_distance Стандартное отклонение длины зависимости от 0, nan без зависимостей неравномернее длины
max_dependency_distance Среднее наибольших длин зависимости предложений, в которых есть зависимости от 1, nan без зависимостей длиннее самые длинные зависимости
p_adjacent_dependencies Доля зависимостей длины 1 0-1, nan без зависимостей больше связей между соседями
tree_depth Средняя глубина дерева предложения от 0 глубже вложенность
leaves_per_sent Листьев на предложение от 0 длиннее или площе предложения
subtrees_per_sent Поддеревьев на предложение от 0 больше групп в предложении
nodes_per_leaf Среднее по предложениям число слов на лист от 1, nan для предложения без листьев длиннее ветви
words_before_root Среднее число слов до вершины предложения от 0, nan без вершины среди слов позже главное сказуемое
verb_valency Среднее число зависимых у финитного глагола от 0, nan без финитных глаголов больше зависимых у глагола
coordination_chains_per_sent Сочинительных цепочек на предложение от 0 больше сочинения
mean_coordination_chain_len Средняя длина сочинительной цепочки в словах от 2, nan без цепочек длиннее перечисления
clauses_per_sent Клауз на предложение от 0 больше клауз в предложении
mean_clause_len Средняя длина клаузы в словах от 1, nan без клауз длиннее клаузы
subordinate_clauses_per_sent Придаточных клауз на предложение от 0 больше подчинения
p_complex_sents Доля предложений с придаточной клаузой 0-1 больше сложных предложений
infinitive_clauses_per_sent Инфинитивных клауз на предложение (хочет уйти, пришел, чтобы помочь), которые не придаточные от 0 больше инфинитивных клауз
t_units_per_sent T-единиц на предложение (T/S) от 0 больше главных клауз в предложении
mean_t_unit_len Средняя длина T-единицы в словах (MLT) от 1, nan без T-единиц длиннее T-единицы
clauses_per_t_unit Клауз на T-единицу (C/T) от 1, nan без T-единиц больше подчинения
p_complex_t_units Доля T-единиц с придаточной клаузой (CT/T) 0-1, nan без T-единиц больше сложных T-единиц
verb_phrases_per_t_unit Глагольных групп на T-единицу (VP/T) от 0, nan без T-единиц больше глагольных групп
coordinate_phrases_per_clause Сочиненных групп на клаузу (CP/C) от 0, nan без клауз больше сочинения групп
complex_nominals_per_clause Сложных именных групп на клаузу (CN/C) от 0, nan без клауз плотнее именные группы
modifiers_per_noun Среднее число модификаторов существительного от 0, nan без существительных тяжелее именные группы
prep_chains_per_sent Цепочек вложенных дополнений с предлогом на предложение от 0 больше вложенных дополнений
max_prep_chain_len Длина самой длинной предложной цепочки 0 или от 2 длиннее цепочки
participle_clauses_per_sent Причастных оборотов на предложение от 0 больше причастных оборотов
mean_participle_clause_len Средняя длина причастного оборота в словах от 1, nan без причастных оборотов длиннее причастные обороты
p_passive Доля пассивных форм среди глагольных форм 0-1, nan без глагольных форм больше пассива
p_agentless_passive Доля форм без агенса среди пассивных 0-1, nan без пассивных форм больше пассива без агенса
infinitives_per_sent Инфинитивов на предложение от 0 больше инфинитивов
negations_per_sent Слов отрицания на предложение от 0 больше отрицания
split_predicates_per_sent Расщепленных сказуемых на предложение от 0 больше расщепленных сказуемых
p_preverbal_subjects Доля именных подлежащих перед вершиной 0-1, nan без именных подлежащих меньше инверсии подлежащих
p_preverbal_objects Доля именных прямых дополнений перед вершиной 0-1, nan без именных дополнений больше дополнений, вынесенных вперед
pos_edit_distance Среднее редакционное расстояние частей речи соседних предложений, деленное на длину более длинного 0-1, nan для одного предложения менее схожи предложения
syntax_similarity Средняя схожесть троек зависимостей соседних предложений 0-1, nan для одного предложения более схожи предложения
noun_verb_ratio Отношение существительных к глагольным формам от 0, nan без глагольных форм номинативнее стиль

Метрики конструкций ruTS:

Метрика Что измеряет Диапазон Чем больше, тем
genitive_chains_per_sent Цепочек родительных падежей на предложение от 0 больше цепочек
max_genitive_chain_len Наибольшая длина цепочки родительных падежей в тексте 0 без цепочек, иначе от 2 длиннее цепочка
nominal_chains_per_sent Именных цепочек (родительные и предложные звенья) на предложение от 0 больше цепочек
max_nominal_chain_len Наибольшая длина именной цепочки в тексте 0 без цепочек, иначе от 2 длиннее цепочка
converb_clauses_per_sent Деепричастных оборотов на предложение от 0 больше деепричастных оборотов
mean_converb_clause_len Средняя длина деепричастного оборота в словах от 2, nan без деепричастных оборотов длиннее деепричастные обороты

Длина зависимости

mean_dependency_distance · std_dependency_distance · max_dependency_distance · p_adjacent_dependencies

calc_dependency_distances(tokens, join_hyphens=False)

Длины зависимостей (Liu 2008): расстояние между словом и его вершиной в позициях слов без учета знаков препинания, в порядке слов. Вершина предложения и слово, вершина которого лежит вне последовательности, пропускаются.

Параметр Тип По умолчанию Описание
tokens Doc / Span / list[Token] - Последовательность токенов
join_hyphens bool False Считать дефисное слово одной позицией

Средняя длина зависимости растет с длиной предложения, а наибольшая - лучший из древесных признаков на уровне отдельного предложения. Предложения из одного слова в метрики длин не входят.

from ruts import load_pipeline
from ruts.syntax_stats import calc_dependency_distances

nlp = load_pipeline()
doc = nlp("Повышение эффективности использования ресурсов предприятия обсуждалось на совещании.")
calc_dependency_distances(doc)
[5, 1, 1, 1, 1, 1, 2]

Глубина дерева

tree_depth

calc_tree_depth(tokens, join_hyphens=False)

Глубина дерева зависимостей: самый длинный путь от вершины предложения до листа в связях между словами; для нескольких предложений - максимум, для предложения из одного слова - 0. С join_hyphens дефисное слово - одно слово, а слова, которые висят на любой из его частей, - на уровень ниже него.

Параметр Тип По умолчанию Описание
tokens Doc / Span / list[Token] - Последовательность токенов
join_hyphens bool False Считать дефисное слово одним словом

Глубина - признак LONGEST_PATH работы Иванова и др. (r = 0.84).

Листья и поддеревья

leaves_per_sent · subtrees_per_sent · nodes_per_leaf

Лист - слово без зависимых слов (count_children), поддерево - слово с ними. Число узлов на лист - количество слов предложения, деленное на количество его листьев, в среднем по \(S\) предложениям.

\[ \frac{1}{S} \sum_{s=1}^{S} \frac{\textrm{Количество слов } s}{\textrm{Количество листьев } s} \]

Признаки работы: LEAVES_NUMBER (r = 0.84), PATH_NUMBER (r = 0.87) и AVERAGE_PATH (r = 0.84). Распределение слов по числу зависимых - профиль ветвления - дает атрибут c_children.

Слова до вершины предложения

words_before_root · Coh-Metrix

Левая вложенность Coh-Metrix (SYNLE): число слов предложения до его вершины - главного сказуемого, в среднем по предложениям, вершина которых - слово. Вершина предложения со связкой - его именная часть (она была врачом), как в Universal Dependencies. В языке со свободным порядком слов мера говорит о порядке не меньше, чем о сложности.

Валентность финитных глаголов

verb_valency

calc_valency(token, join_hyphens=False)

Валентность токена: число его зависимых слов без связей cc, conj, parataxis и punct (anyts.constants.VALENCY_IGNORED_DEPS); с join_hyphens=True дефисное зависимое считается один раз, поэтому у пришел в Кто-то пришел одно зависимое, а не два.

Параметр Тип По умолчанию Описание
token Token - Токен
join_hyphens bool False Считать дефисное слово одним словом

Финитный глагол - is_finite_verb; валентность - признак VERBS_DEP работы (r = 0.43).

Сочинительные цепочки

coordination_chains_per_sent · mean_coordination_chain_len

calc_coordination_chains(tokens, join_hyphens=False)

Длины сочинительных цепочек в порядке их первых слов. Цепочка - группа слов, связанных conj, к какому бы слову ни присоединялся каждый однородный член: Universal Dependencies вешает каждый однородный член на первый (груши → яблоки, сливы → яблоки), ClearNLP - на предыдущий (груши → яблоки, сливы → груши); в обоих случаях яблоки, груши и сливы - одна цепочка из трех слов. Вложенное сочинение (кошки и собаки, или птицы) и перечисление, разбитое между несколькими вершинами, - тоже одна цепочка. Длина цепочки - число ее слов; однородный член, вершина которого лежит вне последовательности, с ней не связывается. С join_hyphens дефисное слово - один однородный член, связанный отношением conj любой своей части (членом совета и вице-губернатором - цепочка из двух слов).

Параметр Тип По умолчанию Описание
tokens Doc / Span / list[Token] - Последовательность токенов
join_hyphens bool False Считать дефисное слово одним словом

Число цепочек на предложение (SOCHIN_NUMBER, r = 0.93) и их средняя длина (AVERAGE_SOCHIN_LENGTH, r = 0.87) - сильнейшие синтаксические предикторы сложности учебника.

Клаузы

clauses_per_sent · mean_clause_len

is_clause_head(token)

Проверяет, возглавляет ли слово клаузу: вершина предложения или слово со связью ccomp, advcl, acl, csubj, parataxis и их подтипами (anyts.constants.CLAUSE_DEPS), кроме полных причастий, деепричастий и инфинитивов при существительном («желание уйти»): причастные и деепричастные обороты считаются отдельно, а краткое причастие («дом построен») - сказуемое своей клаузы. Со связью xcomp клаузу возглавляет только инфинитив is_infinitive_clause: личная форма со связью xcomp у русских моделей - ошибка разбора. Инфинитив-подлежащее (csubj) модального слова («нужно уйти», «можно войти», «следует отметить») своей клаузы не образует. Вставная конструкция (parataxis) и однородное сказуемое (связь conj от вершины клаузы) образуют свою клаузу, только если могут быть сказуемым (is_predicate): «Он сказал: „Уходи“» и «думала, что он умен» - клаузы, а вводные слова «например», «конечно», «во-первых», на которые модели spaCy тоже вешают parataxis, - нет.

is_infinitive_clause(token)

Проверяет, возглавляет ли инфинитив со связью xcomp свою клаузу («хочет уйти», «попросил его уйти»): не возглавляет, если образует одну предикацию со своей вершиной (is_infinitive_periphrasis) или стоит в обороте («решивший уйти», «желая уйти»).

is_infinitive_periphrasis(token)

Проверяет, образует ли инфинитив одну предикацию со своей вершиной: модальным или фазовым глаголом или модальным словом из INFINITIVE_PERIPHRASES («может уйти», «должен прийти», «начал читать», «взялся читать», «перестал курить», «пришлось уйти», «стоит отметить», «нужно уйти», «можно войти», «невозможно описать», «пора идти»), краткой формой модального прилагательного из MODAL_SHORT_ADJECTIVES («готов уйти», «рад помочь») или побудительным «давай», «давайте» из HORTATIVE_WORDS без отрицания («давайте играть», но не «не давайте детям играть»).

Параметр Тип По умолчанию Описание
token Token - Токен

Придаточные клаузы

subordinate_clauses_per_sent · p_complex_sents

is_subordinate_clause_head(token)

Проверяет, возглавляет ли слово придаточную клаузу: вершина клаузы (is_clause_head), сказуемое которой не инфинитив, со связью ccomp, advcl, acl, csubj и их подтипами, однородное сказуемое придаточной клаузы, а также клауза conj или parataxis с подчинительным союзом (is_subordinating_mark: «ушел, ибо устал») и однородные ей со своим подлежащим: модели вешают такое придаточное на главное как однородное, а на него - сказуемые главного с общим подлежащим, которые придаточными не считаются. Инфинитив возглавляет инфинитивную клаузу, а не придаточную.

Параметр Тип По умолчанию Описание
token Token - Токен
is_subordinating_mark(token)

Проверяет, подчинительный ли союз (связь mark) при однородном или вставной конструкции: союз из SUBORDINATING_MARKS со словами составного союза («потому что», «так как») или «как» в «после того как», «перед тем как», «с тех пор как», «в то время как». Не подчинительные - союз после «не то» и «всё равно» («не то что», «не то чтоб»), союз при сказуемом, у которого после него есть соотносительное «то» не из вложенного «если..., то» («когда пришел, то...»: модель потеряла придаточное), и «что», «чем» в роли местоимения или частицы: «что ж», «что ль», «что за», «что называется» и в начале реплики, которая кончается вопросом или восклицанием («А что вы сделаете?», «Любопытно стало: что это сделалось?»).

Параметр Тип По умолчанию Описание
token Token - Токен

Признаки работы: PODCHIN_RATE (r = 0.64) - придаточные клаузы на предложение, PODCHIN_NUMBER (r = 0.62) - доля предложений хотя бы с одной придаточной.

Инфинитивные клаузы

infinitive_clauses_per_sent

is_infinitive_clause_head(token)

Проверяет, возглавляет ли слово инфинитивную клаузу: инфинитив со связью xcomp, который образует свою клаузу (is_infinitive_clause: «хочет уйти», «попросил его уйти»), инфинитив-вершина клаузы со связью ccomp, advcl, acl или csubj («пришел, чтобы помочь», «трудно сказать»), а также однородный ему инфинитив. Такая клауза считается отдельно от придаточных, так как грамматики многих языков считают ее частью простого предложения.

Параметр Тип По умолчанию Описание
token Token - Токен
from ruts import load_pipeline
from ruts.syntax_stats import is_clause_head, is_infinitive_clause_head, is_subordinate_clause_head

nlp = load_pipeline()
doc = nlp("Он хочет уйти, но может остаться, если его попросят.")
[token.text for token in doc if is_clause_head(token)]
[token.text for token in doc if is_subordinate_clause_head(token)]
[token.text for token in doc if is_infinitive_clause_head(token)]
['хочет', 'уйти', 'может', 'попросят']
['попросят']
['уйти']

Единицы L2SCA

t_units_per_sent · mean_t_unit_len · clauses_per_t_unit · p_complex_t_units · verb_phrases_per_t_unit · coordinate_phrases_per_clause · complex_nominals_per_clause · Lu 2010

Индексы L2 Syntactic Complexity Analyzer (L2SCA), которых нет среди других метрик, по разметке Universal Dependencies. MLC и C/S - это mean_clause_len и clauses_per_sent; MLS и DC/C получаются из счетчиков: n_words / n_sents и n_subordinate_clauses / n_clauses.

  • T-единица - главная клауза с зависящими от нее клаузами: вершина предложения и каждая вершина клаузы, присоединенная к ней через conj или parataxis (anyts.constants.MAIN_CLAUSE_DEPS), поэтому в я пришел, а он ушел их две; однородный член придаточной клаузы T-единицей не является. Однородный член без собственного подлежащего (я пришел и ушел) - сказуемое, которое делит T-единицу с клаузой, с которой оно сочинено, как в L2SCA, если только его лицо, число или род - его вспомогательного глагола или связки, а без них собственные - не отличаются от лица, числа или рода этой клаузы: в языке, опускающем подлежащее, окончание называет другое подлежащее (llegamos al puerto y nos esperabas). Экзистенциальное there (expl ClearNLP) - подлежащее. Однородный член или вставная конструкция с подчинительным союзом (is_subordinating_mark) возглавляет придаточную или инфинитивную клаузу, которая T-единицей не является, как и клауза под ней. Личный однородный член со своим подлежащим при инфинитивной клаузе - сказуемое, которое модель повесила на инфинитив, - присоединяется к клаузе первого слова над инфинитивами, которое само не инфинитив (he came to help and she stayed: две T-единицы). T-единица сложная, если в ней есть придаточная клауза (is_subordinate_clause_head), для которой она - ближайшая T-единица сверху.
  • Глагольная группа - сказуемое (is_predicate), которое не является вспомогательным глаголом или связкой: глагол, вспомогательный глагол в роли сказуемого (there is trouble), слово с подлежащим или со связкой; инфинитив, который образует одно сказуемое со своей вершиной (is_infinitive_periphrasis), и однородный ему инфинитив входят в глагольную группу вершины. Причастие или другая неличная форма со связью amod или acl либо однородная ей, без вспомогательного глагола, связки и собственного подлежащего, - определение своего существительного (дом, построенный рабочими), как в L2SCA, а не глагольная группа.
  • Сочиненная группа - сочинение с однородным членом, который не является вершиной клаузы (мужчина и женщина, был большим и красивым) или является сказуемым без собственного подлежащего (пришел и ушел); она считается один раз, по первому однородному члену, а сочинение клауз с собственными подлежащими считается клаузами.
  • Клаузы C/T, CP/C и CN/C - клаузы L2SCA (n_l2sca_clauses): клаузы is_clause_head без сказуемых с общим подлежащим (пришел и ушел) и без инфинитивных клауз, поскольку L2SCA считает финитные клаузы с подлежащим. Вершина предложения - вершина клаузы и T-единицы и без сказуемого (Да., заголовок, имя говорящего), как фрагмент в L2SCA. C/S и MLC считаются по клаузам других метрик, поэтому C/S выше, а MLC ниже, чем в L2SCA.
  • Сложная именная группа - существительное с модификатором из anyts.constants.COMPLEX_NOMINAL_DEPS (прилагательным, дополнением, определительной придаточной клаузой или причастным оборотом, приложением, притяжательным словом) или именная клауза - вершина клаузы из anyts.constants.NOMINAL_CLAUSE_DEPS или однородный ей член.
\[ \textrm{MLT} = \frac{\textrm{Слова}}{\textrm{T-единицы}}, \quad \textrm{C/T} = \frac{\textrm{Клаузы L2SCA}}{\textrm{T-единицы}}, \quad \textrm{CT/T} = \frac{\textrm{Сложные T-единицы}}{\textrm{T-единицы}}, \quad \textrm{CN/C} = \frac{\textrm{Сложные именные группы}}{\textrm{Клаузы L2SCA}} \]

Модификаторы существительного

modifiers_per_noun

count_noun_modifiers(token, join_hyphens=False)

Считает модификаторы именной группы: зависимые со связями amod, det, nmod, nummod, acl и их подтипами (anyts.constants.NOUN_MODIFIER_DEPS); conj и appos модификаторами не являются.

Параметр Тип По умолчанию Описание
token Token - Токен
join_hyphens bool False Считать дефисное слово одним словом

Число модификаторов - признак NOUNS_DEP работы (r = 0.88).

Предложные цепочки

prep_chains_per_sent · max_prep_chain_len · Profiling-UD

Предложная цепочка - два и более вложенных дополнения с предлогом, каждое из которых висит на предыдущем: на коврике в доме у мэра (длина 3). Звенья - слова крючка is_prep_complement, а цепочки и их длины - те же, что у calc_modifier_chains; цепочка может начинаться с дополнения глагола (obl) или с предложного сказуемого со связкой (был в доме у мэра), но не с однородного члена дополнения (в Мадриде и в доме у моря), а сказуемое определительной придаточной клаузы (дом, который был у реки) звеном цепочки своего существительного не является. Цепочки читают только Universal Dependencies: ClearNLP делает вершиной группы предлог (prep, pobj), поэтому его разборы цепочек не дают.

Цепочки родительных падежей ruTS (genitive_chains_per_sent) считаются отдельно: их звенья - беспредложные определения в родительном падеже («повышение эффективности использования ресурсов»), а звенья предложной цепочки - дополнения с предлогом.

Цепочки родительных падежей

genitive_chains_per_sent · max_genitive_chain_len

calc_genitive_chains(tokens)

Длины цепочек родительных падежей в порядке слов - цепочек calc_modifier_chains, модификаторы которых - беспредложные определения в родительном падеже: «повышение эффективности использования ресурсов» - цепочка длины 3.

is_genitive_modifier(token)

Проверяет, является ли слово беспредложным определением в родительном падеже: слово со связью nmod в родительном падеже без зависимого предлога (case) - «дом отца», но не «дом у дороги».

Параметр Тип По умолчанию Описание
tokens Doc / Span / list[Token] - Последовательность токенов (calc_genitive_chains)
token Token - Токен (is_genitive_modifier)
from ruts import load_pipeline
from ruts.syntax_stats import calc_genitive_chains

nlp = load_pipeline()
calc_genitive_chains(
    nlp("Повышение эффективности использования ресурсов предприятия обсуждалось на совещании.")
)
[4]

Именные цепочки

nominal_chains_per_sent · max_nominal_chain_len

calc_nominal_chains(tokens)

Длины именных цепочек в порядке слов - цепочек calc_modifier_chains, звенья которых - определения в родительном падеже и дополнения с предлогом в любом порядке: «рост цен на нефть» - цепочка длины 2, «о повышении эффективности работы отдела» - длины 4. Предложная группа - сама звено, как у предложных цепочек, поэтому та же группа при глаголе дает цепочку длиннее, чем в роли подлежащего: «сидел во втором ряду кресел» - длина 2, «второй ряд кресел пустовал» - цепочки нет. Цепочки родительных падежей и предложные цепочки - частные случаи именной: на TextsByGrade больше двух третей именных цепочек смешанные (68 %), почти половина (46 %) не содержит ни одной из них, а с классом текста именные цепочки связаны сильнее (ρ = 0.76 против 0.65 и 0.63).

is_nominal_chain_link(token)

Проверяет, является ли слово звеном именной цепочки: беспредложным определением в родительном падеже (is_genitive_modifier) или дополнением с предлогом (is_prep_complement).

Параметр Тип По умолчанию Описание
tokens Doc / Span / list[Token] - Последовательность токенов (calc_nominal_chains)
token Token - Токен (is_nominal_chain_link)
from ruts import load_pipeline
from ruts.syntax_stats import calc_nominal_chains

nlp = load_pipeline()
calc_nominal_chains(
    nlp(
        "Рост цен на нефть замедлился, и о повышении эффективности работы отдела больше не говорили."
    )
)
[2, 4]

Причастные обороты

participle_clauses_per_sent · mean_participle_clause_len

Обороты, которые возглавляют слова крючка is_participle_clause; длина оборота - число слов в поддереве его вершины (subtree_len).

is_participle_clause(token)

Проверяет, возглавляет ли слово причастный оборот: полное причастие (is_participle) хотя бы с одним зависимым словом, не считая сочинительных и вставных связей. Краткие причастия («дом построен») - сказуемые, а не определения, и оборотов не образуют. Признаки работы - PRICH_RATE (r = 0.91) и PRICH_V.

Параметр Тип По умолчанию Описание
token Token - Токен

Деепричастные обороты

converb_clauses_per_sent · mean_converb_clause_len

is_converb_clause(token)

Проверяет, возглавляет ли слово деепричастный оборот: деепричастие (is_converb) хотя бы с одним зависимым словом, не считая сочинительных и вставных связей. Длина оборота - число слов в поддереве деепричастия (subtree_len). Признаки работы - DEEPRICH_RATE (r = 0.44) и DEEPRICH_V.

Параметр Тип По умолчанию Описание
token Token - Токен

Пассив

p_passive · p_agentless_passive

is_passive(token, join_hyphens=False)

Проверяет, является ли слово пассивной глагольной формой: глаголом с Voice=Pass или с зависимым nsubj:pass, csubj:pass, aux:pass либо nsubjpass, csubjpass, auxpass ClearNLP (PASSIVE_DEPS).

Параметр Тип По умолчанию Описание
token Token - Токен
join_hyphens bool False Считать дефисное слово одним словом

Значение, которое не Token, дает SourceTypeError.

has_agent(token, join_hyphens=False)

Проверяет, есть ли у слова агенс: зависимое obl:agent или agent ClearNLP (AGENT_DEPS). Аргументы и ошибка - те же, что у is_passive.

is_agentless(token, join_hyphens=False)

Проверяет, является ли слово пассивной формой (is_passive) без агенса (has_agent), с теми же аргументами и ошибкой.

В русском языке пассив - страдательные причастия и возвратный пассив («обсуждалось»), форма без агенса - «дом построен», но не «дом построен рабочими».

Инфинитивы, отрицания и расщепленные сказуемые

infinitives_per_sent · negations_per_sent · split_predicates_per_sent

Инфинитивы (is_infinitive из anyts.utils), слова отрицания крючка is_negation и расщепленные сказуемые крючка find_split_predicates на предложение.

is_negation(token)

Проверяет, является ли слово отрицательной частицей - частицей (PART) с признаком Polarity=Neg или частицей «не», «ни» (NEGATION_PARTICLES); союз «ни» в конструкции «ни… ни» отрицанием не считается. Отрицания - признак NEG работы (r = 0.70).

find_split_predicates(tokens)
is_light_verb(token)
is_reflexive(token)
is_split_predicate_noun(token, verb=None)

Расщепленные сказуемые - маркер канцелярита - пары глагола и существительного в порядке слов: легкий глагол (is_light_verb) с леммой из LIGHT_VERBS (например: осуществлять, производить, проводить, вести, обеспечивать, оказывать, принимать, иметь и их возвратный пассив проводиться, приниматься, вестись) с именной частью (is_split_predicate_noun) - существительным с отглагольной леммой (ruts.utils.is_verbal_noun) или леммой из SPLIT_PREDICATE_NOUNS (например: роль, работа, помощь, мера) при глаголе своего оборота verb (оказать помощь, принять меры, но не получить работу): осуществлять проверку, оказать помощь, принято решение, проверка проводится. У глагола берется не больше одной именной части в порядке предпочтения obj, nsubj:pass, nsubj (только у возвратного или пассивного глагола, is_reflexive), iobj, nmod, obl; предложные обстоятельства и агенс пассива (obl:agent, творительный obl) не учитываются. Лемма глагола берется из разбора ruMorph дважды: с частью речи токена (get_lemma) и как глагола (ruts.utils.lemmatize).

Параметр Тип По умолчанию Описание
token Token - Токен
tokens Doc / Span / list[Token] - Последовательность токенов (find_split_predicates)
verb Token None Легкий глагол (is_split_predicate_noun); без него оборот не проверяется
from ruts import load_pipeline
from ruts.syntax_stats import find_split_predicates, is_negation

nlp = load_pipeline()
doc = nlp("Проверка проводится ежегодно, но решение не принято.")
find_split_predicates(doc)
[token.text for token in doc if is_negation(token)]
[(проводится, Проверка), (принято, решение)]
['не']

Порядок подлежащих и дополнений

p_preverbal_subjects · p_preverbal_objects · Profiling-UD

Порядок подлежащих и прямых дополнений по образцу Profiling-UD: доли тех из них, что стоят перед своей вершиной - сказуемым. Учитываются только именные (NOUN, PROPN): место местоимения, например клитики-дополнения, задает грамматика. Подлежащее - слово со связью nsubj (anyts.constants.NOMINAL_SUBJECT_DEPS), дополнение - со связью obj (anyts.constants.OBJECT_DEPS), вместе с отношениями ClearNLP и подтипами.

\[ \frac{\textrm{Именные подлежащие перед вершиной}}{\textrm{Именные подлежащие}}, \quad \frac{\textrm{Именные дополнения перед вершиной}}{\textrm{Именные дополнения}} \]

Схожесть соседних предложений

pos_edit_distance · syntax_similarity · Coh-Metrix

Насколько схожи структуры двух соседних предложений, в среднем по \(S - 1\) парам. pos_edit_distance - редакционное расстояние частей речи \(P_s\) слов предложений (SYNMEDpos Coh-Metrix), деленное на длину \(n\) более длинного предложения пары, calc_edit_distance. syntax_similarity - схожесть мультимножеств троек зависимостей \(T\) двух предложений (dependency_triples, calc_multiset_similarity) по образцу SYNSTRUT Coh-Metrix, который сравнивает узлы деревьев составляющих. Редакционное расстояние читает только порядок частей речи: предложение с дополнением в начале и предложение с подлежащим в начале схожи, если этот порядок у них один (расстояние 0). Тройки порядка слов не читают вовсе: любой порядок слов одного дерева дает схожесть 1. Порядок подлежащего и дополнения читают p_preverbal_subjects и p_preverbal_objects. Схожесть троек растет с длиной предложений.

\[ \frac{1}{S - 1} \sum_{s=1}^{S-1} \frac{\textrm{lev}(P_s, P_{s+1})}{\max(n_s, n_{s+1})}, \quad \frac{1}{S - 1} \sum_{s=1}^{S-1} \frac{|T_s \cap T_{s+1}|}{|T_s \cup T_{s+1}|} \]

Отношение существительных к глаголам

noun_verb_ratio

Количество существительных n_nouns, деленное на количество глагольных форм n_verbs.

\[ \frac{\textrm{Количество существительных}}{\textrm{Количество глагольных форм}} \]

Методы

Методы get_stats, to_dataframe, print_stats и describe - из интерфейса статистик ядра anyTS; шкал у синтаксических статистик нет, поэтому describe для статистик get_stats возвращает None.

ss.get_stats()
{'mean_dependency_distance': 2.066666666666667,
 'std_dependency_distance': 1.6110727964792764,
 'max_dependency_distance': 5.0,
 'p_adjacent_dependencies': 0.5333333333333333,
 'tree_depth': 3.5,
 'leaves_per_sent': 4.5,
 'subtrees_per_sent': 4.0,
 'nodes_per_leaf': 1.9,
 'words_before_root': 5.0,
 'verb_valency': 1.6666666666666667,
 'coordination_chains_per_sent': 0.5,
 'mean_coordination_chain_len': 2.0,
 'clauses_per_sent': 2.0,
 'mean_clause_len': 4.25,
 'subordinate_clauses_per_sent': 0.5,
 'p_complex_sents': 0.5,
 'infinitive_clauses_per_sent': 0.0,
 't_units_per_sent': 1.0,
 'mean_t_unit_len': 8.5,
 'clauses_per_t_unit': 1.5,
 'p_complex_t_units': 0.5,
 'verb_phrases_per_t_unit': 2.5,
 'coordinate_phrases_per_clause': 0.3333333333333333,
 'complex_nominals_per_clause': 1.0,
 'modifiers_per_noun': 0.5,
 'prep_chains_per_sent': 0.0,
 'max_prep_chain_len': 0,
 'genitive_chains_per_sent': 0.0,
 'max_genitive_chain_len': 0,
 'nominal_chains_per_sent': 0.0,
 'max_nominal_chain_len': 0,
 'participle_clauses_per_sent': 0.5,
 'mean_participle_clause_len': 5.0,
 'converb_clauses_per_sent': 0.5,
 'mean_converb_clause_len': 2.0,
 'p_passive': 0.3333333333333333,
 'p_agentless_passive': 0.5,
 'infinitives_per_sent': 0.0,
 'negations_per_sent': 0.5,
 'split_predicates_per_sent': 0.0,
 'p_preverbal_subjects': 1.0,
 'p_preverbal_objects': 0.0,
 'pos_edit_distance': 0.7777777777777778,
 'syntax_similarity': 0.0625,
 'noun_verb_ratio': 0.6666666666666666}

Функции работают с токенами spaCy: функции calc_*, find_* и dependency_triples принимают последовательность токенов (Doc, Span или список), функции is_* и count_* - отдельный токен, а calc_edit_distance и calc_multiset_similarity - списки элементов предложений; слова последовательности - токены is_word. Функции дерева зависимостей взяты из ядра, функции русских конструкций - собственные функции ruTS. Подтипы отношений (acl:relcl, nsubj:pass, nummod:gov) учитываются по базовому отношению (base_dep) там, где это указано.

Слова последовательности

get_words(tokens, join_hyphens=False)

Слова последовательности токенов в их порядке; с join_hyphens=True слово, разрезанное токенизатором по дефисам, - одно слово, представленное частью, которая держит его связь, как у зависимых get_children (губернатор в Он вице-губернатор), или первой частью, если связь держит дефис.

Параметр Тип По умолчанию Описание
tokens Doc / Span / list[Token] - Последовательность токенов
join_hyphens bool False Считать дефисное слово одним словом

Дефисные слова

Токенизатор может разрезать слово по дефисам (во-первых на во, -, первых), и тогда парсер вешает каждую часть на свою вершину. С join_hyphens=True функции дерева считают одним словом вместе с дефисами слово, части которого склеивает anyts.utils.joins_previous. У слова, которое держит вершину предложения, вершины нет; вершина другого слова - вершина его части, которая висит вне слова и ближе всех к корню (при равенстве - слова, а не дефиса). Зависимые слова - слова, чья часть, висящая вне слова, висит на одном из его токенов; каждое представлено этой частью (или своей первой частью, если наружу висит дефис). Поддерево слова - само слово и слова, которые висят на нем прямо или через знаки препинания. Так у каждого слова одна зависимость, и зависит оно от одного слова.

SyntaxStats и функции русских конструкций всегда склеивают дефисные слова. Функции ядра, в том числе is_predicate, count_noun_modifiers, is_passive, has_agent и is_agentless, по умолчанию принимают join_hyphens=False: значения SyntaxStats они дают с join_hyphens=True.

Вершина предложения

is_root(token)

Проверяет, является ли токен вершиной своего предложения: его вершина - он сам.

Параметр Тип По умолчанию Описание
token Token - Токен

Базовое отношение

base_dep(token)

Отношение токена без подтипа, который Universal Dependencies отделяет двоеточием: nsubj:pass дает nsubj, expl:pass - expl.

Параметр Тип По умолчанию Описание
token Token - Токен

Зависимые слова

get_children(token, join_hyphens=False)

Зависимые слова токена без знаков препинания и пробелов; с join_hyphens=True - зависимые всего дефисного слова, к которому относится токен.

Параметр Тип По умолчанию Описание
token Token - Токен
join_hyphens bool False Считать дефисное слово одним словом
count_children(token, join_hyphens=False)

Количество зависимых слов токена; аргументы - те же, что у get_children.

subtree_len(token, join_hyphens=False)

Количество слов в поддереве токена: сам токен и все его прямые и косвенные зависимые; аргументы - те же, что у get_children.

Формы глагола

is_finite_verb(token)

Проверяет, является ли токен финитным глаголом: часть речи VERB с VerbForm=Fin, поэтому финитный вспомогательный глагол (AUX) им не является.

Параметр Тип По умолчанию Описание
token Token - Токен
is_infinitive(token)

Проверяет, является ли токен инфинитивом: VerbForm=Inf при любой части речи.

Параметр Тип По умолчанию Описание
token Token - Токен
is_participle(token)
is_converb(token)

is_participle проверяет, является ли токен полным причастием (VerbForm=Part без Variant=Short и StyleVariant=Short), is_converb - деепричастием (VerbForm=Conv); аргумент - тот же токен.

Сказуемое клаузы

is_predicate(token, join_hyphens=False)

Проверяет, может ли слово быть сказуемым своей клаузы: глагол (VERB, AUX), слово с собственным подлежащим (nsubj, csubj и их подтипы, anyts.constants.SUBJECT_DEPS) или со связкой (cop), поэтому именное сказуемое в он высок и в языке, опускающем подлежащее, проходит, а вводное слово - нет.

Параметр Тип По умолчанию Описание
token Token - Токен
join_hyphens bool False Считать дефисное слово одним словом

Значение, которое не Token, дает SourceTypeError.

Цепочки модификаторов

calc_modifier_chains(tokens, is_modifier, join_hyphens=False)

Длины цепочек вложенных модификаторов в порядке слов. Цепочка - два и более модификатора, каждый из которых висит на предыдущем, как дополнения в повышение эффективности использования ресурсов (длина 3); что считать модификатором (дополнение с предлогом, существительное в родительном падеже), решает проверка языка is_modifier. Цепочка начинается с модификатора, вершина которого модификатором не является, а ее длина - число модификаторов в самой длинной ветви. Связи - те же, что у get_children: знак препинания связью не является, а с join_hyphens дефисное слово - одно звено.

Параметр Тип По умолчанию Описание
tokens Doc / Span / list[Token] - Последовательность токенов
is_modifier Callable[[Token], bool] - Является ли слово модификатором цепочки
join_hyphens bool False Считать дефисное слово одним словом

Проверка, которую нельзя вызвать, дает SourceTypeError.

Дополнения с предлогом

is_prep_complement(token, join_hyphens=False)

Проверяет, является ли слово дополнением с предлогом: слово со связью nmod или obl либо их подтипом (anyts.constants.PREP_COMPLEMENT_DEPS) или сказуемое со связкой или собственным подлежащим вне определительной придаточной клаузы (acl), например именное сказуемое языка без связки в настоящем времени, у которого есть зависимое со связью case - предлог (ADP) или первое слово составного предлога (fixed: в течение). Существительное в падеже без предлога и притяжательный показатель дополнениями с предлогом не являются.

Параметр Тип По умолчанию Описание
token Token - Токен
join_hyphens bool False Считать дефисное слово одним словом

Значение, которое не Token, дает SourceTypeError.

Тройки зависимостей

dependency_triples(tokens, join_hyphens=False)

Тройки зависимостей слов предложения (get_words) в их порядке: часть речи вершины слова - ближайшего слова над ним через знаки препинания, - его отношение без подтипа (base_dep) и его собственная часть речи, например ("NOUN", "amod", "ADJ") для красный дом. Вершина предложения и слово, над которым нет слова, дают пустую вершину и отношение root, какой бы ни была их метка.

Параметр Тип По умолчанию Описание
tokens Doc / Span / list[Token] - Последовательность токенов
join_hyphens bool False Считать дефисное слово одним словом

Токены, которые не Doc, не Span и не список объектов Token, дают SourceTypeError.

Редакционное расстояние и схожесть мультимножеств

calc_edit_distance(sents)

Среднее редакционное расстояние элементов соседних предложений: расстояние Левенштейна каждых двух - наименьшее число вставок, удалений и замен, которые превращают одно в другое, - деленное на число элементов более длинного, 0 для одинаковых последовательностей и 1 для последовательностей без общих элементов; nan, если предложений меньше двух.

Параметр Тип По умолчанию Описание
sents list[list] - Элементы каждого предложения, например его части речи

Предложения, которые не список списков, или элементы, которые нельзя хешировать, дают SourceTypeError.

calc_multiset_similarity(sents)

Средняя схожесть мультимножеств элементов соседних предложений: взвешенный коэффициент Жаккара каждых двух - общие элементы, каждый столько раз, сколько он встречается в предложении, где его меньше, деленные на элементы обоих, каждый столько раз, сколько он встречается в предложении, где его больше, - 1 для одинаковых мультимножеств и для двух пустых, 0 для непересекающихся; nan, если предложений меньше двух. Отображение читается по ключам, как множество.

Параметр Тип По умолчанию Описание
sents list[list] - Элементы каждого предложения, например его тройки зависимостей

Предложения, которые не список коллекций, или элементы, которые нельзя хешировать, дают SourceTypeError.

Вспомогательные функции

is_word(token)

Проверяет, является ли токен словом: не пробелом и не токеном is_punctuation, поэтому символы вроде %, €, + и невидимые знаки тоже не слова. Такие токены - слова iter_doc_tokens и узлы дерева зависимостей синтаксических статистик.

Параметр Тип По умолчанию Описание
token Token - Токен
has_feature(token, field, value)

Проверяет, есть ли у токена морфологический признак с заданным значением: has_feature(token, "VerbForm", "Fin").

Параметр Тип По умолчанию Описание
token Token - Токен
field str - Название признака
value str - Значение признака
get_lemma(token)

Лемма токена в нижнем регистре по разбору ruMorph с частью речи токена (ruts.utils.lemmatize), а не token.lemma_.

Параметр Тип По умолчанию Описание
token Token - Токен