Синтаксические статистики¶
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}
print_stats¶
Выводит на экран таблицу с вычисленными синтаксическими статистиками текста.
Пример
Код:
...
# Отображение таблицы вычисленных статистик
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