Синтаксические статистики¶
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 без деепричастных оборотов |
длиннее деепричастные обороты |
Длина зависимости¶
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]
Глубина дерева¶
calc_tree_depth(tokens, join_hyphens=False)
Глубина дерева зависимостей: самый длинный путь от вершины предложения до листа в связях между словами; для нескольких предложений - максимум, для предложения из одного слова - 0. С join_hyphens дефисное слово - одно слово, а слова, которые висят на любой из его частей, - на уровень ниже него.
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
tokens |
Doc / Span / list[Token] |
- | Последовательность токенов |
join_hyphens |
bool |
False |
Считать дефисное слово одним словом |
Глубина - признак LONGEST_PATH работы Иванова и др. (r = 0.84).
Листья и поддеревья¶
Лист - слово без зависимых слов (count_children), поддерево - слово с ними. Число узлов на лист - количество слов предложения, деленное на количество его листьев, в среднем по \(S\) предложениям.
Признаки работы: LEAVES_NUMBER (r = 0.84), PATH_NUMBER (r = 0.87) и AVERAGE_PATH (r = 0.84). Распределение слов по числу зависимых - профиль ветвления - дает атрибут c_children.
Слова до вершины предложения¶
Левая вложенность Coh-Metrix (SYNLE): число слов предложения до его вершины - главного сказуемого, в среднем по предложениям, вершина которых - слово. Вершина предложения со связкой - его именная часть (она была врачом), как в Universal Dependencies. В языке со свободным порядком слов мера говорит о порядке не меньше, чем о сложности.
Валентность финитных глаголов¶
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).
Сочинительные цепочки¶
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) - сильнейшие синтаксические предикторы сложности учебника.
Клаузы¶
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 |
- | Токен |
Придаточные клаузы¶
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) - доля предложений хотя бы с одной придаточной.
Инфинитивные клаузы¶
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¶
Индексы 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 (explClearNLP) - подлежащее. Однородный член или вставная конструкция с подчинительным союзом (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или однородный ей член.
Модификаторы существительного¶
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).
Предложные цепочки¶
Предложная цепочка - два и более вложенных дополнения с предлогом, каждое из которых висит на предыдущем: на коврике в доме у мэра (длина 3). Звенья - слова крючка is_prep_complement, а цепочки и их длины - те же, что у calc_modifier_chains; цепочка может начинаться с дополнения глагола (obl) или с предложного сказуемого со связкой (был в доме у мэра), но не с однородного члена дополнения (в Мадриде и в доме у моря), а сказуемое определительной придаточной клаузы (дом, который был у реки) звеном цепочки своего существительного не является. Цепочки читают только Universal Dependencies: ClearNLP делает вершиной группы предлог (prep, pobj), поэтому его разборы цепочек не дают.
Цепочки родительных падежей ruTS (genitive_chains_per_sent) считаются отдельно: их звенья - беспредложные определения в родительном падеже («повышение эффективности использования ресурсов»), а звенья предложной цепочки - дополнения с предлогом.
Цепочки родительных падежей¶
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]
Именные цепочки¶
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]
Причастные обороты¶
Обороты, которые возглавляют слова крючка is_participle_clause; длина оборота - число слов в поддереве его вершины (subtree_len).
is_participle_clause(token)
Проверяет, возглавляет ли слово причастный оборот: полное причастие (is_participle) хотя бы с одним зависимым словом, не считая сочинительных и вставных связей. Краткие причастия («дом построен») - сказуемые, а не определения, и оборотов не образуют. Признаки работы - PRICH_RATE (r = 0.91) и PRICH_V.
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
token |
Token |
- | Токен |
Деепричастные обороты¶
is_converb_clause(token)
Проверяет, возглавляет ли слово деепричастный оборот: деепричастие (is_converb) хотя бы с одним зависимым словом, не считая сочинительных и вставных связей. Длина оборота - число слов в поддереве деепричастия (subtree_len). Признаки работы - DEEPRICH_RATE (r = 0.44) и DEEPRICH_V.
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
token |
Token |
- | Токен |
Пассив¶
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), с теми же аргументами и ошибкой.
В русском языке пассив - страдательные причастия и возвратный пассив («обсуждалось»), форма без агенса - «дом построен», но не «дом построен рабочими».
Инфинитивы, отрицания и расщепленные сказуемые¶
Инфинитивы (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)]
[(проводится, Проверка), (принято, решение)]
['не']
Порядок подлежащих и дополнений¶
Порядок подлежащих и прямых дополнений по образцу Profiling-UD: доли тех из них, что стоят перед своей вершиной - сказуемым. Учитываются только именные (NOUN, PROPN): место местоимения, например клитики-дополнения, задает грамматика. Подлежащее - слово со связью nsubj (anyts.constants.NOMINAL_SUBJECT_DEPS), дополнение - со связью obj (anyts.constants.OBJECT_DEPS), вместе с отношениями ClearNLP и подтипами.
Схожесть соседних предложений¶
Насколько схожи структуры двух соседних предложений, в среднем по \(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. Схожесть троек растет с длиной предложений.
Отношение существительных к глаголам¶
Количество существительных n_nouns, деленное на количество глагольных форм n_verbs.
Методы¶
Методы 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 |
- | Токен |