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

Статистики связности

CohesionStats(source, sents_extractor=None, words_extractor=None, connectors=None, blank_lines=False)

Статистики связности текста по образцу Coh-Metrix и TAACO: повторы слов в предложениях, данность, темпоральная связность и коннекторы словаря. Предложения сравниваются по леммам. Источник данных - текст или объект Doc библиотеки spaCy.

Исключения:

  • SourceTypeError - источник, который не строка и не Doc, экстрактор другого типа, коннекторы, которые не словарь словосочетаний и пар строк;
  • SourceError - источник без слов;
  • ParameterError - неизвестный класс или тип коннектора, blank_lines, который не bool.

Класс расширяет CohesionStats ядра anyTS русским слоем и, в отличие от ядра, читает и строку. Строка и Doc без границ предложений делятся на предложения русским SentsExtractor; слова строки дает русский WordsExtractor или заданный words_extractor. Для Doc с разметкой частей речи часть речи, время и вид берутся из token.pos_ и token.morph, а лемма - из разбора ruMorph с частью речи токена (unit_info); для строки - из разбора ruMorph в контексте предложения (analysis_info), для Doc без разметки - так же в предложениях, слова которых совпадают со словами строки, а остальные слова, как и с заданным экстрактором слов, - из первого разбора ruMorph (words_info), где ответное «нет» - частица. Части дефисного слова, разрезанного spaCy, склеиваются (во-первых - одно слово). Коннекторы ищет RussianConnectorMatcher по словарю load_connectors. Таблица print_stats и сообщения об ошибках - по-русски (COHESION_STATS_DESC и CORE_MESSAGES из ruts.constants).

Слова классифицируются по частям речи и признакам Universal Dependencies - разбора ruMorph для строки или разметки объекта Doc:

Понятие Строка (ruMorph) Doc
Существительные NOUN, PROPN NOUN, PROPN
Местоимения PRON, DET, леммы из DEMONSTRATIVE_LEMMAS PRON, DET, леммы из DEMONSTRATIVE_LEMMAS
Аргументы NOUN, PROPN, PRON NOUN, PROPN, PRON
Знаменательные слова CONTENT_UD_POS без указательных, местоименных (PronType Dem, Int, Rel: там, где, почему) и вводных (помета Prnt) слов, предикативов и чисел цифрами CONTENT_UD_POS без указательных
Указательные леммы из DEMONSTRATIVE_LEMMAS: этот, это, тот, такой, таковой, столько, сей, оный те же леммы
Время и вид признаки Tense и Aspect признаки Tense и Aspect
from ruts import CohesionStats

text = "Кот сидел на окне. Он смотрел на птиц. Птицы улетели, и кот уснул. Завтра он снова будет сидеть на этом окне."
cs = CohesionStats(text)
cs.print_stats()
                       Статистика                        | Значение
--------------------------------------------------------------------
Повтор существительных в соседних предложениях           |   0.33
Повтор существительных во всех парах предложений         |   0.50
Повтор аргументов в соседних предложениях                |   0.33
Повтор аргументов во всех парах предложений              |   0.67
Повтор знаменательных слов в соседних предложениях       |   0.33
Повтор знаменательных слов во всех парах предложений     |   0.50
Доля общих знаменательных слов в соседних предложениях   |   0.11
Доля общих знаменательных слов во всех парах предложений |   0.20
Повтор существительных в двух следующих предложениях     |   0.67
Повтор аргументов в двух следующих предложениях          |   0.75
Повтор знаменательных слов в двух следующих предложениях |   0.40
Повтор существительных в соседних абзацах                |   nan
Повтор аргументов в соседних абзацах                     |   nan
Повтор знаменательных слов в соседних абзацах            |   nan
Доля местоимений                                         |   0.14
Отношение местоимений к существительным                  |   0.50
Доля указательных местоимений                            |   0.05
Доля знаменательных слов, встречавшихся ранее            |   0.31
Повтор времени в соседних предложениях                   |   0.67
Повтор вида в соседних предложениях                      |   0.33
Темпоральная связность                                   |   0.50
Коннекторов на 1000 слов                                 |  47.62
Межпредложенческих коннекторов на 1000 слов              |   0.00
Внутрипредложенческих коннекторов на 1000 слов           |  47.62
Причинных коннекторов на 1000 слов                       |   0.00
Противительных коннекторов на 1000 слов                  |   0.00
Уступительных коннекторов на 1000 слов                   |   0.00
Временных коннекторов на 1000 слов                       |   0.00
Аддитивных коннекторов на 1000 слов                      |  47.62
Условных коннекторов на 1000 слов                        |   0.00
Переформулирующих коннекторов на 1000 слов               |   0.00
Первичных коннекторов на 1000 слов                       |  47.62
Вторичных коннекторов на 1000 слов                       |   0.00

