nevmenandr's picture
Update README.md
406767a verified
metadata
license: mit
language:
  - ru
tags:
  - nlp
  - word2vec
  - dh

Overview

The model is built on texts of 19th century Russian prose (realism) in order to explore characters. Inspired by work on English literature.

Preparing data

The texts for the training corpus are taken from two datasets published in the Open Data Repository on Russian Literature and Folklore:

Собчук, Олег; Лекаревич, Евгения, 2020, "Корпус нарративной прозы XIX в.", https://doi.org/10.31860/openlit-2020.10-C004, Репозиторий открытых данных по русской литературе и фольклору, V2, UNF:6:b+jGaj4yVntc2WtSvZqumw== [fileUNF]

Казакова, Елена, 2023, "Забытые романы русских писателей из фондов Пушкинского Дома (1857–1917)", https://doi.org/10.31860/openlit-2023.12-C007, Репозиторий открытых данных по русской литературе и фольклору, V2, UNF:6:DCGrSrMDXXtoRfHBDWfS4A== [fileUNF]

Only texts published after 1845 (the era of realism) remain in the corpus. Texts presented in old orthography have been converted to modern orthography with the help of a package.

The texts are marked up using the Russian version of the booknlp library, which highlighted the characters of the fictional works.

Each character in the text was replaced by its id of kind:

Character-textid-{textid}-charid-{entity_id}

textid is an id of text made of hashsum of filename. Thus, textid is repeated as many times as there are characters in the corresponding text. The string is entirely unique.

The correspondences between character and id are fixed in a special file allcharsmapped_corr.csv included in the repository.

The texts were lemmatized by booknlp stop words and punctuation were excluded from them.

import os
from string import punctuation

# stoplist load

stoplist = {}
with open (stopwords) as f:
    for line in f:
        stoplist[line.strip()] = 1 # Perl habit. Better use set() in Python

# punctuation collect

punct = punctuation + '«»—–…“”\t'

fw = open('booknlp/train_lemmas.txt', 'w')
for fl in os.listdir(lemmas_txt):
    if not fl.endswith('.txt'):
        continue
    with open(os.path.join(lemmas_txt, fl)) as f:
        for line in f:
            words = []
            for word in line.split():
                word = word.strip(punct)
                if word in stoplist:
                    continue
                if word:
                    words.append(word)
            fw.write(' '.join(words) + '\n')
fw.close()

train_lemmas.txt included in the repository.

Usage

import csv

# load names of the characters dict

cd = {}
with open('allcharsmapped_corr.csv', 'r') as csvfile:
    reader = csv.reader(csvfile, delimiter=',')
    for row in reader:
        cd[row[0].strip(' "')] = {'name': row[1], 'filename': row[2], 'freq': row[3]}

Searching for the exact id

The name of the character from Home of the Gentry by Ivan Turgenev

for nm in cd:
    if 'Лаврецкий' in cd[nm]['name']:
        print(nm, cd[nm]['name'])

Character-textid-1233692858423997945-charid-74 Лаврецкий | Лаврецкого | Лаврецкому | Лаврецким | Лаврецких | Молодой Лаврецкий | молодой Лаврецкий | бедный Лаврецкий | XXXI Лаврецкий | XXXIII Однажды Лаврецкий

from gensim.models import Word2Vec
model = Word2Vec.load("w2vforms.model")
print(len(model.wv)) # vocabulary size 547986

words = ['Character-textid-1233692858423997945-charid-74'] # what to look up in model

for word in words:
    # search for word in model
    if word in modell.wv:
        print(cd[word]['name'])
        # 10 quasi-sinonyms:
        for i in modell.wv.most_similar(positive=[word], topn=10):
            # word, cosin distance
            try:
                print(cd[i[0]]['name'], cd[i[0]]['filename'], i[1])
            except:
                print(i[0], i[1])
            
        print('\n')
    else:
        # :(
        print(word + ' is not present in the model')
