Skip to content

Commit

Permalink
Реализована возможность подсчета нормализованных базовых статистик
Browse files Browse the repository at this point in the history
  • Loading branch information
Шкарин Сергей Сергеевич committed Sep 4, 2020
1 parent af02f62 commit 6e5a3eb
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 2 deletions.
24 changes: 23 additions & 1 deletion ruts/basic_stats.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ class BasicStats(object):
source (str|Doc): Источник данных (строка или объект Doc)
sents_extractor (SentsExtractor): Инструмент для извлечения предложений
words_extractor (WordsExtractor): Инструмент для извлечения слов
normalize (bool): Вычислять нормализованные статистики
Атрибуты:
c_letters (dict[int, int]): Распределение слов по количеству букв
Expand All @@ -51,6 +52,15 @@ class BasicStats(object):
n_spaces (int): Количество пробелов
n_syllables (int): Количество слогов
n_punctuations (int): Количество знаков препинания
p_unique_words (float): Нормализованное количество уникальных слов
p_long_words (float): Нормализованное количество длинных слов
p_complex_words (float): Нормализованное количество сложных слов
p_simple_words (float): Нормализованное количество простых слов
p_monosyllable_words (float): Нормализованное количество односложных слов
p_polysyllable_words (float): Нормализованное количество многосложных слов
p_letters (float): Нормализованное количество букв
p_spaces (float): Нормализованное количество пробелов
p_punctuations (float): Нормализованное количество знаков препинания
Методы:
get_stats: Получение вычисленных статистик текста
Expand All @@ -65,7 +75,8 @@ def __init__(
self,
source: Union[str, Doc],
sents_extractor: SentsExtractor = None,
words_extractor: WordsExtractor = None
words_extractor: WordsExtractor = None,
normalize: bool = False
):
if isinstance(source, Doc):
text = source.text
Expand Down Expand Up @@ -102,6 +113,17 @@ def __init__(
self.n_syllables = sum(syllables_per_word)
self.n_punctuations = sum((1 for char in text if char in PUNCTUATIONS))

if normalize:
self.p_unique_words = self.n_unique_words / self.n_words
self.p_long_words = self.n_long_words / self.n_words
self.p_complex_words = self.n_complex_words / self.n_words
self.p_simple_words = self.n_simple_words / self.n_words
self.p_monosyllable_words = self.n_monosyllable_words / self.n_words
self.p_polysyllable_words = self.n_polysyllable_words / self.n_words
self.p_letters = self.n_letters / self.n_chars
self.p_spaces = self.n_spaces / self.n_chars
self.p_punctuations = self.n_punctuations / self.n_chars

def get_stats(self) -> Dict[str, int]:
"""
Получение вычисленных статистик текста
Expand Down
29 changes: 28 additions & 1 deletion tests/test_basic_stats.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ def bs():
какого-либо его сегмента; тематический, или идеографический способ упорядочения значений слов. Отличительной особенностью тезаурусов по сравнению\
с формальными онтологиями является выход в сферу лексических значений, установление связей не только между значениями и выражающими их словами,\
а также между самими значениями (регистрация различных семантических отношений внутри словаря)."
bs_ = BasicStats(text)
bs_ = BasicStats(text, normalize=True)
return bs_

def test_init_value_error():
Expand Down Expand Up @@ -68,6 +68,33 @@ def test_n_words(bs):
def test_n_punctuations(bs):
assert bs.n_punctuations == 12

def test_p_unique_words(bs):
assert bs.p_unique_words == pytest.approx(0.91, rel=0.1)

def test_p_long_words(bs):
assert bs.p_long_words == pytest.approx(0.67, rel=0.1)

def test_p_complex_words(bs):
assert bs.p_complex_words == pytest.approx(0.39, rel=0.1)

def test_p_simple_words(bs):
assert bs.p_simple_words == pytest.approx(0.57, rel=0.1)

def test_p_monosyllable_words(bs):
assert bs.p_monosyllable_words == pytest.approx(0.13, rel=0.1)

def test_p_polysyllable_words(bs):
assert bs.p_polysyllable_words == pytest.approx(0.83, rel=0.1)

def test_p_letters(bs):
assert bs.p_letters == pytest.approx(0.82, rel=0.1)

def test_p_spaces(bs):
assert bs.p_spaces == pytest.approx(0.15, rel=0.1)

def test_p_punctuations(bs):
assert bs.p_punctuations == pytest.approx(0.02, rel=0.1)

def test_get_stats(bs):
stats = bs.get_stats()
assert isinstance(stats, dict)
Expand Down

0 comments on commit 6e5a3eb

Please sign in to comment.