Параметры

Параметр Тип По умолчанию Описание
source str / Doc - Источник данных
sents_extractor SentsExtractor None Инструмент для извлечения предложений; заданный, делит и Doc по его тексту независимо от границ
words_extractor WordsExtractor None Инструмент для извлечения слов; заданный, применяется и к тексту Doc
connectors dict[str, tuple[str, str]] None Класс и тип по коннектору; по умолчанию словарь load_connectors
blank_lines bool False Абзацы только после пустых строк - для текста, строки которого переносятся внутри абзаца; по умолчанию абзац - строка

Атрибуты

Атрибут Тип Описание
words, lemmas tuple[tuple[str]] Слова и леммы каждого предложения, в котором есть слова
n_sents, n_words int Количество предложений со словами и количество слов
blank_lines bool Начинаются ли абзацы только после пустых строк
n_paragraphs int Количество абзацев - строк текста со знаменательными словами (частей между пустыми строками с blank_lines)
n_nouns, n_pronouns, n_demonstratives, n_content_words int Количество слов по видам
n_given int Количество знаменательных слов, лемма которых встречалась раньше
n_connectors, connector_spans, c_connectors int, tuple[Connector], dict[str, int] Количество коннекторов, их вхождения и количество вхождений по коннекторам
n_inter_connectors int Количество межпредложенческих коннекторов

Заданные экстракторы хранятся в атрибутах sents_extractor и words_extractor, без них - None.

cs.lemmas[1]
cs.n_nouns, cs.n_pronouns, cs.n_content_words, cs.n_given
cs.connector_spans
cs.c_connectors
('он', 'смотреть', 'на', 'птица')
(6, 3, 13, 4)
(Connector(sent=2, start=2, end=3, text='и', cls='additive', kind='primary'),)
{'и': 1}

Метрики

Каждая метрика - атрибут объекта, который вычисляется при его создании; get_stats дает метрики из stats_desc, по умолчанию все, кроме mood_repetition. Функции карточек принимают предложение как набор его элементов - лемм существительных, аргументов или знаменательных слов, значений признака его глаголов - и языка не знают.