Лаврецкий | Лаврецкого | Лаврецкому | Лаврецким | Лаврецких | Молодой Лаврецкий | молодой Лаврецкий | бедный Лаврецкий | XXXI Лаврецкий | XXXIII Однажды Лаврецкий
Лиза | Лизы | Лизе | Лизу | Лизой | мою дочь Лизу | XXXIV Лиза | Лизе , которой только что пошел пятый год | Лиза , которая очень любила цветы | XLII Лиза turgenev_i_dvoryanskoe_gnezdo_1859 0.7776555418968201
Наталья | Наталья Алексеевна | Наталье | Натальи | Натальей | Наталье Алексеевне | Наталью | Наталью Алексеевну | Натальей Алексеевной | дочь Наталья turgenev_i_rudin_1856 0.7085265517234802
Юлия Николаевна | Юлии Николаевне | Сухаревой | Юлии Николаевны | Юлией Николаевной | старухи Сухаревой | Юлии Николаевны Сухаревой | его Юлии Николаевне Сухаревой | Юлии Николаевне Сухаревой | легкомысленной и пустой старухи Сухаревой sheller-mikhajlov_a_bespechalnoe_zhite_1878 0.6840318441390991
Зинаида | Зинаиды | Зинаиду | Зинаидой | Зинаиде | Зина | Зинаида Александровна | мою прежнюю Зинаиду turgenev.pervaya_lyubov 0.68117755651474
Вася | Бояринов | Бояринова | Васю | Васи | Васе | Бояринову | Бояриновым | Васи Бояринова | Спросил Вася iogel_m_mezhdu_vechnostyu_i_minutoj_1879 0.6781316995620728
Варвара Павловна | Варвару Павловну | Изумленная Варвара Павловна | Варю | Варя turgenev_i_dvoryanskoe_gnezdo_1859 0.6774640679359436
Ластов | Лев Ильич | Ластова | г-н Ластов | Ластову | г. Ластов | Лев Ильич Ластов | Ластовым | г-на Ластова | Льву Ильичу avenarius.povetriye 0.6750389337539673
Иван Иваныч | Чуфрин | Иван Иваныч Чуфрин | Чуфрина | Чуфриных | господин Чуфрин | Иван Иваныч , уязвлённый этим предложением | Ваня | VII Иван Иваныч | VIII Иван Иваныч yasinskiy.bunt_ivana_ivanycha 0.6723058819770813
Character-textid-3765969217135438403-charid-397 0.6678720116615295
Ольга | Ольги | Ольге | Ольга Сергеевна | Ольгу | Ольгу Сергеевну | Бедная Ольга | ненаглядную Ольгу | милая Ольга | кроткая Ольга goncharov_i_oblomov_1859 0.6646437644958496

Examples

Quasi-sinonyms of the main characters of Russian literature of 19th century:

from gensim.models import Word2Vec
model = Word2Vec.load("w2vforms.model")

words = ['Character-textid--3155236403543629788-charid-1138', 'Character-textid-4423538860970409858-charid-48', 'Character-textid-1233692858423997945-charid-74', 'Character-textid--2263910210560212786-charid-33', 'Character-textid--3155236403543629788-charid-1360'] # what to look up in model

for word in words:
    # search for word in model
    if word in modell.wv:
        print(cd[word]['name'])
        # 10 quasi-sinonyms:
        for i in modell.wv.most_similar(positive=[word], topn=10):
            # word, cosin distance
            try:
                print(cd[i[0]]['name'], cd[i[0]]['filename'], i[1])
            except:
                print(i[0], i[1])
            
        print('\n')
    else:
        # :(
        print(word + ' is not present in the model')
Пьер | Пьера | Пьером | Безухов | Безухова | граф Безухов | Пьер Безухов | графиня Безухова | XVIII Пьер | В самом серьезном расположении духа Пьер
князь Андрей | Князь Андрей | князя Андрея | князю Андрею | Андрей | князем Андреем | Князю Андрею | князе Андрее | Андрея | Князя Андрея tolstoj_l_vojna_i_mir_1868 0.8172960877418518
Ростов | Николай | Ростова | Ростову | Ростовых | Николая | Ростовым | Николаю | Николаем | Ростовы tolstoj_l_vojna_i_mir_1868 0.7474682927131653
Вронский | Анна | Вронского | Вронским | Вронскому | Анны | Анне | Анну | Вронском | Аннушка tolstoj_l_anna_karenina_1877 0.710778534412384
Пьер | Пьера | Анна Павловна | Анны Павловны | Пьером | Анне Павловне | мсье Пьер | Анну Павловну | Пьера Анна Павловна | сам Пьер tolstoj_l_vojna_i_mir_1868 0.70228111743927
Алексей Александрович | Алексея Александровича | Алексею Александровичу | Каренина | Алексеем Александровичем | Каренин | Каренину | Алексей | Карениным | Алексее Александровиче tolstoj_l_anna_karenina_1877 0.6871339678764343
Наташа | Соня | Наташи | Наташу | Наташе | Наташей | Соню | И Наташа | заплаканную Соню | Наташа , оживленная и тревожная tolstoj_l_vojna_i_mir_1868 0.6745515465736389
Левин | Левина | Левину | Константин Левин | Костя | Константин Дмитрич | Константин | Левиным | Константина | Константину Левину tolstoj_l_anna_karenina_1877 0.6673250198364258
Ева | Евы | Ева Аркадьевна | Еву | Еве | Евой | Еву Аркадьевну | Евы Аркадьевны | Еве Аркадьевне | Евы , прислонившуюся к стене shapir_o_odna_iz_mnogikh_1879 0.6619721055030823
Литвинов | Ирина | Литвинова | Литвинову | Ирины | Литвиновым | Ирине | Ирину | Ириной | Литвинове turgenev_i_dym_1867 0.6617117524147034
Пьеру | Пьеру духовною tolstoj_l_vojna_i_mir_1868 0.6605013012886047


