Функции вычисления статистик¶
Все функции работают с объектами Token библиотеки spaCy: функции calc_* принимают последовательность токенов (Doc, Span или список), функции is_* и count_* - отдельный токен. Знаки препинания и пробельные токены пропускаются. Синтаксические отношения и морфологические признаки берутся из разметки Universal Dependencies; подтипы отношений (acl:relcl, nsubj:pass, nummod:gov) учитываются по базовому отношению там, где это указано.
Определения признаков следуют работе Иванова, Солнышкиной и Соловьёва (2018); в скобках указаны исходные названия признаков и коэффициенты корреляции с классом учебника из этой работы.
Длины зависимостей¶
ruts.syntax_stats.calc_dependency_distances()
Вычисление длин зависимостей - расстояний между словом и его вершиной в позициях слов без учета знаков препинания (Liu, 2008). Вершины предложений зависимости не имеют и пропускаются, как и слова, вершина которых лежит вне переданной последовательности. Класс SyntaxStats считает по длинам среднее (mean_dependency_distance), стандартное отклонение по всем зависимостям текста (std_dependency_distance), максимум в предложении, усредненный по предложениям с зависимостями (max_dependency_distance), и долю смежных связей длины 1 (p_adjacent_dependencies); предложения из одного слова ни в одну из статистик не входят. Средняя длина зависимости растет с длиной предложения, максимальная длина - лучший из древесных признаков на уровне отдельного предложения.
Параметры:
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
tokens |
Doc/Span/list[Token] | - |
Последовательность токенов |
Пример
import spacy
from ruts.syntax_stats import calc_dependency_distances
nlp = spacy.load("ru_core_news_sm")
calc_dependency_distances(nlp("Повышение эффективности использования ресурсов предприятия обсуждалось на совещании."))
# [5, 1, 1, 1, 1, 1, 2]
Глубина дерева¶
ruts.syntax_stats.calc_tree_depth()
Вычисление глубины дерева зависимостей - длины самого длинного пути от вершины предложения к листу в связях (LONGEST_PATH, r = 0.84). Для последовательности из нескольких предложений берется максимум, для предложения из одного слова - 0. Класс SyntaxStats усредняет глубину по предложениям (tree_depth).
Параметры:
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
tokens |
Doc/Span/list[Token] | - |
Последовательность токенов |
Листья, поддеревья и ветвление¶
ruts.syntax_stats.count_children()
Вычисление количества зависимых слов токена. Слово без зависимых - лист (LEAVES_NUMBER, r = 0.84), слово с зависимыми - вершина поддерева (PATH_NUMBER, r = 0.87). Класс SyntaxStats считает число листьев и поддеревьев на предложение (leaves_per_sent, subtrees_per_sent), отношение числа слов к числу листьев (AVERAGE_PATH, r = 0.84; nodes_per_leaf) и распределение слов по числу зависимых - профиль ветвления (c_children).
Параметры:
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
token |
Token | - |
Токен |
Валентность¶
ruts.syntax_stats.calc_valency()
Вычисление валентности токена - количества зависимых слов без сочинительных (cc, conj) и вставных (parataxis) связей. Класс SyntaxStats усредняет валентность по финитным формам глаголов (VERBS_DEP, r = 0.43; verb_valency); финитная форма - глагол с признаком VerbForm=Fin, см. is_finite_verb.
Параметры:
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
token |
Token | - |
Токен |
Сочинительные цепочки¶
ruts.syntax_stats.calc_coordination_chains()
Вычисление длин сочинительных цепочек. В Universal Dependencies все однородные члены присоединяются связью conj к первому из них, поэтому цепочка - слово с зависимыми conj, а ее длина - число однородных членов вместе с первым: в предложении «Он купил хлеб, молоко и сыр» одна цепочка длины 3. Число цепочек на предложение (SOCHIN_NUMBER, r = 0.93) и их средняя длина (AVERAGE_SOCHIN_LENGTH, r = 0.87) - сильнейшие синтаксические предикторы сложности учебника.
Параметры:
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
tokens |
Doc/Span/list[Token] | - |
Последовательность токенов |
Клаузы¶
ruts.syntax_stats.is_clause_head(), ruts.syntax_stats.is_subordinate_clause_head(), ruts.syntax_stats.is_predicate()
Проверка, является ли токен вершиной клаузы. Клаузу возглавляет вершина предложения или слово со связью ccomp, advcl, acl, acl:relcl, csubj или csubj:pass, кроме полных причастий, деепричастий и инфинитивов при существительном («желание уйти»): причастные и деепричастные обороты считаются отдельно. Вставная конструкция (parataxis) и однородное сказуемое (связь conj от вершины клаузы) образуют свою клаузу, только если это глагол или у него есть собственное подлежащее (is_predicate): «Он сказал: „Уходи“» и «думала, что он умён» - клаузы, а вводные слова «например», «конечно», «во-первых», на которые модели spaCy тоже вешают parataxis, - нет.
Придаточная клауза - клауза со связью ccomp, advcl, acl, acl:relcl, csubj или csubj:pass, а также однородное сказуемое придаточной клаузы (PODCHIN_RATE, r = 0.64). Класс SyntaxStats считает клаузы и придаточные на предложение (clauses_per_sent, subordinate_clauses_per_sent), среднюю длину клаузы в словах (mean_clause_len) и долю предложений хотя бы с одной придаточной (PODCHIN_NUMBER, r = 0.62; p_complex_sents).
Параметры:
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
token |
Token | - |
Токен |
Модификаторы именной группы¶
ruts.syntax_stats.count_noun_modifiers()
Вычисление количества модификаторов именной группы - зависимых слов со связями amod, det, nmod, nummod, acl и их подтипами (acl:relcl, nummod:gov). Сочинительные и пояснительные связи (conj, appos) не учитываются. Класс SyntaxStats усредняет число модификаторов по существительным и именам собственным (NOUNS_DEP, r = 0.88; modifiers_per_noun).
Параметры:
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
token |
Token | - |
Токен |
Цепочки родительных падежей¶
ruts.syntax_stats.calc_genitive_chains(), ruts.syntax_stats.is_genitive_modifier()
Вычисление длин цепочек родительных падежей - двух и более вложенных беспредложных определений в родительном падеже: «повышение эффективности использования ресурсов» - цепочка длины 3. Беспредложное определение - слово со связью nmod в родительном падеже без зависимого предлога (case): «дом отца», но не «дом у дороги». Цепочка начинается с определения, вершина которого сама не является таким определением, длина - число слов в самой длинной ветви. Нанизывание родительных падежей - один из главных маркеров канцелярита; класс SyntaxStats считает число цепочек на предложение (genitive_chains_per_sent) и максимальную длину по тексту (max_genitive_chain_len).
Параметры:
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
tokens |
Doc/Span/list[Token] | - |
Последовательность токенов |
Причастные и деепричастные обороты¶
ruts.syntax_stats.is_participle_clause(), ruts.syntax_stats.is_converb_clause(), ruts.syntax_stats.subtree_len()
Проверка, является ли токен вершиной причастного или деепричастного оборота: полное причастие (VerbForm=Part без Variant=Short) или деепричастие (VerbForm=Conv) хотя бы с одним зависимым словом, не считая сочинительных и вставных связей. Краткие причастия («дом построен») - сказуемые, а не определения, и оборотов не образуют. Длина оборота - число слов в поддереве вместе с самим причастием или деепричастием (subtree_len). Класс SyntaxStats считает обороты на предложение (PRICH_RATE, r = 0.91; DEEPRICH_RATE, r = 0.44) и их среднюю длину (PRICH_V, DEEPRICH_V).
Параметры:
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
token |
Token | - |
Токен |
Пассив¶
ruts.syntax_stats.is_passive(), ruts.syntax_stats.is_agentless()
Проверка, является ли токен пассивной глагольной формой - глаголом с признаком Voice=Pass (страдательные причастия, возвратный пассив «обсуждалось») или с зависимым nsubj:pass, csubj:pass или aux:pass. Форма без агенса - пассив без зависимого obl:agent: «дом построен», но не «дом построен рабочими». Класс SyntaxStats считает долю пассивных форм среди всех глагольных форм (p_passive) и долю форм без агенса среди пассивных (p_agentless_passive).
Параметры:
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
token |
Token | - |
Токен |
Формы глагола¶
ruts.syntax_stats.is_finite_verb(), ruts.syntax_stats.is_participle(), ruts.syntax_stats.is_converb(), ruts.syntax_stats.is_infinitive()
Проверки формы глагола по признаку VerbForm: финитная форма (Fin, только для части речи VERB), полное причастие (Part без Variant=Short), деепричастие (Conv), инфинитив (Inf). Класс SyntaxStats считает инфинитивы на предложение (infinitives_per_sent).
Параметры:
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
token |
Token | - |
Токен |
Отрицания¶
ruts.syntax_stats.is_negation()
Проверка, является ли токен отрицательной частицей - частицей (PART) с признаком Polarity=Neg или частицей «не», «ни». Союз «ни» в конструкции «ни… ни» отрицанием не считается. Класс SyntaxStats считает отрицания на предложение (NEG, r = 0.70; negations_per_sent).
Параметры:
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
token |
Token | - |
Токен |
Вспомогательные функции¶
ruts.syntax_stats.is_word(), ruts.syntax_stats.get_words(), ruts.syntax_stats.is_root(), ruts.syntax_stats.base_dep(), ruts.syntax_stats.get_children(), ruts.syntax_stats.has_feature()
| Функция | Описание |
|---|---|
is_word(token) |
Токен не является знаком препинания или пробелом |
get_words(tokens) |
Список слов последовательности токенов |
is_root(token) |
Токен - вершина предложения |
base_dep(token) |
Базовое отношение без подтипа: acl:relcl → acl |
get_children(token) |
Список зависимых слов токена |
has_feature(token, field, value) |
У токена есть морфологический признак field со значением value |