Метрика Что измеряет Диапазон Чем больше, тем
noun_overlap_adjacent Доля соседних пар предложений с общим существительным 0-1, nan для одного предложения теснее связаны соседние предложения
noun_overlap_all Доля всех пар предложений с общим существительным 0-1, nan для одного предложения теснее связан весь текст
argument_overlap_adjacent Доля соседних пар с общим существительным или местоимением 0-1, nan для одного предложения теснее связаны соседние предложения
argument_overlap_all Доля всех пар с общим существительным или местоимением 0-1, nan для одного предложения теснее связан весь текст
content_overlap_adjacent Доля соседних пар с общим знаменательным словом 0-1, nan для одного предложения теснее связаны соседние предложения
content_overlap_all Доля всех пар с общим знаменательным словом 0-1, nan для одного предложения теснее связан весь текст
content_overlap_prop_adjacent Средняя доля общих знаменательных слов (Дайс) в соседних парах 0-1, nan для одного предложения больше общих слов у соседей
content_overlap_prop_all Средняя доля общих знаменательных слов (Дайс) во всех парах 0-1, nan для одного предложения больше общих слов по всему тексту
noun_overlap_2_sent Доля существительных предложения, повторенных в одном из двух следующих 0-1, nan для текста короче трех предложений или без существительных в сравниваемых больше существительных переходит дальше
argument_overlap_2_sent Доля аргументов предложения, повторенных в одном из двух следующих 0-1, nan для текста короче трех предложений или без аргументов в сравниваемых больше аргументов переходит дальше
content_overlap_2_sent Доля знаменательных слов предложения, повторенных в одном из двух следующих 0-1, nan для текста короче трех предложений или без знаменательных слов в сравниваемых больше знаменательных слов переходит дальше
noun_overlap_para Доля существительных абзаца, повторенных в следующем 0-1, nan для одного абзаца или без существительных в сравниваемых больше существительных переходит в следующий абзац
argument_overlap_para Доля аргументов абзаца, повторенных в следующем 0-1, nan для одного абзаца или без аргументов в сравниваемых больше аргументов переходит в следующий абзац
content_overlap_para Доля знаменательных слов абзаца, повторенных в следующем 0-1, nan для одного абзаца или без знаменательных слов в сравниваемых больше знаменательных слов переходит в следующий абзац
p_pronouns Доля местоимений среди слов 0-1 больше отсылок местоимениями
pronoun_noun_ratio Отношение местоимений к существительным от 0, nan без существительных больше местоимений на существительное
p_demonstratives Доля указательных среди слов 0-1 больше указаний назад
p_given Доля знаменательных слов, лемма которых уже встречалась в тексте 0-1, nan без знаменательных слов больше данной информации
tense_repetition Доля соседних пар предложений с одинаковым преобладающим временем 0-1, nan без двух соседних предложений с признаком устойчивее время
mood_repetition Доля соседних пар с одинаковым преобладающим наклонением 0-1, nan без двух соседних предложений с признаком устойчивее наклонение
aspect_repetition Доля соседних пар с одинаковым преобладающим видом 0-1, nan без двух соседних предложений с признаком устойчивее вид
temporal_cohesion Среднее повторов признаков temporal_features 0-1, nan, если один из них nan устойчивее временной план
connectors Коннекторы на 1000 слов 0-1000 больше явных связей
connectors_inter Межпредложенческие коннекторы на 1000 слов 0-1000 больше связей с предыдущими предложениями
connectors_intra Внутрипредложенческие коннекторы на 1000 слов 0-1000 больше связей внутри предложений
connectors_<class>, connectors_<kind> Коннекторы класса или типа сопоставителя на 1000 слов 0-1000 больше связей этого класса или типа

Бинарный повтор

noun_overlap_adjacent · noun_overlap_all · argument_overlap_adjacent · argument_overlap_all · content_overlap_adjacent · content_overlap_all · Coh-Metrix

calc_overlap(sets, adjacent=True)

Бинарный повтор Coh-Metrix (CRFNO1, CRFAO1, CRFSO1 по соседним парам, CRFNOa, CRFAOa, CRFSOa по всем): доля пар предложений хотя бы с одним общим элементом; для текста короче двух предложений - nan.

\[ \frac{\textrm{Количество пар с общим элементом}}{\textrm{Количество пар}} \]
Параметр Тип По умолчанию Описание
sets list[set[str]] - Элементы каждого предложения
adjacent bool True Считать только соседние пары, иначе все пары

Пропорциональный повтор

content_overlap_prop_adjacent · content_overlap_prop_all · Coh-Metrix

calc_proportional_overlap(sets, adjacent=True)

Пропорциональный повтор Coh-Metrix (CRFCWO1, CRFCWOa): коэффициент Дайса пары предложений (dice), усредненный по парам; для текста короче двух предложений - nan.

\[ \frac{1}{\textrm{Количество пар}} \sum_{(A, B)} \textrm{Dice}(A, B) \]
Параметр Тип По умолчанию Описание
sets list[set[str]] - Элементы каждого предложения
adjacent bool True Считать только соседние пары, иначе все пары
dice(first, second)

Коэффициент Дайса двух множеств, 0 для двух пустых множеств.

\[ \frac{2 \times |A \cap B|}{|A| + |B|} \]
Параметр Тип По умолчанию Описание
first frozenset[str] - Первое множество
second frozenset[str] - Второе множество

Повтор в следующих предложениях и абзацах

noun_overlap_2_sent · argument_overlap_2_sent · content_overlap_2_sent · noun_overlap_para · argument_overlap_para · content_overlap_para · TAACO