Базаров | Аркадий | Базарова | Аркадия | Аркадию | Базарову | Базаровым | Аркадием | Аркадию Базаров | господин Базаров
Павел Петрович | Павла Петровича | Павлу Петровичу | Павлом Петровичем | Павел | Кирсанов | Кирсанова | господин Кирсанов | изумленный Павел Петрович | один Павел Петрович turgenev_i_otzy_i_deti_1862 0.6954634785652161
Анна Сергеевна | Одинцова | Анны Сергеевны | Анну Сергеевну | Анне Сергеевне | Одинцову | Анна Сергеевна Одинцова | Одинцов | покойный Одинцов | расстановкой Одинцова turgenev_i_otzy_i_deti_1862 0.6822544932365417
Миропа Дмитриевна | Аггей Никитич | Миропе Дмитриевне | Миропу Дмитриевну | Аггея Никитича | Аггея Никитича Миропа Дмитриевна | Жила Миропа Дмитриевна | Рыжовых громадного капитана Аггея Никитича pisemskij_a_masony_1880 0.6790938973426819
Николай Петрович | Николая Петровича | Николаю Петровичу | Николай | Николая | Николая - чудотворца | бедному Николаю Петровичу | Николаем Петровичем turgenev_i_otzy_i_deti_1862 0.6720525622367859
Борис Андреич | Бориса Андреича | Борису Андреичу | Борисе Андреиче | Борис Андреич , который , как видно , ожидал этого приглашения с некоторым нетерпением | неугомонный Борис Андреич turgenev.dva_priyatelya 0.6555477380752563
Дмитрий | Дмитрия | Дмитрию | Дмитрием | чудесным Митей | Один Дмитрий | мать Дмитрия | моего Дмитрия | Дмитрий , старавшийся понимать любовь | Дмитрием , который , расхаживая взад и вперед , поправлял шеей галстук tolstoy.yunost 0.6510268449783325
Нежданов | Сипягин | Сипягина | Нежданова | Нежданову | Неждановым | Сипягиным | Сипягиной | Сипягину | Сипягиных turgenev_i_nov_1877 0.648989200592041
Катя | Аркадий | Катю | Катей | Аркадия | Кате | Аркадию | Аркадием | Кати | Катей Аркадий turgenev_i_otzy_i_deti_1862 0.6461668610572815
Петр Васильич | Петра Васильича | Петру Васильичу | Петром Васильичем | бедного Петра Васильича | бедный Петр Васильич | изумленный Петр Васильич turgenev.dva_priyatelya 0.6374654173851013
Одинцовой | матерью Одинцовой turgenev_i_otzy_i_deti_1862 0.6304344534873962


