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

Функции вычисления статистик

Все функции работают с объектами 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:relclacl
get_children(token) Список зависимых слов токена
has_feature(token, field, value) У токена есть морфологический признак field со значением value