Соседний повтор TAACO по леммам существительных, аргументов и знаменательных слов: доля разных лемм предложения, повторенных в одном из двух следующих предложений (adjacent_overlap_2_*_sent), и лемм абзаца, повторенных в следующем абзаце (adjacent_overlap_*_para), по всем предложениям или абзацам, у которых они есть (calc_forward_overlap). В отличие от бинарного повтора, пара сегментов учитывается по доле их общих лемм. Абзац - строка текста, как в TAACO, или часть между пустыми строками с blank_lines - для текста, строки которого переносятся внутри абзаца; его открывает слово с paragraph_start, в том числе внутри предложения, например когда парсер присоединяет заголовок к следующему предложению. Абзац без знаменательных слов, например номер главы, присоединяется к следующему, а последний такой - к предыдущему.

calc_forward_overlap(sets, span=1)

Доля элементов сегмента, повторенных в следующих: разные элементы каждого сегмента, за которым идут еще span сегментов, встречающиеся в одном из этих сегментов, деленные на разные элементы таких сегментов; если сегментов не больше span или в них нет элементов, значение - nan.

\[ \frac{\sum_{i=1}^{n-k} |A_i \cap (A_{i+1} \cup \dots \cup A_{i+k})|}{\sum_{i=1}^{n-k} |A_i|} \]
Параметр Тип По умолчанию Описание
sets list[set[str]] - Элементы каждого сегмента
span int 1 Число \(k\) следующих сегментов, с которыми сравнивается сегмент

Сегменты, которые являются строкой, Doc или итератором, и сегмент, который не список строк, дают SourceTypeError, а span, который не целое число больше 0, - ParameterError.

В ruTS на абзацы делятся и строка, и Doc. В стихах без пустых строк абзац - стих, а строфы, как у VerseStats, дает blank_lines=True там, где они разделены пустыми строками.

from ruts.cohesion_stats import calc_forward_overlap

calc_forward_overlap([{"кот", "окно"}, {"птица"}, {"кот"}], span=2)
text = "Кот сидел на окне. Он смотрел на птиц.\nПтицы улетели, и кот уснул. Завтра он снова будет сидеть на этом окне."
paragraphs = CohesionStats(text)
paragraphs.n_paragraphs, paragraphs.noun_overlap_para, paragraphs.content_overlap_para
CohesionStats(text, blank_lines=True).n_paragraphs
0.5
(2, 1.0, 0.8)
1

Местоимения и указательные

p_pronouns · pronoun_noun_ratio · p_demonstratives

Местоимения, существительные и указательные - слова, которые так размечает analyze, по умолчанию с признаками word_info.

\[ \frac{\textrm{Количество местоимений}}{\textrm{Количество слов}}, \quad \frac{\textrm{Количество местоимений}}{\textrm{Количество существительных}}, \quad \frac{\textrm{Количество указательных}}{\textrm{Количество слов}} \]

В ruTS их размечают функции признаков слова по таблице классов слов.

Данность

p_given

count_given(sents)

Количество данных элементов: элемент дан, если та же лемма уже встречалась раньше в любом предложении, включая текущее; первое вхождение - новое.

Параметр Тип По умолчанию Описание
sents list[list[str]] - Леммы каждого предложения в порядке текста

Темпоральная связность

tense_repetition · mood_repetition · aspect_repetition · temporal_cohesion · Coh-Metrix

calc_repetition(sents)

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

\[ \frac{\textrm{Количество пар с одинаковым преобладающим значением}}{\textrm{Количество пар с признаком}} \]
Параметр Тип По умолчанию Описание
sents list[list[str]] - Значения признака глаголов каждого предложения
dominant(values)

Преобладающее значение: самое частое, из равно частых - первое; для пустого списка - None.

Параметр Тип По умолчанию Описание
values list[str] - Значения

Наклонение CohesionStats в ruTS не сравнивает: mood_repetition всегда равен nan, а temporal_cohesion - среднее tense_repetition и aspect_repetition.

Коннекторы

connectors · connectors_inter · connectors_intra · connectors_<class> · connectors_<kind>

