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

Фоностатистики

PhonStats(source, words_extractor=None, window_len=3)

Фоностатистики текста: его звуки по классам, их кластеры, последовательности и повторы, его слоги. Звук - по умолчанию буква слова, а если библиотека дает транскрипцию, звук транскрипции. Источник данных - текст или объект Doc библиотеки spaCy; слова берутся в нижнем регистре, а явно переданный экстрактор применяется к тексту Doc.

Исключения:

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

Класс расширяет PhonStats ядра anyTS крючками русского языка: звуки - буквы слова по классам из таблицы ниже, без учета оглушения, редукции и ударения; йотированные е, ё, ю, я после гласной не дают зияния, а слова делятся на слоги по правилу восходящей звучности (Аванесов) функцией syllabify. Из слов текста и Doc убираются знаки ударения, а части дефисного слова, разрезанного spaCy, склеиваются (во-первых - одно слово). Таблица print_stats и сообщения об ошибках - по-русски (PHON_STATS_DESC и CORE_MESSAGES из ruts.constants). Время вычисления растет линейно с длиной текста.

Класс Буквы Константа
Гласные а, е, и, о, у, ы, э, ю, я, ё RU_VOWELS
Сонорные согласные л, м, н, р, й RU_CONSONANTS_SONOR, RU_CONSONANTS_YET
Звонкие шумные согласные б, в, г, д, ж, з RU_CONSONANTS_HIGH
Глухие шумные согласные к, п, с, т, ф, х, ц, ч, ш, щ RU_CONSONANTS_LOW
Знаки ь, ъ - не звуки: не учитываются в долях и не разрывают консонантный кластер RU_MARKS
from ruts import PhonStats

text = "Ног нет, а хожу, рта нет, а скажу: когда спать, когда вставать, когда работу начинать"
ps = PhonStats(text)
ps.print_stats()
              Статистика              | Значение
-------------------------------------------------
Доля гласных                          |   0.40
Доля сонорных согласных               |   0.11
Доля звонких шумных согласных         |   0.19
Доля глухих шумных согласных          |   0.29
Отношение согласных к гласным         |   1.48
Доля кластеров из 3 и более согласных |   0.03
Зияний гласных на слово               |   0.00
Энтропия CV-шаблонов слов (бит)       |   3.14
Жёсткость                             |   0.56
Индекс аллитерации                    |   1.09
Индекс ассонанса                      |   0.83
Доля открытых слогов                  |   0.76
Средняя длина слога (звуков)          |   2.48

Параметры

Параметр Тип По умолчанию Описание
source str / Doc - Источник данных
words_extractor WordsExtractor None Инструмент для извлечения слов; применяется и к Doc, к его тексту
window_len int 3 Окно в словах для аллитерации и ассонанса (PHON_WINDOW_LEN)
check_params(window_len)

Проверяет окно аллитерации и ассонанса отдельно от класса: окно, которое не целое число не меньше 2, дает ParameterError.

Атрибуты

Атрибут Тип Описание
words tuple[str] Слова в нижнем регистре
window_len int Окно аллитерации и ассонанса
syllables, sounds tuple Слоги (syllabify) и звуки (transcribe) каждого слова
n_vowels, n_sonorants, n_voiced, n_voiceless, n_consonants int Количество звуков по классам
c_clusters dict[int, int] Количество консонантных кластеров по длине (consonant_clusters)
c_syllable_patterns dict[str, int] Количество слогов по CV-шаблону

Атрибут ruTS n_marks (int) - количество ь и ъ.

ps.syllables[:4]
ps.c_clusters
ps.c_syllable_patterns
ps.n_marks
(('ног',), ('нет',), ('а',), ('хо', 'жу'))
{1: 22, 2: 6, 3: 1}
{'CCCV': 1, 'CCV': 5, 'CCVC': 1, 'CV': 11, 'CVC': 5, 'V': 2}
3

Метрики

