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

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

ruts.syntax_stats.SyntaxStats

Описание

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

Статистики считаются по разметке Universal Dependencies, поэтому источником данных может быть только объект класса Doc библиотеки spaCy с разбором зависимостей - из моделей ru_core_news_sm, ru_core_news_md или ru_core_news_lg. Знаки препинания и пробельные токены не учитываются: узлами дерева считаются слова, длины зависимостей измеряются по позициям слов.

Показатели предложения (максимальная длина зависимости, глубина дерева, число листьев и поддеревьев, узлов на лист) усредняются по предложениям; конструкции (клаузы, цепочки, обороты, инфинитивы, отрицания) нормируются на число предложений; пассив и модификаторы - на число глагольных форм и существительных. Значения, которые не определены для текста (средняя длина оборота при отсутствии оборотов, доля пассива при отсутствии глаголов), равны nan.

Примечание

Качество статистик ограничено качеством разбора: маленькая модель ru_core_news_sm ошибается в частях речи и связях заметно чаще, чем ru_core_news_lg.

Примечание

Вычисление статистик происходит в момент инициализации объекта класса SyntaxStats.

Параметры

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

Атрибуты

Атрибут Тип Описание
n_sents int Количество предложений, содержащих слова
n_words int Количество слов
n_leaves int Количество листьев - слов без зависимых слов
n_subtrees int Количество поддеревьев - слов с зависимыми словами
n_coordination_chains int Количество сочинительных цепочек
n_clauses int Количество клауз
n_subordinate_clauses int Количество придаточных клауз
n_complex_sents int Количество предложений с придаточными
n_nouns int Количество существительных
n_genitive_chains int Количество цепочек родительных падежей
n_participle_clauses int Количество причастных оборотов
n_converb_clauses int Количество деепричастных оборотов
n_verbs int Количество глагольных форм
n_passive int Количество пассивных глагольных форм
n_agentless_passive int Количество пассивных форм без агенса
n_infinitives int Количество инфинитивов
n_negations int Количество отрицательных частиц
c_children dict[int, int] Распределение слов по числу зависимых слов
c_deps dict[str, int] Распределение слов по синтаксическим отношениям
mean_dependency_distance float Средняя длина зависимости
std_dependency_distance float Стандартное отклонение длины зависимости
max_dependency_distance float Максимальная длина зависимости в предложении (по предложениям с зависимостями)
p_adjacent_dependencies float Доля смежных связей - зависимостей длины 1
tree_depth float Глубина дерева зависимостей
leaves_per_sent float Листьев на предложение
subtrees_per_sent float Поддеревьев на предложение
nodes_per_leaf float Отношение числа слов к числу листьев
verb_valency float Среднее число зависимых у финитного глагола
coordination_chains_per_sent float Сочинительных цепочек на предложение
mean_coordination_chain_len float Средняя длина сочинительной цепочки
clauses_per_sent float Клауз на предложение
mean_clause_len float Средняя длина клаузы в словах
subordinate_clauses_per_sent float Придаточных клауз на предложение
p_complex_sents float Доля предложений хотя бы с одной придаточной клаузой
modifiers_per_noun float Среднее число модификаторов у существительного
genitive_chains_per_sent float Цепочек родительных падежей на предложение
max_genitive_chain_len int Максимальная длина цепочки родительных падежей
participle_clauses_per_sent float Причастных оборотов на предложение
mean_participle_clause_len float Средняя длина причастного оборота в словах
converb_clauses_per_sent float Деепричастных оборотов на предложение
mean_converb_clause_len float Средняя длина деепричастного оборота в словах
p_passive float Доля пассивных форм среди глагольных форм
p_agentless_passive float Доля форм без агенса среди пассивных
infinitives_per_sent float Инфинитивов на предложение
negations_per_sent float Отрицательных частиц на предложение

Примечание

Каждую статистику можно вычислить отдельно, выполнив соответствующую функцию. Подробную информацию о синтаксических статистиках и функциях, используемых для их вычисления, можно узнать в соответствующем разделе.

Методы

get_stats

Возвращает справочник с вычисленными синтаксическими статистиками текста.

Пример

Код:

# Загрузка библиотек
import spacy
from ruts import SyntaxStats

# Подготовка данных
nlp = spacy.load("ru_core_news_sm")
text = "Дом, построенный рабочими в прошлом году, был продан. Он сказал, что не придёт, и ушёл, хлопнув дверью."

# Вычисление статистик
ss = SyntaxStats(nlp(text))
ss.get_stats()

Результат:

{'mean_dependency_distance': 1.9333333333333333,
'std_dependency_distance': 1.6110727964792764,
'max_dependency_distance': 5.0,
'p_adjacent_dependencies': 0.6,
'tree_depth': 4.0,
'leaves_per_sent': 4.5,
'subtrees_per_sent': 4.0,
'nodes_per_leaf': 1.9,
'verb_valency': 2.0,
'coordination_chains_per_sent': 0.5,
'mean_coordination_chain_len': 2.0,
'clauses_per_sent': 1.5,
'mean_clause_len': 5.666666666666667,
'subordinate_clauses_per_sent': 0.5,
'p_complex_sents': 0.5,
'modifiers_per_noun': 0.4,
'genitive_chains_per_sent': 0.0,
'max_genitive_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.4,
'p_agentless_passive': 0.5,
'infinitives_per_sent': 0.0,
'negations_per_sent': 0.5}

Счетчики и распределения доступны как атрибуты:

Пример

ss.n_clauses, ss.n_nouns, ss.n_verbs
# (3, 5, 5)
ss.c_children
# {0: 9, 1: 2, 2: 5, 3: 1}
ss.c_deps
# {'ROOT': 2, 'acl': 1, 'advcl': 1, 'advmod': 1, 'amod': 1, 'aux:pass': 1, 'case': 1, 'cc': 1, 'ccomp': 1, 'conj': 1, 'iobj': 1, 'mark': 1, 'nsubj': 1, 'nsubj:pass': 1, 'obl': 1, 'obl:agent': 1}

Выводит на экран таблицу с вычисленными синтаксическими статистиками текста.

Пример

Код:

...

# Отображение таблицы вычисленных статистик
ss.print_stats()

Результат:

                    Статистика                    | Значение
------------------------------------------------------------
Средняя длина зависимости                         |   1.93
Стандартное отклонение длины зависимости          |   1.61
Максимальная длина зависимости                    |   5.00
Доля смежных связей                               |   0.60
Глубина дерева зависимостей                       |   4.00
Листьев на предложение                            |   4.50
Поддеревьев на предложение                        |   4.00
Узлов на лист                                     |   1.90
Валентность финитных глаголов                     |   2.00
Сочинительных цепочек на предложение              |   0.50
Средняя длина сочинительной цепочки               |   2.00
Клауз на предложение                              |   1.50
Средняя длина клаузы (слов)                       |   5.67
Придаточных клауз на предложение                  |   0.50
Доля предложений с придаточными                   |   0.50
Модификаторов на именную группу                   |   0.40
Цепочек родительных падежей на предложение        |   0.00
Максимальная длина цепочки родительных падежей    |   0.00
Причастных оборотов на предложение                |   0.50
Средняя длина причастного оборота (слов)          |   5.00
Деепричастных оборотов на предложение             |   0.50
Средняя длина деепричастного оборота (слов)       |   2.00
Доля пассивных форм среди глаголов                |   0.40
Доля безагентного пассива                         |   0.50
Инфинитивов на предложение                        |   0.00
Отрицаний на предложение                          |   0.50