Вхождения коннекторов, найденных в каждом предложении сопоставителем connector_matcher_class, на 1000 слов. Межпредложенческий коннектор связывает предложение с предыдущими: он открывает предложение, если сопоставитель не считает его подчинительным (is_subordinator) - клауза или группа подчинительного принадлежит тому же предложению; остальные - внутрипредложенческие. Каждый класс и тип сопоставителя дает свою плотность: по умолчанию connectors_causal, connectors_adversative, connectors_concessive, connectors_temporal, connectors_additive, connectors_conditional, connectors_reformulative, connectors_primary и connectors_secondary.

\[ 1000 \cdot \frac{\textrm{Количество коннекторов}}{\textrm{Количество слов}} \]
load_connectors()

Словарь коннекторов ruTS: файл ruts/resources/connectors.tsv - 316 коннекторов с классом из CONNECTOR_CLASSES и типом из CONNECTOR_TYPES модуля ruts.constants, составленных по классификации Криони, Никина и Филипповой (2008) со сверкой по списку маркеров Ru-RSTreebank, базе Рускон и списку причинных маркеров Тольдовой и др. (2018). Однословные «и», «а», «но» входят в словарь, как в Coh-Metrix и TAACO; «что» и «как» коннекторами не считаются.

Класс Ключ Примеры
Причинные (включая следственные и целевые) causal потому что, поэтому, в результате, чтобы, таким образом
Противительные adversative но, однако, зато, с другой стороны, в то же время
Уступительные concessive хотя, несмотря на, тем не менее, и всё же, в любом случае
Временные temporal когда, затем, после того как, тем временем, в дальнейшем
Аддитивные additive и, также, кроме того, более того, например, во-первых
Условные conditional если, в случае если, при условии что, в противном случае
Переформулирующие reformulative то есть, иными словами, в общем, подводя итог

Первичные коннекторы (primary) - союзы, наречия и частицы (потому что, однако, затем), вторичные (secondary) - лексикализованные обороты с существительными и глаголами (в результате этого, с другой стороны, иными словами). Правила, по которым слово словаря считается коннектором, - у сопоставителя.

Список предложений, который является строкой, Doc, итератором, множеством или таблицей, дает SourceTypeError, как и предложение, которое не список строк (check_words), например список токенов spaCy. Функции повторов (calc_overlap, calc_proportional_overlap, calc_overlaps) принимают предложение и в виде множества; count_given и calc_repetition считают слова по порядку и множество не принимают.

from ruts.cohesion_stats import calc_overlap, calc_repetition, count_given

sets = [{"кот", "окно"}, {"птица"}, {"птица", "кот"}, {"окно"}]
calc_overlap(sets), calc_overlap(sets, adjacent=False)
count_given([["кот", "окно"], ["птица"], ["птица", "кот"]])
calc_repetition([["past"], ["past", "pres", "past"], ["futr"]])
(0.3333333333333333, 0.5)
2
0.5

Методы

Методы get_stats, to_dataframe, print_stats и describe - из интерфейса статистик ядра anyTS; шкал у статистик связности нет, поэтому describe для статистик get_stats возвращает None.

cs.get_stats()
{'noun_overlap_adjacent': 0.3333333333333333,
 'noun_overlap_all': 0.5,
 'argument_overlap_adjacent': 0.3333333333333333,
 'argument_overlap_all': 0.6666666666666666,
 'content_overlap_adjacent': 0.3333333333333333,
 'content_overlap_all': 0.5,
 'content_overlap_prop_adjacent': 0.1111111111111111,
 'content_overlap_prop_all': 0.19841269841269837,
 'noun_overlap_2_sent': 0.6666666666666666,
 'argument_overlap_2_sent': 0.75,
 'content_overlap_2_sent': 0.4,
 'noun_overlap_para': nan,
 'argument_overlap_para': nan,
 'content_overlap_para': nan,
 'p_pronouns': 0.14285714285714285,
 'pronoun_noun_ratio': 0.5,
 'p_demonstratives': 0.047619047619047616,
 'p_given': 0.3076923076923077,
 'tense_repetition': 0.6666666666666666,
 'aspect_repetition': 0.3333333333333333,
 'temporal_cohesion': 0.5,
 'connectors': 47.61904761904762,
 'connectors_inter': 0.0,
 'connectors_intra': 47.61904761904762,
 'connectors_causal': 0.0,
 'connectors_adversative': 0.0,
 'connectors_concessive': 0.0,
 'connectors_temporal': 0.0,
 'connectors_additive': 47.61904761904762,
 'connectors_conditional': 0.0,
 'connectors_reformulative': 0.0,
 'connectors_primary': 47.61904761904762,
 'connectors_secondary': 0.0}

