Russian Texts Statistics


Keywords
NLP, natural, language, processing, CL, computational, linguistics, text, analytics, russian, computational-linguistics, natural-language-processing, russian-specific, text-analytics
License
MIT
Install
pip install ruts==0.1.0

Documentation

Russian Texts Statistics (ruTS) README_RU README_EN

Version Supported Python versions Downloads Build Status codecov Status License Repo size Codacy grade

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для извлСчСния статистик ΠΈΠ· тСкстов Π½Π° русском языкС.

Установка

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ:

$ pip install ruts

Зависимости:

  • python 3.8+
  • nltk
  • pymorphy2
  • razdel
  • scipy
  • spaCy
  • numpy
  • pandas
  • matplotlib
  • graphviz

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»

Основной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» базируСтся Π½Π° Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… для русского языка статистиках Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ textacy ΠΈ позволяСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ нСпосрСдствСнно с тСкстами, Ρ‚Π°ΠΊ ΠΈ с ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΌΠΈ Doc-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ spaCy.

API для знакомства с доступными функциями.

Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ свои инструмСнты для извлСчСния ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ слов ΠΈΠ· тСкста, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Ρ‚Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ вычислСнии статистик.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

import re
from nltk.corpus import stopwords
from ruts import SentsExtractor, WordsExtractor
text = "НС ΠΈΠΌΠ΅ΠΉ 100 Ρ€ΡƒΠ±Π»Π΅ΠΉ, Π° ΠΈΠΌΠ΅ΠΉ 100 Π΄Ρ€ΡƒΠ·Π΅ΠΉ"
se = SentsExtractor(tokenizer=re.compile(r', '))
se.extract(text)

    ('НС ΠΈΠΌΠ΅ΠΉ 100 Ρ€ΡƒΠ±Π»Π΅ΠΉ', 'Π° ΠΈΠΌΠ΅ΠΉ 100 Π΄Ρ€ΡƒΠ·Π΅ΠΉ')

we = WordsExtractor(use_lexemes=True, stopwords=stopwords.words('russian'), filter_nums=True, ngram_range=(1, 2))
we.extract(text)

    ('ΠΈΠΌΠ΅Ρ‚ΡŒ', 'Ρ€ΡƒΠ±Π»ΡŒ', 'ΠΈΠΌΠ΅Ρ‚ΡŒ', 'Π΄Ρ€ΡƒΠ³', 'ΠΈΠΌΠ΅Ρ‚ΡŒ_Ρ€ΡƒΠ±Π»ΡŒ', 'Ρ€ΡƒΠ±Π»ΡŒ_ΠΈΠΌΠ΅Ρ‚ΡŒ', 'ΠΈΠΌΠ΅Ρ‚ΡŒ_Π΄Ρ€ΡƒΠ³')
   
we.get_most_common(3)

    [('ΠΈΠΌΠ΅Ρ‚ΡŒ', 2), ('Ρ€ΡƒΠ±Π»ΡŒ', 1), ('Π΄Ρ€ΡƒΠ³', 1)]

Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ статистики

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° позволяСт ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ ΠΈΠ· тСкста ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ статистичСскиС ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ:

  • количСство ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ
  • количСство слов
  • количСство ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… слов
  • количСство Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… слов
  • количСство слоТных слов
  • количСство простых слов
  • количСство однослоТных слов
  • количСство многослоТных слов
  • количСство символов
  • количСство Π±ΡƒΠΊΠ²
  • количСство ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ²
  • количСство слогов
  • количСство Π·Π½Π°ΠΊΠΎΠ² прСпинания
  • распрСдСлСниС слов ΠΏΠΎ количСству Π±ΡƒΠΊΠ²
  • распрСдСлСниС слов ΠΏΠΎ количСству слогов

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

from ruts import BasicStats
text = "Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚Ρ€ΠΈ Π²ΠΈΠ΄Π° Π»ΠΆΠΈ: лоТь, наглая лоТь ΠΈ статистика"
bs = BasicStats(text)
bs.get_stats()

    {'c_letters': {1: 1, 3: 2, 4: 3, 6: 1, 10: 2},
    'c_syllables': {1: 5, 2: 1, 3: 1, 4: 2},
    'n_chars': 55,
    'n_complex_words': 2,
    'n_letters': 45,
    'n_long_words': 3,
    'n_monosyllable_words': 5,
    'n_polysyllable_words': 4,
    'n_punctuations': 2,
    'n_sents': 1,
    'n_simple_words': 7,
    'n_spaces': 8,
    'n_syllables': 18,
    'n_unique_words': 8,
    'n_words': 9}