Каждая метрика - атрибут объекта, который вычисляется при его создании, а get_stats дает их все.

Метрика Что измеряет Диапазон Чем больше, тем
p_vowels Доля гласных среди звуков классов 0-1, nan без звуков больше гласных
p_sonorants Доля сонорных среди звуков классов 0-1, nan без звуков звучнее текст
p_voiced Доля звонких шумных среди звуков классов 0-1, nan без звуков больше звонких шумных
p_voiceless Доля глухих шумных среди звуков классов 0-1, nan без звуков больше глухих шумных
consonant_vowel_ratio Отношение согласных к гласным от 0, nan без гласных плотнее согласные
p_heavy_clusters Доля кластеров из трех и более согласных 0-1, nan без кластеров тяжелее кластеры
p_hiatus Зияний word_hiatus на слово от 0, nan без звуков больше гласных подряд
cv_entropy Энтропия Шеннона CV-шаблонов слов в битах от 0, nan без звуков разнообразнее форма слов
hardness Глухие шумные к гласным и сонорным от 0, nan без гласных и сонорных жестче звучание
alliteration Индекс повторов согласных в окнах из window_len слов от 0, nan для текста короче окна или без согласной, общей для двух слов ближе друг к другу повторы согласных
assonance Индекс повторов гласных в окнах из window_len слов от 0, nan для текста короче окна или без гласной, общей для двух слов ближе друг к другу повторы гласных
p_open_syllables Доля слогов, которые оканчиваются на гласную 0-1, nan без слогов больше открытых слогов
mean_syllable_len Средняя длина слога в звуках от 1, nan без слогов длиннее слоги

Доли классов звуков

p_vowels · p_sonorants · p_voiced · p_voiceless

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

\[ \frac{\textrm{Количество звуков класса}}{\textrm{Количество гласных и согласных}} \]

Отношение согласных к гласным

consonant_vowel_ratio

Количество согласных n_consonants, деленное на количество гласных n_vowels.

\[ \frac{\textrm{Количество согласных}}{\textrm{Количество гласных}} \]

Консонантные кластеры

p_heavy_clusters · c_clusters

calc_consonant_clusters(text)

Распределение консонантных кластеров слов по длине. Кластер - последовательность согласных внутри слова, в том числе одиночная согласная между гласными или на краю слова; ь и ъ кластер не прерывают.

Параметр Тип По умолчанию Описание
text list[str] - Список слов

Зияния

p_hiatus

calc_hiatus(text)

Количество зияний гласных - двух и более гласных подряд внутри слова: аэропорт, аист, поэзия (о-э). Йотированные е, ё, ю, я после гласной обозначают [j] и гласный и зияния не образуют: заяц, моя, красивая, читает.

Параметр Тип По умолчанию Описание
text list[str] - Список слов

Энтропия CV-шаблонов

cv_entropy

Энтропия Шеннона CV-шаблонов слов (cv_pattern) в битах, где \(P(p)\) - доля слов с шаблоном \(p\) среди слов, у которых шаблон есть.

\[ -\sum_{p} P(p) \log_2 P(p) \]
calc_cv_entropy(text)

Энтропия CV-шаблонов списка слов: чем выше значение, тем разнообразнее фонетическая форма слов. Слова без гласных и согласных (числа, латиница) не учитываются, а без других слов значение - nan.

cv_pattern(word)

CV-шаблон слова или слога: гласные обозначаются буквой V, согласные - C, ь, ъ и остальные символы пропускаются.

Параметр Тип По умолчанию Описание
text list[str] - Список слов (calc_cv_entropy)
word str - Слово или слог (cv_pattern)

Жесткость

hardness

Количество глухих шумных согласных, деленное на количество гласных и сонорных.

\[ \frac{\textrm{Количество глухих шумных}}{\textrm{Количество гласных} + \textrm{Количество сонорных}} \]

Аллитерация и ассонанс

alliteration · assonance