Все повторы за один расчет

calc_overlaps(sets, proportional=True)

Значения calc_overlap и calc_proportional_overlap по соседним и по всем парам сразу - именованный кортеж Overlap с полями adjacent, all, prop_adjacent и prop_all; без proportional последние два равны nan. Значения по всем парам получаются без перебора каждой пары, и ни одно из них не зависит от порядка элементов в множествах.

Параметр Тип По умолчанию Описание
sets list[set[str]] - Элементы каждого предложения
proportional bool True Вычислять и пропорциональный повтор

Класс CohesionStats считает с ее помощью повторы существительных и аргументов без пропорциональных, а повторы знаменательных слов - с ними.

from ruts.cohesion_stats import calc_overlaps

calc_overlaps([{"кот", "окно"}, {"птица"}, {"птица", "кот"}, {"окно"}])
Overlap(adjacent=0.3333333333333333, all=0.5, prop_adjacent=0.2222222222222222, prop_all=0.3055555555555555)

Сопоставитель коннекторов

RussianConnectorMatcher(connectors)

Поиск коннекторов словаря (дискурсивных маркеров: потому что, однако, с другой стороны) в предложениях текста. Словарь задает класс каждого коннектора - причинный, противительный, уступительный, временной, аддитивный, условный или переформулирующий (CONNECTOR_CLASSES) - и его тип, первичный или вторичный (CONNECTOR_KINDS). Коннектор сопоставляется по нормализованным формам его слов: в каждой позиции берется самый длинный, найденные не пересекаются; точку и дефис внутри коннектора токенизатор может отделить (т.е. - т, е), а точка сокращения может остаться при каждой его части, как в токенах UD (т., е.). Вхождение - Connector: номер предложения sent, позиции его слов start и end, коннектор text в написании словаря, его класс cls и тип kind.

Исключения:

  • SourceTypeError - словарь, который не отображение словосочетания в пару строк;
  • ParameterError - неизвестный класс или тип.

RussianConnectorMatcher - подкласс ConnectorMatcher ядра с правилами русского языка. Слова и коннекторы сравниваются в нижнем регистре без буквы ё и знаков ударения (normalize_yo). Однословному коннектору подходит часть речи из CONNECTOR_POS ядра (CCONJ, SCONJ, PART, ADV, ADP, INTJ, X) или из CONNECTOR_POS_EXTRA для его формы (словом и главное - NOUN, допустим, предположим, резюмируя - VERB): «раз» как существительное и «значит» как глагол коннекторами не считаются. Контекстные правила - списки ruts.constants: слова после коннектора (CONNECTOR_BLOCKED_AFTER: пока что, хоть бы) и перед ним (CONNECTOR_BLOCKED_BEFORE: ещё раз, и так далее), с которыми он не коннектор; коннекторы, которые внутри предложения засчитываются только после отдельных слов (CONNECTOR_ONLY_AFTER: и отсюда) и не засчитываются в его начале (CONNECTOR_NOT_AT_START: вопросительное отчего); части речи слова после коннектора, с которыми он предлог или член предложения (CONNECTOR_BLOCKED_AFTER_POS: после обеда, едва заметный). Через знак препинания правила читают только у CONNECTOR_READ_THROUGH_MARKS (не знал, отчего), так что вводное значит, остается коннектором, а знак между словами коннектора из CONNECTOR_SPLIT_BY_MARKS его разделяет (так, как). Эти части речи и списки - атрибуты сопоставителя: CONNECTOR_POS - pos_tags, остальные - под именем без CONNECTOR_ в нижнем регистре (CONNECTOR_BLOCKED_AFTER - blocked_after); атрибуты not_after_pos и start_only_pos в ruTS пусты, так что эти правила find не действуют.