bs.print_stats()

        Бтатистика     | Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 
    ------------------------------
    ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ         |    1     
    Π‘Π»ΠΎΠ²Π°               |    9     
    Π£Π½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ слова    |    8     
    Π”Π»ΠΈΠ½Π½Ρ‹Π΅ слова       |    3     
    Π‘Π»ΠΎΠΆΠ½Ρ‹Π΅ слова       |    2     
    ΠŸΡ€ΠΎΡΡ‚Ρ‹Π΅ слова       |    7     
    ΠžΠ΄Π½ΠΎΡΠ»ΠΎΠΆΠ½Ρ‹Π΅ слова   |    5     
    ΠœΠ½ΠΎΠ³ΠΎΡΠ»ΠΎΠΆΠ½Ρ‹Π΅ слова  |    4     
    Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹             |    55    
    Π‘ΡƒΠΊΠ²Ρ‹               |    45    
    ΠŸΡ€ΠΎΠ±Π΅Π»Ρ‹             |    8     
    Π‘Π»ΠΎΠ³ΠΈ               |    18
    Π—Π½Π°ΠΊΠΈ прСпинания    |    2

ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ удобочитаСмости

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° позволяСт Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ для тСкста ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ удобочитаСмости:

  • ВСст ЀлСша-Кинкайда
  • ИндСкс удобочитаСмости ЀлСша
  • ИндСкс Колман-Π›ΠΈΠ°Ρƒ
  • ИндСкс SMOG
  • АвтоматичСский индСкс удобочитаСмости
  • ИндСкс удобочитаСмости LIX

ΠšΠΎΡΡ„Ρ„ΠΈΡ†ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ для русского языка Π±Ρ‹Π»ΠΈ взяты ΠΈΠ· Ρ€Π°Π±ΠΎΡ‚Ρ‹ исслСдоватСлСй ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Plain Russian Language, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΠΈΡ… Π½Π° основС ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π°Π½Π½Ρ‹Ρ… тСкстов с ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ возрастными ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΠ°ΠΌΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

from ruts import ReadabilityStats
text = "Ног Π½Π΅Ρ‚, Π° Ρ…ΠΎΠΆΡƒ, Ρ€Ρ‚Π° Π½Π΅Ρ‚, Π° скаТу: ΠΊΠΎΠ³Π΄Π° ΡΠΏΠ°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²ΡΡ‚Π°Π²Π°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ"
rs = ReadabilityStats(text)
rs.get_stats()

    {'automated_readability_index': 0.2941666666666656,
    'coleman_liau_index': 0.2941666666666656,
    'flesch_kincaid_grade': 3.4133333333333304,
    'flesch_reading_easy': 83.16166666666666,
    'lix': 48.333333333333336,
    'smog_index': 0.05}

rs.print_stats()

                    ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠ°                 | Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 
    --------------------------------------------------
    ВСст ЀлСша-Кинкайда                     |   3.41   
    ИндСкс удобочитаСмости ЀлСша            |  83.16   
    ИндСкс Колман-Π›ΠΈΠ°Ρƒ                      |   0.29   
    ИндСкс SMOG                             |   0.05   
    АвтоматичСский индСкс удобочитаСмости   |   0.29   
    ИндСкс удобочитаСмости LIX              |  48.33  

ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ лСксичСского разнообразия

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° позволяСт Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ для тСкста ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ лСксичСского разнообразия:

  • Type-Token Ratio (TTR)
  • Root Type-Token Ratio (RTTR)
  • Corrected Type-Token Ratio (CTTR)
  • Herdan Type-Token Ratio (HTTR)
  • Summer Type-Token Ratio (STTR)
  • Mass Type-Token Ratio (MTTR)
  • Dugast Type-Token Ratio (DTTR)
  • Moving Average Type-Token Ratio (MATTR)
  • Mean Segmental Type-Token Ratio (MSTTR)
  • Measure of Textual Lexical Diversity (MTLD)
  • Moving Average Measure of Textual Lexical Diversity (MAMTLD)
  • Hypergeometric Distribution D (HD-D)
  • ИндСкс Бимпсона
  • Гапакс-индСкс