Лаврецкий | Лаврецкого | Лаврецкому | Лаврецким | Лаврецких | Молодой Лаврецкий | молодой Лаврецкий | бедный Лаврецкий | XXXI Лаврецкий | XXXIII Однажды Лаврецкий
Лиза | Лизы | Лизе | Лизу | Лизой | мою дочь Лизу | XXXIV Лиза | Лизе , которой только что пошел пятый год | Лиза , которая очень любила цветы | XLII Лиза turgenev_i_dvoryanskoe_gnezdo_1859 0.7776555418968201
Наталья | Наталья Алексеевна | Наталье | Натальи | Натальей | Наталье Алексеевне | Наталью | Наталью Алексеевну | Натальей Алексеевной | дочь Наталья turgenev_i_rudin_1856 0.7085265517234802
Юлия Николаевна | Юлии Николаевне | Сухаревой | Юлии Николаевны | Юлией Николаевной | старухи Сухаревой | Юлии Николаевны Сухаревой | его Юлии Николаевне Сухаревой | Юлии Николаевне Сухаревой | легкомысленной и пустой старухи Сухаревой sheller-mikhajlov_a_bespechalnoe_zhite_1878 0.6840318441390991
Зинаида | Зинаиды | Зинаиду | Зинаидой | Зинаиде | Зина | Зинаида Александровна | мою прежнюю Зинаиду turgenev.pervaya_lyubov 0.68117755651474
Вася | Бояринов | Бояринова | Васю | Васи | Васе | Бояринову | Бояриновым | Васи Бояринова | Спросил Вася iogel_m_mezhdu_vechnostyu_i_minutoj_1879 0.6781316995620728
Варвара Павловна | Варвару Павловну | Изумленная Варвара Павловна | Варю | Варя turgenev_i_dvoryanskoe_gnezdo_1859 0.6774640679359436
Ластов | Лев Ильич | Ластова | г-н Ластов | Ластову | г. Ластов | Лев Ильич Ластов | Ластовым | г-на Ластова | Льву Ильичу avenarius.povetriye 0.6750389337539673
Иван Иваныч | Чуфрин | Иван Иваныч Чуфрин | Чуфрина | Чуфриных | господин Чуфрин | Иван Иваныч , уязвлённый этим предложением | Ваня | VII Иван Иваныч | VIII Иван Иваныч yasinskiy.bunt_ivana_ivanycha 0.6723058819770813
Character-textid-3765969217135438403-charid-397 0.6678720116615295
Ольга | Ольги | Ольге | Ольга Сергеевна | Ольгу | Ольгу Сергеевну | Бедная Ольга | ненаглядную Ольгу | милая Ольга | кроткая Ольга goncharov_i_oblomov_1859 0.6646437644958496


Макар Девушкин | Макаром Девушкиным | Девушкин | Ваш Макар Девушкин | верный друг Макар Девушкин | пиита Девушкин | сам Девушкин | Ваш искренний друг Макар Девушкин | Покорнейший слуга ваш Макар Девушкин | Ваш истинный друг Макар Девушкин
Character-textid--2263910210560212786-charid-1338 0.7874115705490112
Господин Быков | господин Быков | господином Быковым | Быков | Пришел Быков | господина Быкова dostoevskij_f_bednye_lyudi_1846 0.7110390663146973
Character-textid--2263910210560212786-charid-2418 0.7024538516998291
Character-textid--140710273989214700-charid-8462 0.6931672692298889
Character-textid-3551276547489550704-charid-3779 0.6896138191223145
Федора | Федоре | Федору | Федора одна | одна Федора dostoevskij_f_bednye_lyudi_1846 0.6834926009178162
Character-textid--2858303605558076810-charid-1144 0.6813129782676697
Character-textid--8912134939089356531-charid-208 0.6811396479606628
никто | Никто sukhonin_p_rod_knyazej_zazepinykh_ili_borba_nachal_1880 0.6787088513374329
Варенька | Вареньке | бедной вашей Вареньке | бедную Вареньку dostoevskij_f_bednye_lyudi_1846 0.6780672073364258


Каратаев | Платон | Каратаева | Платон Каратаев | Платона | Каратаевым | Каратаеву | И Платон Каратаев | И Платон | Платону Каратаеву
Character-textid-7533511401374206894-charid-2111 0.6344175338745117
Державин | Державина | Державиным | Державину | сварливый и завистливый старик Державин | старика Державина | Старик Державин | спящего Державина | старик Державин | какого-то Державина mordovezv_d_dvenadzatyj_god_1879 0.6337519884109497
Character-textid-3795814502554737590-charid-6350 0.6170870661735535
Вольтер | Вольтера | Вольтере | Вольтером | вашего Вольтера mordovezv_d_dvenadzatyj_god_1879 0.6156854033470154
d'affaire 0.6151682138442993
Character-textid--8552851688621086804-charid-243 0.5999993085861206
Игорь 0.5925806164741516
затвержить 0.5910983681678772
Character-textid-2956570717353379843-charid-4950 0.5907760858535767
Мерзляков | Мерзлякову | Мерзляковым | Мерзляковы | Алексей Федорович | Алексей Федорович Мерзляков | профессор Мерзляков | почтеннейший Алексей Федорович | Мерзлякова | Мерзлякову ни с того ни с сего mordovezv_d_dvenadzatyj_god_1879 0.5906319618225098

Related Publication

Coming soon