find(words, sent_index, pos, breaks, blocked) возвращает вхождения коннекторов в предложении в порядке слов. Слова - слова одного предложения без знаков препинания, первое из них - его начало. С частями речи однословный коннектор засчитывается только при части речи из pos_tags или из pos_extra для его формы, никогда - после части речи из not_after_pos, а с частью речи из start_only_pos - только в начале предложения; слово без части речи (None) проходит. Без частей речи правила, которые их читают, пропускаются. Позиции знаков препинания breaks отделяют коннектор от соседей: правило не читает слово через знак, так что в значит, пойдем слово после запятой не запрещает коннектор и не разрешает его, если коннектор не из read_through_marks, а знак между словами коннектора из split_by_marks делает его не коннектором; без позиций слова читаются как соседние. Ни один коннектор не начинается со слова из blocked, которое язык исключает по большему, чем слова и их части речи, например по своему разбору.

Параметр Тип По умолчанию Описание
words list[str] - Слова предложения
sent_index int 0 Номер предложения для записи во вхождения
pos list[str] None Части речи слов
breaks set[int] None Позиции слов, перед которыми стоит знак препинания
blocked set[int] None Позиции слов, с которых не начинается коннектор

Слова, которые не список строк, части речи, которые не список строк и None (теги token.pos_ spaCy, а не числа token.pos), и позиции, которые не коллекция, дают SourceTypeError; номер предложения или позиция, которые не целое число, позиция знака, которая не позиция слова после первого, позиция из blocked, которая не позиция слова, и частей речи не столько, сколько слов, - ParameterError.

is_subordinator(connector, pos=None) проверяет, привязывает ли вхождение коннектора свою клаузу или группу к собственному предложению: коннектор из subordinators или однословный коннектор с частью речи pos SCONJ или ADP, но не из parcellation. Клауза подчинительного союза и группа предлога принадлежат предложению коннектора, где бы он ни стоял, поэтому подчинительный, открывающий предложение (когда он пришел, ..., вопреки ожиданиям, ...), не связывает его с предыдущими. Коннектор, который не Connector, дает SourceTypeError.

Подчинительные в ruTS сверх однословных с частью речи SCONJ и ADP - CONNECTOR_SUBORDINATORS: многословные союзы и предлоги (так как, после того как, несмотря на) и однословные, которые модели spaCy или ruMorph размечают иначе (ежели, коли, пока, раз, хоть, едва). Союз из CONNECTOR_PARCELLATION (ибо) в начале предложения присоединяет его к предыдущему, поэтому подчинительным не считается.

Поиск коннекторов

find_connectors(words, connectors=None, sent_index=0, pos=None, breaks=None, blocked=None)

Ищет коннекторы в предложении методом find сопоставителя RussianConnectorMatcher по словарю connectors, по умолчанию - по словарю load_connectors; остальные параметры и исключения - те же, что у сопоставителя и find.

Параметр Тип По умолчанию Описание
connectors dict[str, tuple[str, str]] None Класс и тип по коннектору
connector_pos(word)

Часть речи UD слова по ruMorph для проверки коннектора: первый разбор с частью речи, подходящей коннектору (CONNECTOR_POS или CONNECTOR_POS_EXTRA для этого слова), иначе первый разбор. Так CohesionStats получает части речи слов, которые разбираются по одному: с заданным экстрактором слов и в предложениях Doc без разметки, слова которых не совпали со словами строки.

Параметр Тип По умолчанию Описание
word str - Слово
from ruts.cohesion_stats import find_connectors

find_connectors(["Затем", "иными", "словами", "он", "уснул"])
find_connectors(["Раз", "он", "пришел"])
find_connectors(["Раз", "он", "пришел"], pos=["NOUN", "PRON", "VERB"])
[Connector(sent=0, start=0, end=1, text='затем', cls='temporal', kind='primary'),
 Connector(sent=0, start=1, end=3, text='иными словами', cls='reformulative', kind='secondary')]
[Connector(sent=0, start=0, end=1, text='раз', cls='conditional', kind='primary')]
[]

Признаки слова

word_info(word)
words_info(sents, text, analyses=None)
analysis_info(analysis)
token_info(token)
ud_info(word, pos, tense, aspect)
unit_info(unit)