Π§Π°ΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ взята ΠΈΠ· ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° lexical_diversity.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

from ruts import DiversityStats
text = "Ног Π½Π΅Ρ‚, Π° Ρ…ΠΎΠΆΡƒ, Ρ€Ρ‚Π° Π½Π΅Ρ‚, Π° скаТу: ΠΊΠΎΠ³Π΄Π° ΡΠΏΠ°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²ΡΡ‚Π°Π²Π°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ"
ds = DiversityStats(text)
ds.get_stats()

    {'ttr': 0.7333333333333333,
    'rttr': 2.840187787218772,
    'cttr': 2.008316044185609,
    'httr': 0.8854692840710253,
    'sttr': 0.2500605793160845,
    'mttr': 0.0973825075623254,
    'dttr': 10.268784661968104,
    'mattr': 0.7333333333333333,
    'msttr': 0.7333333333333333,
    'mtld': 15.0,
    'mamtld': 11.875,
    'hdd': -1,
    'simpson_index': 21.0,
    'hapax_index': 431.2334616537499}

ds.print_stats()

                              ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠ°                           | Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 
    ----------------------------------------------------------------------
    Type-Token Ratio (TTR)                                      |   0.92   
    Root Type-Token Ratio (RTTR)                                |   7.17   
    Corrected Type-Token Ratio (CTTR)                           |   5.07   
    Herdan Type-Token Ratio (HTTR)                              |   0.98   
    Summer Type-Token Ratio (STTR)                              |   0.96   
    Mass Type-Token Ratio (MTTR)                                |   0.01   
    Dugast Type-Token Ratio (DTTR)                              |  85.82   
    Moving Average Type-Token Ratio (MATTR)                     |   0.91   
    Mean Segmental Type-Token Ratio (MSTTR)                     |   0.94   
    Measure of Textual Lexical Diversity (MTLD)                 |  208.38  
    Moving Average Measure of Textual Lexical Diversity (MTLD)  |   1.00   
    Hypergeometric Distribution D (HD-D)                        |   0.94   
    ИндСкс Бимпсона                                             |  305.00  
    Гапакс-индСкс                                               | 2499.46  

ΠœΠΎΡ€Ρ„ΠΎΠ»ΠΎΠ³ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ статистики

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° позволяСт ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ ΠΈΠ· тСкста ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ морфологичСскиС ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΈ:

  • Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π΅Ρ‡ΠΈ
  • ΠΎΠ΄ΡƒΡˆΠ΅Π²Π»Π΅Π½Π½ΠΎΡΡ‚ΡŒ
  • Π²ΠΈΠ΄
  • ΠΏΠ°Π΄Π΅ΠΆ
  • Ρ€ΠΎΠ΄
  • ΡΠΎΠ²ΠΌΠ΅ΡΡ‚Π½ΠΎΡΡ‚ΡŒ
  • Π½Π°ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅
  • число
  • Π»ΠΈΡ†ΠΎ
  • врСмя
  • ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π½ΠΎΡΡ‚ΡŒ
  • Π·Π°Π»ΠΎΠ³

Для морфологичСского Ρ€Π°Π·Π±ΠΎΡ€Π° тСкста ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° pymorphy2. ОписаниС статистик взяты ΠΈΠ· корпуса OpenCorpora.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

from ruts import MorphStats
text = "ΠŸΠΎΡΡ‚Π°Ρ€Π°ΠΉΡ‚Π΅ΡΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π»ΡŽΠ±ΠΈΡ‚Π΅, ΠΈΠ½Π°Ρ‡Π΅ придСтся ΠΏΠΎΠ»ΡŽΠ±ΠΈΡ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ"
ms = MorphStats(text)
ms.pos

    ('VERB', 'INFN', 'CONJ', 'CONJ', 'VERB', 'ADVB', 'VERB', 'INFN', 'CONJ', 'CONJ', 'VERB')