calc_alliteration(text, window_len=3)
calc_assonance(text, window_len=3)

Индексы аллитерации и ассонанса списка слов - индекс повторов calc_repetition_index по согласным и по гласным буквам слов. Сравниваются буквы, а не звуки: оглушение, ударение и редукция не учитываются.

Параметр Тип По умолчанию Описание
text list[str] - Список слов
window_len int 3 Окно в словах (PHON_WINDOW_LEN)
calc_repetition_index(words, window_len, features=None)

Индекс повторов: число окон из window_len соседних слов, в которых признак (буква или звук) встречается минимум в двух словах, в сумме по признакам, деленное на число, ожидаемое при случайном порядке слов. Окно перемешанных слов - выборка без возвращения, поэтому для признака, который есть в \(K\) из \(N\) слов, окно из \(w\) слов содержит его минимум в двух словах с гипергеометрической вероятностью

\[ P = 1 - \frac{\binom{N-K}{w} + K \binom{N-K}{w-1}}{\binom{N}{w}} \]

а ожидаемое число - сумма этих вероятностей по признакам, умноженная на \(N - w + 1\) окон. Ожидаемое берется из самого текста, поэтому индекс показывает, собираются ли повторы в соседних словах, а не насколько частотен признак: в среднем по порядкам слов он равен 1 и заметно больше 1, когда повторы стоят ближе, чем при случайном порядке. Слово учитывает признак один раз; индекс равен nan для текста короче окна или без признака, общего для двух слов.

Параметр Тип По умолчанию Описание
words list[str] / list[list[str]] - Признаки каждого слова: строка его букв или коллекция его звуков
window_len int - Окно в словах, не меньше 2
features Collection[str] None Признаки для подсчета, по умолчанию все

Слова, которые не список строк или коллекций строк, и признаки, которые не коллекция строк, дают SourceTypeError, а window_len, который не целое число не меньше 2, - ParameterError.

Слоги

p_open_syllables · mean_syllable_len

Слоги - звуки каждого слога слова по syllable_sounds; слог без звука из классов (число) слогом не считается, в том числе в c_syllable_patterns. Открытый слог оканчивается на гласную по своему CV-шаблону (cv_pattern), а длина слога - длина этого шаблона: звуки классов без skipped и символов вне классов.

В ruTS длина слога - число его букв без ь и ъ.

is_open_syllable(syllable)

Проверяет, является ли слог открытым - оканчивается на гласную; ь и ъ после гласной слог не закрывают.

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

Функции ruTS принимают слова строками и считают по русским классам букв из таблицы выше. Функции calc_* проверяют аргументы: слова, которые не список строк, дают SourceTypeError, а окно, которое не целое число не меньше 2, - ParameterError.

from ruts.phon_stats import (
    calc_alliteration,
    calc_consonant_clusters,
    calc_cv_entropy,
    calc_hiatus,
    cv_pattern,
    is_open_syllable,
)

words = ["слышно", "бесшумно", "шуршат", "камыши", "у", "поэта"]
cv_pattern("всплеск"), is_open_syllable("съе")
calc_consonant_clusters(words)
calc_hiatus(words), calc_cv_entropy(words)
calc_alliteration(words, window_len=2)
('CCCCVCC', True)
{1: 8, 2: 5}
(1, 2.584962500721156)
1.4999999999999998

Методы

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

ps.get_stats()
{'p_vowels': 0.4032258064516129,
 'p_sonorants': 0.11290322580645161,
 'p_voiced': 0.1935483870967742,
 'p_voiceless': 0.2903225806451613,
 'consonant_vowel_ratio': 1.48,
 'p_heavy_clusters': 0.034482758620689655,
 'p_hiatus': 0.0,
 'cv_entropy': 3.1395722619867223,
 'hardness': 0.5625,
 'alliteration': 1.0916179337231968,
 'assonance': 0.8305084745762712,
 'p_open_syllables': 0.76,
 'mean_syllable_len': 2.48}