Package: ruts
Russian Texts Statistics (ruTS)Библиотека для извлечения статистик из текстов на русском языке.УстановкаВыполнить:$pipinstallrutsЗависимости:python 3.8+nltkpymorphy2razdelscipyspaCynumpypandasmatplotlibgraphvizФункционалОсновной функционал базируется на адаптированных для русского языка статистиках библиотекиtextacyи позволяет работать как непосредственно с текстами, так и с подготовленными Doc-объектами библиотекиspaCy.APIдля знакомства с доступными функциями.Извлечение объектовБиблиотека позволяет создавать свои инструменты для извлечения предложений и слов из текста, которые затем можно использовать при вычислении статистик.Пример:importrefromnltk.corpusimportstopwordsfromrutsimportSentsExtractor,WordsExtractortext="Не имей 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)]Базовые статистикиБиблиотека позволяет извлекать из текста следующие статистические показатели:количество предложенийколичество словколичество уникальных словколичество длинных словколичество сложных словколичество простых словколичество односложных словколичество многосложных словколичество символовколичество буквколичество пробеловколичество слоговколичество знаков препинанияраспределение слов по количеству буквраспределение слов по количеству слоговПример:fromrutsimportBasicStatstext="Существуют три вида лжи: ложь, наглая ложь и статистика"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, которые получили их на основе специально подобранных текстов с предварительными возрастными пометками.Пример:fromrutsimportReadabilityStatstext="Ног нет, а хожу, рта нет, а скажу: когда спать, когда вставать, когда работу начинать"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.Пример:fromrutsimportDiversityStatstext="Ног нет, а хожу, рта нет, а скажу: когда спать, когда вставать, когда работу начинать"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-TokenRatio(TTR)|0.92RootType-TokenRatio(RTTR)|7.17CorrectedType-TokenRatio(CTTR)|5.07HerdanType-TokenRatio(HTTR)|0.98SummerType-TokenRatio(STTR)|0.96MassType-TokenRatio(MTTR)|0.01DugastType-TokenRatio(DTTR)|85.82MovingAverageType-TokenRatio(MATTR)|0.91MeanSegmentalType-TokenRatio(MSTTR)|0.94MeasureofTextualLexicalDiversity(MTLD)|208.38MovingAverageMeasureofTextualLexicalDiversity(MTLD)|1.00HypergeometricDistributionD(HD-D)|0.94ИндексСимпсона|305.00Гапакс-индекс|2499.46Морфологические статистикиБиблиотека позволяет извлекать из текста следующие морфологические признаки:часть речиодушевленностьвидпадежродсовместностьнаклонениечислолицовремяпереходностьзалогДля морфологического разбора текста используется библиотекаpymorphy2. Описание статистик взяты из корпусаOpenCorpora.Пример:fromrutsimportMorphStatstext="Постарайтесь получить то, что любите, иначе придется полюбить то, что получили"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 - полное собрание сочинений И.В. СталинаСуществует возможность работать как с чистыми текстами (без заголовочной информации), так и с записями, а также фильтровать их по различным критериям.Пример:fromruts.datasetsimportSovChLitsc=SovChLit()sc.info{'description':'Корпус советских хрестоматий по литературе','url':'https://dataverse.harvard.edu/file.xhtml?fileId=3670902&version=DRAFT','Наименование':'sov_chrest_lit'}foriinsc.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}foriinsc.get_texts(text_type='Басня',limit=1):pprint(i)('— Соседка, слышала ль ты добрую молву? — вбежавши, крысе мышь сказала:\n''— Ведь кошка, говорят, попалась в когти льву. Вот отдохнуть и нам пора ''настала!\n''— Не радуйся, мой свет,— ей крыса говорит в ответ,— и не надейся ''по-пустому.\n''Коль до когтей у них дойдёт, то, верно, льву не быть живому: сильнее кошки ''зверя нет.')ВизуализацияБиблиотека позволяет визуализировать тексты с помощью следующих видов графиков:Закон Ципфа (Zipf's law)Литературная дактилоскопия (Literature Fingerprinting)Дерево слов (Word Tree)Пример:fromcollectionsimportCounterfromnltk.corpusimportstopwordsfromrutsimportWordsExtractorfromruts.datasetsimportSovChLitfromruts.visualizersimportzipfsc=SovChLit()text='\n'.join([textfortextinsc.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 для следующих классов:BasicStatsDiversityStatsMorphStatsReadabilityStatsРусскоязычную модель spaCy можно скачать, выполнив команду:$python-mspacydownloadru_core_news_smПример:importrutsimportspacynlp=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 - компоненты spaCyconstants.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 - тесты компонентов spaCytest_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 - тесты визуализации Закон ЦипфаАвторыШкарин Сергей (kouki.sergey@gmail.com)Смирнова Екатерина (ekanerina@yandex.ru)АтрибуцияПожалуйста, используйте следующую 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}
}