ms.get_stats()

    {'animacy': {None: 11},
    'aspect': {None: 5, 'impf': 1, 'perf': 5},
    'case': {None: 11},
    'gender': {None: 11},
    'involvement': {None: 10, 'excl': 1},
    'mood': {None: 7, 'impr': 1, 'indc': 3},
    'number': {None: 7, 'plur': 3, 'sing': 1},
    'person': {None: 9, '2per': 1, '3per': 1},
    'pos': {'ADVB': 1, 'CONJ': 4, 'INFN': 2, 'VERB': 4},
    'tense': {None: 8, 'futr': 1, 'past': 1, 'pres': 1},
    'transitivity': {None: 5, 'intr': 2, 'tran': 4},
    'voice': {None: 11}}

ms.explain_text(filter_none=True)

    (('ΠŸΠΎΡΡ‚Π°Ρ€Π°ΠΉΡ‚Π΅ΡΡŒ',
        {'aspect': 'perf',
        'involvement': 'excl',
        'mood': 'impr',
        'number': 'plur',
        'pos': 'VERB',
        'transitivity': 'intr'}),
    ('ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ', {'aspect': 'perf', 'pos': 'INFN', 'transitivity': 'tran'}),
    ('Ρ‚ΠΎ', {'pos': 'CONJ'}),
    ('Ρ‡Ρ‚ΠΎ', {'pos': 'CONJ'}),
    ('Π»ΡŽΠ±ΠΈΡ‚Π΅',
        {'aspect': 'impf',
        'mood': 'indc',
        'number': 'plur',
        'person': '2per',
        'pos': 'VERB',
        'tense': 'pres',
        'transitivity': 'tran'}),
    ('ΠΈΠ½Π°Ρ‡Π΅', {'pos': 'ADVB'}),
    ('придСтся',
        {'aspect': 'perf',
        'mood': 'indc',
        'number': 'sing',
        'person': '3per',
        'pos': 'VERB',
        'tense': 'futr',
        'transitivity': 'intr'}),
    ('ΠΏΠΎΠ»ΡŽΠ±ΠΈΡ‚ΡŒ', {'aspect': 'perf', 'pos': 'INFN', 'transitivity': 'tran'}),
    ('Ρ‚ΠΎ', {'pos': 'CONJ'}),
    ('Ρ‡Ρ‚ΠΎ', {'pos': 'CONJ'}),
    ('ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ',
        {'aspect': 'perf',
        'mood': 'indc',
        'number': 'plur',
        'pos': 'VERB',
        'tense': 'past',
        'transitivity': 'tran'}))

ms.print_stats('pos', 'tense')

    ---------------Π§Π°ΡΡ‚ΡŒ Ρ€Π΅Ρ‡ΠΈ---------------
    Π“Π»Π°Π³ΠΎΠ» (личная Ρ„ΠΎΡ€ΠΌΠ°)         |    4     
    Боюз                          |    4     
    Π“Π»Π°Π³ΠΎΠ» (ΠΈΠ½Ρ„ΠΈΠ½ΠΈΡ‚ΠΈΠ²)            |    2     
    НарСчиС                       |    1     

    -----------------ВрСмя------------------
    НСизвСстно                    |    8     
    НастоящСС                     |    1     
    Π‘ΡƒΠ΄ΡƒΡ‰Π΅Π΅                       |    1     
    ΠŸΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅                     |    1 

Наборы Π΄Π°Π½Π½Ρ‹Ρ…

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° позволяСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с нСсколькими Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΏΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΌΠΈ Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…:

  • sov_chrest_lit - совСтскиС хрСстоматии ΠΏΠΎ Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π΅
  • stalin_works - ΠΏΠΎΠ»Π½ΠΎΠ΅ собраниС сочинСний И.Π’. Π‘Ρ‚Π°Π»ΠΈΠ½Π°

БущСствуСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ с чистыми тСкстами (Π±Π΅Π· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ), Ρ‚Π°ΠΊ ΠΈ с записями, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… ΠΏΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ критСриям.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

from ruts.datasets import SovChLit
sc = SovChLit()
sc.info

    {'description': 'ΠšΠΎΡ€ΠΏΡƒΡ совСтских хрСстоматий ΠΏΠΎ Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π΅',
    'url': 'https://dataverse.harvard.edu/file.xhtml?fileId=3670902&version=DRAFT',
    'НаимСнованиС': 'sov_chrest_lit'}