Признаки слова для статистик связности - именованный кортеж WordInfo: lemma, noun, pronoun, demonstrative, argument, content, tense и aspect по таблице классов слов. word_info берет их из первого разбора ruMorph, analysis_info - из заданного разбора ruMorph, например выбранного по контексту (ruts.utils.analyze_sentence); words_info - так же для слов предложений текста: по разбору из analyses, если он задан, иначе по первому разбору, где ответное «нет» (Нет, не видел) - частица. token_info берет их из разметки spaCy (token.pos_, Tense, Aspect), ud_info - из заданных части речи, времени и вида UD; лемма берется из разбора ruMorph с этой частью речи (ruts.utils.lemmatize), а не из token.lemma_. unit_info дает признаки слова по его токенам: отдельного токена - по token_info, дефисного слова из нескольких токенов (жили-были, назовите-ка) - по разбору ruMorph склеенного текста (word_to_ud).

Параметр Тип По умолчанию Описание
word str - Слово (word_info, ud_info)
sents list[list[str]] - Слова предложений текста (words_info)
text str - Текст, из которого извлечены слова (words_info)
analyses list[list[Analysis \| None]] None Разборы слов предложений, None - разбор по слову (words_info)
analysis Analysis - Разбор ruMorph (analysis_info)
token Token - Токен spaCy (token_info)
pos, tense, aspect str - Часть речи, время и вид UD (ud_info)
unit list[Token] - Токены слова (unit_info)
from ruts.cohesion_stats import word_info

word_info("смотрел")
WordInfo(lemma='смотреть', noun=False, pronoun=False, demonstrative=False, argument=False, content=True, tense='Past', aspect='Imp')

Слова Doc

split_doc_units(source, sents_extractor, join_hyphens=False)

Разбивает слова Doc или Span по предложениям экстрактора предложений - для Doc без границ предложений или для того, который нужно разбить иначе: предложения находятся в его тексте по порядку, а слово iter_doc_units относится к предложению, в котором лежит его первый токен. Слова вне найденных предложений, отброшенные экстрактором, не учитываются, поэтому если ни одного предложения не найдено, слов нет.

Параметр Тип По умолчанию Описание
source Doc / Span - Объект Doc или Span
sents_extractor SentsExtractor - Инструмент для извлечения предложений
join_hyphens bool False Склеивать части дефисных слов

Класс CohesionStats склеивает части дефисных слов всегда, а функция - только с join_hyphens=True.

unit_text(unit)
unit_pos(unit)

unit_text дает текст слова по его токенам без метки порядка байтов, знаков ударения и мягких переносов (ruts.utils.strip_marks), unit_pos - его часть речи UD: для отдельного токена - часть речи токена, для дефисного слова из нескольких токенов - часть речи connector_pos склеенного текста.

Параметр Тип По умолчанию Описание
unit list[Token] - Токены слова
import spacy
from ruts import SentsExtractor
from ruts.cohesion_stats import split_doc_units, unit_text

doc = spacy.blank("ru")("Жили-были дед да баба. Во-первых, кот спит.")
units = split_doc_units(doc, SentsExtractor())
[[unit_text(unit) for unit in sent] for sent in units]
units = split_doc_units(doc, SentsExtractor(), join_hyphens=True)
[[unit_text(unit) for unit in sent] for sent in units]
[['Жили', 'были', 'дед', 'да', 'баба'], ['Во', 'первых', 'кот', 'спит']]
[['Жили-были', 'дед', 'да', 'баба'], ['Во-первых', 'кот', 'спит']]

Местоимение

is_pronoun(word)

Проверяет, является ли слово местоимением по разметке ruMorph: PRON (он, себя, кто) или DET (этот, который, мой, весь).

Параметр Тип По умолчанию Описание
word str - Слово

Знаменательное слово

is_content_word(word)

Проверяет, является ли слово знаменательным по разметке ruMorph: часть речи из CONTENT_UD_POS (существительные, имена собственные, прилагательные, глаголы во всех формах, наречия), кроме местоименных (PronType Dem, Int, Rel: там, где, почему; ruts.utils.is_pronominal), вводных (помета Prnt) слов, предикативов (надо, можно) и чисел цифрами.

Параметр Тип По умолчанию Описание
word str - Слово