for i in sc.get_records(max_len=100, category='ВСсна', limit=1):
    pprint(i)

    {'author': 'Π•. Π’Ρ€ΡƒΡ‚Π½Π΅Π²Π°',
    'book': 'Родная Ρ€Π΅Ρ‡ΡŒ. Книга для чтСния Π² I классС Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ ΡˆΠΊΠΎΠ»Ρ‹',
    'category': 'ВСсна',
    'file': PosixPath('../ruTS/ruts_data/texts/sov_chrest_lit/grade_1/155'),
    'grade': 1,
    'subject': 'Π”ΠΎΠΆΠ΄ΠΈΠΊ',
    'text': 'Π”ΠΎΠΆΠ΄ΠΈΠΊ, Π΄ΠΎΠΆΠ΄ΠΈΠΊ, ΠΏΠΎΠ»ΠΈΠ²Π°ΠΉ, Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Π»Π΅Π±Π° ΠΊΠ°Ρ€Π°Π²Π°ΠΉ!\n'
            'Π”ΠΎΠΆΠ΄ΠΈΠΊ, Π΄ΠΎΠΆΠ΄ΠΈΠΊ, припусти, Π΄Π°ΠΉ Π³ΠΎΡ€ΠΎΡ…Ρƒ подрасти!',
    'type': 'Π‘Ρ‚ΠΈΡ…ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ΠΈΠ΅',
    'year': 1963}

for i in sc.get_texts(text_type='Басня', limit=1):
    pprint(i)

    ('β€” БосСдка, ΡΠ»Ρ‹ΡˆΠ°Π»Π° ль Ρ‚Ρ‹ Π΄ΠΎΠ±Ρ€ΡƒΡŽ ΠΌΠΎΠ»Π²Ρƒ? β€” вбСТавши, крысС ΠΌΡ‹ΡˆΡŒ сказала:\n'
    'β€” Π’Π΅Π΄ΡŒ кошка, говорят, попалась Π² ΠΊΠΎΠ³Ρ‚ΠΈ Π»ΡŒΠ²Ρƒ. Π’ΠΎΡ‚ ΠΎΡ‚Π΄ΠΎΡ…Π½ΡƒΡ‚ΡŒ ΠΈ Π½Π°ΠΌ ΠΏΠΎΡ€Π° '
    'настала!\n'
    'β€” НС радуйся, ΠΌΠΎΠΉ свСт,β€” Π΅ΠΉ крыса Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ Π² ΠΎΡ‚Π²Π΅Ρ‚,β€” ΠΈ Π½Π΅ надСйся '
    'ΠΏΠΎ-пустому.\n'
    'Коль Π΄ΠΎ ΠΊΠΎΠ³Ρ‚Π΅ΠΉ Ρƒ Π½ΠΈΡ… Π΄ΠΎΠΉΠ΄Ρ‘Ρ‚, Ρ‚ΠΎ, Π²Π΅Ρ€Π½ΠΎ, Π»ΡŒΠ²Ρƒ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ ΠΆΠΈΠ²ΠΎΠΌΡƒ: сильнСС кошки '
    'звСря Π½Π΅Ρ‚.')

Визуализация

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° позволяСт Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ тСксты с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π²ΠΈΠ΄ΠΎΠ² Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ²:

  • Π—Π°ΠΊΠΎΠ½ Π¦ΠΈΠΏΡ„Π° (Zipf's law)
  • ЛитСратурная дактилоскопия (Literature Fingerprinting)
  • Π”Π΅Ρ€Π΅Π²ΠΎ слов (Word Tree)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

from collections import Counter
from nltk.corpus import stopwords
from ruts import WordsExtractor
from ruts.datasets import SovChLit
from ruts.visualizers import zipf

sc = SovChLit()
text = '\n'.join([text for text in sc.get_texts(limit=100)])
we = WordsExtractor(use_lexemes=True, stopwords=stopwords.words('russian'), filter_nums=True)
tokens_with_count = Counter(we.extract(text))
zipf(tokens_with_count, num_words=100, num_labels=10, log=False, show_theory=True, alpha=1.1)

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ spaCy для ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… классов:

  • BasicStats
  • DiversityStats
  • MorphStats
  • ReadabilityStats

Π ΡƒΡΡΠΊΠΎΡΠ·Ρ‹Ρ‡Π½ΡƒΡŽ модСль spaCy ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

$ python -m spacy download ru_core_news_sm

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

import ruts
import spacy
nlp = spacy.load('ru_core_news_sm')
nlp.add_pipe('basic', last=True)
doc = nlp("Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚Ρ€ΠΈ Π²ΠΈΠ΄Π° Π»ΠΆΠΈ: лоТь, наглая лоТь ΠΈ статистика")
doc._.basic.c_letters

    {1: 1, 3: 2, 4: 3, 6: 1, 10: 2}

doc._.basic.get_stats()

    {'c_letters': {1: 1, 3: 2, 4: 3, 6: 1, 10: 2},
    'c_syllables': {1: 5, 2: 1, 3: 1, 4: 2},
    'n_chars': 55,
    'n_complex_words': 2,
    'n_letters': 45,
    'n_long_words': 3,
    'n_monosyllable_words': 5,
    'n_polysyllable_words': 4,
    'n_punctuations': 2,
    'n_sents': 1,
    'n_simple_words': 7,
    'n_spaces': 8,
    'n_syllables': 18,
    'n_unique_words': 8,
    'n_words': 9}

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

  • docs - докумСнтация ΠΏΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ
  • ruts:
    • basic_stats.py - Π±Π°Π·ΠΎΠ²Ρ‹Π΅ тСкстовыС статистики
    • components.py - ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ spaCy
    • constants.py - основныС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ константы
    • diversity_stats.py - ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ лСксичСского разнообразия тСкста
    • extractors.py - инструмСнты для извлСчСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΠ· тСкста
    • morph_stats.py - морфологичСскиС статистики
    • readability_stats.py - ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ удобочитаСмости тСкста
    • utils.py - Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ инструмСнты
    • datasets - Π½Π°Π±ΠΎΡ€Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…:
      • dataset.py - Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…
      • sov_chrest_lit.py - совСтскиС хрСстоматии ΠΏΠΎ Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π΅
      • stalin_works.py - ΠΏΠΎΠ»Π½ΠΎΠ΅ собраниС сочинСний И.Π’. Π‘Ρ‚Π°Π»ΠΈΠ½Π°
    • visualizers - инструмСнты для Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ тСкстов:
      • fingerprinting.py - ЛитСратурная дактилоскопия
      • word_tree.py - Π”Π΅Ρ€Π΅Π²ΠΎ слов
      • zipf.py - Π—Π°ΠΊΠΎΠ½ Π¦ΠΈΠΏΡ„Π°
  • tests:
    • test_basic_stats.py - тСсты Π±Π°Π·ΠΎΠ²Ρ‹Ρ… тСкстовых статистик
    • test_components.py - тСсты ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² spaCy
    • test_diversity_stats.py - тСсты ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ лСксичСского разнообразия тСкста
    • test_extractors.py - тСсты инструмСнтов для извлСчСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΠ· тСкста
    • test_morph_stats - тСсты морфологичСских статистик
    • test_readability_stats.py - тСсты ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ удобочитаСмости тСкста
    • datasets - тСсты Π½Π°Π±ΠΎΡ€ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…:
      • test_dataset.py - тСсты Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…
      • test_sov_chrest_lit.py - тСсты Π½Π°Π±ΠΎΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ… совСтских хрСстоматий ΠΏΠΎ Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π΅
      • test_stalin_works.py - тСсты Π½Π°Π±ΠΎΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ собрания сочинСний И.Π’. Π‘Ρ‚Π°Π»ΠΈΠ½Π°
    • visualizers - тСсты инструмСнтов для Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ тСкстов:
      • test_fingerprinting.py - тСсты Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ЛитСратурная дактилоскопия
      • test_word_tree.py - тСсты Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π”Π΅Ρ€Π΅Π²ΠΎ слов
      • test_zipf.py - тСсты Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π—Π°ΠΊΠΎΠ½ Π¦ΠΈΠΏΡ„Π°

Авторы

Атрибуция

ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ BibTeX Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ для цитирования Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ruTS, Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π΅Π΅ Π² своих исслСдованиях ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…. Π¦ΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ являСтся ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ для дальнСйшСй Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

@software{ruTS,
  author = {Sergey Shkarin},
  title = {{ruTS, a library for statistics extraction from texts in Russian}},
  year = 2022,
  publisher = {Moscow},
  url = {https://github.com/SergeyShk/ruTS}
}