7 of 64 tests failed. (refresh)
Text | Expected | Actual | |
---|---|---|---|
По страсти? Какія у васъ антидилювіальныя мысли! Кто нынче говоритъ про страсти? —Лев Толсто́й | Won't work correctly until the "антидилювиа́льный" entry is added to the dictionary | По стра́сти? Каки́е у вас антидилювиальныя мы́сли! Кто ны́нче говори́т про стра́сти? —Лев Толсто́й | |
Она подошла къ Алексѣю Александровичу и съ фамильярностью близости смерти, взявъ его за руку, повлекла въ спальню. —Лев Толсто́й | Won't work correctly until the "за́ руку" entry is added to the dictionary | Она подошла́ к Алексе́ю Александровичу и с фамилья́рностью бли́зости сме́рти, взяв его́ за ру́ку, повлекла́ в спа́льню. —Лев Толсто́й | |
Они заселились в четырехзвездный отель. Две буквы ё в слове могут не быть корректно идентифицированы Lua-модулем. | Они́ засели́лись в четырёхзвё́здный оте́ль. Две бу́квы ё в сло́ве мо́гут не быть корре́ктно идентифици́рованы Lua-мо́дулем. | Они́ засели́лись в четырехзвездный оте́ль. Две бу́квы ё в сло́ве мо́гут не быть корре́ктно идентифици́рованы Lua-мо́дулем. | |
Содержимое ссылок игнорируется Lua-модулем. Примеры: "не Один" vs. "не Один" (имя бога). Но большого вреда от этого нет. | Содержи́мое ссы́лок игнори́руется Lua-мо́дулем. Приме́ры: "не О́дин" vs. "не О́дин" (и́мя бо́га). Но большо́го вреда́ от э́того нет. | Содержи́мое ссы́лок игнори́руется Lua-мо́дулем. Приме́ры: "не О́дин" vs. "не Один" (и́мя бо́га). Но большо́го вреда́ от э́того нет. | |
Содержимое ссылок игнорируется Lua-модулем. Примеры: "до смерти" vs. "до смерти". Пожалуйста пользуйтесь ссылками на предложно-именные сочетания целиком: "до смерти" | Содержи́мое ссы́лок игнори́руется Lua-мо́дулем. Приме́ры: "до смерти" vs. "до смерти". Пожа́луйста по́льзуйтесь ссы́лками на предложно-именны́е сочета́ния целико́м: "до смерти" | Содержи́мое ссы́лок игнори́руется Lua-мо́дулем. Приме́ры: "до смерти" vs. "до сме́рти". Пожа́луйста по́льзуйтесь ссы́лками на предложно-именны́е сочета́ния целико́м: "до смерти" | |
Как будто должны быть без ударения, но словарь не всегда согласен: либо, нибудь, надо, обо, ото, перед, передо, подо, предо, через (см. либо) | Как бу́дто должны́ быть без ударе́ния, но слова́рь не всегда́ согла́сен: либо, нибудь, надо, обо, ото, перед, передо, подо, предо, через (см. либо) | Как бу́дто должны́ быть без ударе́ния, но слова́рь не всегда́ согла́сен: ли́бо, нибудь, на́до, обо, ото, перед, пе́редо, подо, пре́до, че́рез (см. либо) |
Text | Expected | Actual | |
---|---|---|---|
без соли, за город, по воду, по лесу, на уши, под зиму, по цепи, на берег, на спину, на стену, на ногу, за ногу, за руку, на слово | без соли, за город, по воду, по лесу, на уши, под зиму, по цепи, на берег, на спину, на стену, на ногу, за ногу, за руку, на слово | без соли, за го́род, по во́ду, по лесу, на у́ши, под зи́му, по цепи, на берег, на спи́ну, на сте́ну, на но́гу, за но́гу, за ру́ку, на сло́во |
Text | Expected | Actual | |
---|---|---|---|
(антилопа), (зонтик)(собачья будка), галер(е́я), галер(ея), галер((ея)). Подо мной, перед входом. Галер, галер, галер( | (антило́па), (зо́нтик)(соба́чья бу́дка), галер(е́я), галер(ея), гале́р((её)). Подо мной, перед вхо́дом. Гале́р, гале́р, галер( | (антило́па), (зо́нтик)(соба́чья бу́дка), галер(е́я), галер(ея), гале́р((её)). Подо мной, перед вхо́дом. Гале́р, гале́р, галер( | |
лучезарный, лу̀чезарный, лу̀чезарны́й, лу̀чеза́рный, катарсис, ка́та́рсис, ка́та́рси́с, ка́тарсис, ката́рсис, катарси́с | лучеза́рный, лу̀чеза́рный, лу̀чезарны́й, лу̀чеза́рный, ка́та́рсис, ка́та́рсис, ка́та́рси́с, ка́тарсис, ката́рсис, катарси́с | лучеза́рный, лу̀чеза́рный, лу̀чезарны́й, лу̀чеза́рный, ка́та́рсис, ка́та́рсис, ка́та́рси́с, ка́тарсис, ката́рсис, катарси́с | |
до самой смерти, до́ смерти, до смерти | до самой сме́рти, до́ смерти, до смерти | до самой сме́рти, до́ смерти, до смерти | |
безтолочь, бе́зтолочь, бѐзтолочь | бе́столочь, бе́столочь, бѐстолочь | бе́столочь, бе́столочь, бѐстолочь |
Text | Expected | Actual | |
---|---|---|---|
В кухне злится повариха, Плачет у станка ткачиха, И завидуют оне Государевой жене. —Александр Пушкин | В ку́хне зли́тся повари́ха, Пла́чет у станка́ ткачи́ха, И зави́дуют оне́ Госуда́ревой жене́. —Алекса́ндр Пу́шкин | В ку́хне зли́тся повари́ха, Пла́чет у станка́ ткачи́ха, И зави́дуют оне́ Госуда́ревой жене́. —Алекса́ндр Пу́шкин | |
Порядок, аккуратность, правильность во всем — были его качествами, и он не выносил ни малейшего промаха в писании. До смерти он был мил и любезен в обращении с дамами. —Николай Костомаров | Поря́док, аккура́тность, пра́вильность во всем — бы́ли его́ ка́чествами, и он не выносил ни мале́йшего про́маха в писа́нии. До смерти он был мил и любе́зен в обраще́нии с да́мами. —Никола́й Костомаров | Поря́док, аккура́тность, пра́вильность во всем — бы́ли его́ ка́чествами, и он не выносил ни мале́йшего про́маха в писа́нии. До смерти он был мил и любе́зен в обраще́нии с да́мами. —Никола́й Костомаров | |
Кум, отошедши в сторону, бродил в длинных сапогах взад и вперед и наконец набрел прямо на шинок. —Николай Гоголь | Кум, отоше́дши в сто́рону, броди́л в дли́нных сапога́х взад и вперёд и наконе́ц набрёл пря́мо на шинок. —Никола́й Го́голь | Кум, отоше́дши в сто́рону, броди́л в дли́нных сапога́х взад и вперёд и наконе́ц набрёл пря́мо на шинок. —Никола́й Го́голь | |
А ведьма, между тем, поднялась так высоко, что одним только черным пятнышком мелькала вверху. —Николай Гоголь | А ве́дьма, ме́жду тем, подняла́сь так высоко, что одни́м то́лько чёрным пя́тнышком мелька́ла вверху́. —Никола́й Го́голь | А ве́дьма, ме́жду тем, подняла́сь так высоко, что одни́м то́лько чёрным пя́тнышком мелька́ла вверху́. —Никола́й Го́голь | |
Я слыхал о тамошних метелях и знал, что целые обозы бывали ими занесены. —Александр Пушкин | Я слыха́л о та́мошних мете́лях и знал, что це́лые обо́зы быва́ли ими занесены́. —Алекса́ндр Пу́шкин | Я слыха́л о та́мошних мете́лях и знал, что це́лые обо́зы быва́ли ими занесены́. —Алекса́ндр Пу́шкин | |
Белогорская крепость находилась в сорока верстах от Оренбурга. —Александр Пушкин | Белогорская кре́пость находи́лась в сорока вёрстах от Оренбу́рга. —Алекса́ндр Пу́шкин | Белогорская кре́пость находи́лась в сорока вёрстах от Оренбу́рга. —Алекса́ндр Пу́шкин | |
Входя в харчевню, он выпил рюмку водки и съел с какою-то начинкой пирог. —Фёдор Достоевский | Входя́ в харче́вню, он вы́пил рю́мку во́дки и съел с какою-то начи́нкой пиро́г. —Фёдор Достое́вский | Входя́ в харче́вню, он вы́пил рю́мку во́дки и съел с какою-то начи́нкой пиро́г. —Фёдор Достое́вский | |
Стояли крошеные огурцы, черные сухари и резанная кусочками рыба; все это очень дурно пахло. —Фёдор Достоевский | Стоя́ли крошеные огурцы́, чёрные сухари́ и ре́занная кусо́чками ры́ба; все э́то о́чень ду́рно па́хло. —Фёдор Достое́вский | Стоя́ли крошеные огурцы́, чёрные сухари́ и ре́занная кусо́чками ры́ба; все э́то о́чень ду́рно па́хло. —Фёдор Достое́вский |
Text | Expected | Actual | |
---|---|---|---|
Въ кухнѣ злится повариха, Плачетъ у станка ткачиха — И завидуютъ онѣ Государевой женѣ. —Александр Пушкин | В ку́хне зли́тся повари́ха, Пла́чет у станка́ ткачи́ха — И зави́дуют они́ Госуда́ревой жене́. —Алекса́ндр Пу́шкин | В ку́хне зли́тся повари́ха, Пла́чет у станка́ ткачи́ха — И зави́дуют они́ Госуда́ревой жене́. —Алекса́ндр Пу́шкин | |
Но Кити и не ожидала большаго отъ кадрили. —Лев Толстой | Но Кити и не ожида́ла бо́льшего от кадри́ли. —Лев Толсто́й | Но Кити и не ожида́ла бо́льшего от кадри́ли. —Лев Толсто́й | |
Сверхъ того, заботы большого семейства безпрестанно мучили ее: то кормленіе грудного ребенка не шло, то нянька ушла, то, какъ теперь, заболѣлъ одинъ изъ дѣтей. —Лев Толстой | Сверх того́, забо́ты большо́го семе́йства беспреста́нно му́чили её: то кормле́ние грудно́го ребёнка не шло, то ня́нька ушла́, то, как тепе́рь, заболе́л оди́н из дете́й. —Лев Толсто́й | Сверх того́, забо́ты большо́го семе́йства беспреста́нно му́чили её: то кормле́ние грудно́го ребёнка не шло, то ня́нька ушла́, то, как тепе́рь, заболе́л оди́н из дете́й. —Лев Толсто́й | |
Безсмѣ́нный, несмѣняемый, не замѣняемый другимъ; всегдашній, постоянный. Безсмѣнная рать, первое русское постоянное войско, при Грозномъ. Безсмѣ́нность ж. состояніе безсмѣннаго. —Владиміръ Даль | Бессме́нный, несменяемый, не заменя́емый други́м; всегда́шний, постоя́нный. Бессме́нная рать, первое ру́сское постоя́нное во́йско, при Гро́зном. Бессме́нность ж. состоя́ние бессме́нного. —Влади́мир Даль | Бессме́нный, несменяемый, не заменя́емый други́м; всегда́шний, постоя́нный. Бессме́нная рать, первое ру́сское постоя́нное во́йско, при Гро́зном. Бессме́нность ж. состоя́ние бессме́нного. —Влади́мир Даль | |
Сапъ м. или сопъ (сопѣть), конская (и др. животн.) болѣзнь, съ сильными признаками насморка, который изнуряетъ лошадь до́ смерти; весьма заразительна и неизлечима. —Владиміръ Даль | Сап м. и́ли соп (сопе́ть), ко́нская (и др. животн.) боле́знь, с си́льными при́знаками на́сморка, кото́рый изнуря́ет ло́шадь до́ смерти; весьма́ зарази́тельна и неизлечи́ма. —Влади́мир Даль | Сап м. и́ли соп (сопе́ть), ко́нская (и др. животн.) боле́знь, с си́льными при́знаками на́сморка, кото́рый изнуря́ет ло́шадь до́ смерти; весьма́ зарази́тельна и неизлечи́ма. —Влади́мир Даль | |
Мастера́ немцы корзины плѣсти. Балахонки до́слѣпу кружева плетут. Плѣсти́ по́дъ руку, перекидывая прядь не сверху, а подъ низ. —Влади́мир Даль | Мастера́ не́мцы корзи́ны плести́. Балахонки до́слепу кружева плету́т. Плести́ по́д руку, переки́дывая прядь не све́рху, а под низ. —Влади́мир Даль | Мастера́ не́мцы корзи́ны плести́. Балахонки до́слепу кружева плету́т. Плести́ по́д руку, переки́дывая прядь не све́рху, а под низ. —Влади́мир Даль | |
И тутъ только въ первый разъ все дѣло представилось ей совсѣмъ съ другой, новой стороны. —Лев Толстой | И тут то́лько в пе́рвый раз все де́ло предста́вилось ей совсе́м с друго́й, но́вой стороны. —Лев Толсто́й | И тут то́лько в пе́рвый раз все де́ло предста́вилось ей совсе́м с друго́й, но́вой стороны. —Лев Толсто́й | |
Когда они вышли, карета Вронскихъ уже отъѣхала. Входившіе люди все еще переговаривались о томъ, что случилось. —Лев Толстой | Когда́ они́ вы́шли, каре́та Вронских уже отъе́хала. Входи́вшие лю́ди все ещё перегова́ривались о том, что случи́лось. —Лев Толсто́й | Когда́ они́ вы́шли, каре́та Вронских уже отъе́хала. Входи́вшие лю́ди все ещё перегова́ривались о том, что случи́лось. —Лев Толсто́й | |
Осмотрѣвъ дѣтей, онѣ сѣли, уже однѣ, въ гостиной предъ кофеемъ. —Лев Толстой | Осмотре́в дете́й, они́ сели, уже одни́, в гости́ной пред кофеем. —Лев Толсто́й | Осмотре́в дете́й, они́ сели, уже одни́, в гости́ной пред кофеем. —Лев Толсто́й | |
Изъ-за густыхъ рѣсницъ ея блестящихъ глазъ вдругъ показались слезы. —Лев Толстой | Из-за густы́х ресни́ц её блестя́щих глаз вдруг показа́лись слезы. —Лев Толсто́й | Из-за густы́х ресни́ц её блестя́щих глаз вдруг показа́лись слезы. —Лев Толсто́й | |
Мы-таки добились свѣдѣнія изъ пензенскаго губернскаго правленія. —Лев Толстой | Мы-таки доби́лись сведения из пе́нзенского губе́рнского правле́ния. —Лев Толсто́й | Мы-таки доби́лись сведения из пе́нзенского губе́рнского правле́ния. —Лев Толсто́й | |
Куда дѣлась его всегда спокойная, твердая манера и безпечно спокойное выраженіе лица? —Лев Толстой | Куда́ де́лась его́ всегда́ споко́йная, твёрдая мане́ра и беспе́чно споко́йное выраже́ние лица? —Лев Толсто́й | Куда́ де́лась его́ всегда́ споко́йная, твёрдая мане́ра и беспе́чно споко́йное выраже́ние лица? —Лев Толсто́й | |
Чувство безпричиннаго стыда, которое она испытывала дорогой, и волненіе совершенно исчезли. —Лев Толстой | Чу́вство беспричи́нного стыда́, кото́рое она испы́тывала дорогой, и волне́ние соверше́нно исче́зли. —Лев Толсто́й | Чу́вство беспричи́нного стыда́, кото́рое она испы́тывала дорогой, и волне́ние соверше́нно исче́зли. —Лев Толсто́й | |
Самыя трансцендентныя понятія становятся мнѣ доступны, когда онъ говоритъ. —Лев Толстой | Са́мые трансценде́нтные поня́тия стано́вятся мне досту́пны, когда́ он говори́т. —Лев Толсто́й | Са́мые трансценде́нтные поня́тия стано́вятся мне досту́пны, когда́ он говори́т. —Лев Толсто́й | |
Вронскій, невольно подчиняясь ей, тоже ожидалъ чего-то независимаго отъ него, долженствовавшаго разъяснить всѣ затрудненія. —Лев Толстой | Вронский, нево́льно подчиня́ясь ей, то́же ожида́л чего́-то незави́симого от него́, долженствова́вшего разъяснить все затрудне́ния. —Лев Толсто́й | Вронский, нево́льно подчиня́ясь ей, то́же ожида́л чего́-то незави́симого от него́, долженствова́вшего разъяснить все затрудне́ния. —Лев Толсто́й | |
Обдумывая, что онъ скажетъ, онъ пожалѣлъ о томъ, что для домашняго употребленія, такъ незамѣтно, онъ долженъ употребить свое время и силы ума; —Лев Толсто́й | Обду́мывая, что он ска́жет, он пожале́л о том, что для дома́шнего употребле́ния, так незаме́тно, он до́лжен употреби́ть своё вре́мя и си́лы ума́; —Лев Толсто́й | Обду́мывая, что он ска́жет, он пожале́л о том, что для дома́шнего употребле́ния, так незаме́тно, он до́лжен употреби́ть своё вре́мя и си́лы ума́; —Лев Толсто́й | |
Извѣстіе о смерти Парѳена Денисыча непріятно подѣйствовало на него. —Лев Толстой | Изве́стие о сме́рти Парфена Денисыча неприя́тно поде́йствовало на него́. —Лев Толсто́й | Изве́стие о сме́рти Парфена Денисыча неприя́тно поде́йствовало на него́. —Лев Толсто́й | |
Прохоръ Бога забылъ, и на тѣ деньги, что ему подарилъ Левинъ, чтобы лошадь купить, пьетъ безъ просыпу и жену избилъ до смерти; —Лев Толстой | Прохор Бо́га забы́л, и на те деньги, что ему́ подари́л Левин, что́бы ло́шадь купи́ть, пьёт без просыпу и жену́ изби́л до смерти; —Лев Толсто́й | Прохор Бо́га забы́л, и на те деньги, что ему́ подари́л Левин, что́бы ло́шадь купи́ть, пьёт без просыпу и жену́ изби́л до смерти; —Лев Толсто́й | |
Въ 1374 г. заключено было перемиріе на годъ, но оно продолжалось до смерти Эдуарда III (1377 г.); —Иван Сытин | В 1374 г. заключено́ бы́ло переми́рие на год, но оно продолжа́лось до смерти Эдуа́рда III (1377 г.); —Ива́н Сытин | В 1374 г. заключено́ бы́ло переми́рие на год, но оно продолжа́лось до смерти Эдуа́рда III (1377 г.); —Ива́н Сытин | |
До двѣнадцати лѣтъ онъ прожилъ въ избѣ своего дѣда, добраго старика, любившаго читать священныя книги и увлекательно разсказывавшаго прочитанное и пережитое. —К. А. Хрѣновъ | До двена́дцати лет он прожил в избе́ своего́ де́да, до́брого старика́, люби́вшего чита́ть свяще́нные кни́ги и увлека́тельно расска́зывавшего прочи́танное и пережитое. —К. А. Хренов | До двена́дцати лет он прожил в избе́ своего́ де́да, до́брого старика́, люби́вшего чита́ть свяще́нные кни́ги и увлека́тельно расска́зывавшего прочи́танное и пережитое. —К. А. Хренов | |
Поздравительное письмо ея представляетъ самый пылкій диѳирамбъ великодушному Монарху, возстановившему истину. —Аѳанасій Фетъ | Поздрави́тельное письмо́ её представля́ет са́мый пы́лкий дифира́мб великоду́шному Мона́рху, восстанови́вшему и́стину. —Афана́сий Фет | Поздрави́тельное письмо́ её представля́ет са́мый пы́лкий дифира́мб великоду́шному Мона́рху, восстанови́вшему и́стину. —Афана́сий Фет | |
Та же женственная ѵпостась Божества проявляетъ себя въ исторіи человѣчества, какъ церковь. —Сергей Соловьев | Та же же́нственная ипоста́сь Божества́ проявля́ет себя́ в исто́рии челове́чества, как це́рковь. —Серге́й Соловьёв | Та же же́нственная ипоста́сь Божества́ проявля́ет себя́ в исто́рии челове́чества, как це́рковь. —Серге́й Соловьёв | |
Впрочемъ, этимъ дѣломъ постоянно занимался фельдъфебель, не знаю, самъ ли отъ себя или по приказанію. —Андрей Бекетов | Впро́чем, э́тим де́лом постоя́нно занима́лся фельдфе́бель, не зна́ю, сам ли от себя́ и́ли по приказа́нию. —Андре́й Беке́тов | Впро́чем, э́тим де́лом постоя́нно занима́лся фельдфе́бель, не зна́ю, сам ли от себя́ и́ли по приказа́нию. —Андре́й Беке́тов | |
Наконецъ, сколько Комитету извѣстно всѣ бѣлорусскія сочиненія печатаны были доселѣ польскими буквами. —Павел Кукольник | Наконе́ц, ско́лько Комите́ту изве́стно все белору́сские сочине́ния печа́таны бы́ли досе́ле по́льскими бу́квами. —Па́вел Кукольник | Наконе́ц, ско́лько Комите́ту изве́стно все белору́сские сочине́ния печа́таны бы́ли досе́ле по́льскими бу́квами. —Па́вел Кукольник |
Text | Expected | Actual | |
---|---|---|---|
В философской литерату́ре понятие ката́рсиса имеет более полутора тысяч различных толкований. | В филосо́фской литерату́ре поня́тие ката́рсиса име́ет бо́лее полу́тора ты́сяч разли́чных толкова́ний. | В филосо́фской литерату́ре поня́тие ката́рсиса име́ет бо́лее полу́тора ты́сяч разли́чных толкова́ний. | |
В 1247 году бристольская гавань была обустро́ена путем отведения русла Фро́ма несколько на запад. | В 1247 году бри́сто́льская га́вань была́ обустро́ена путём отведения ру́сла Фро́ма не́сколько на за́пад. | В 1247 году бри́сто́льская га́вань была́ обустро́ена путём отведения ру́сла Фро́ма не́сколько на за́пад. | |
Спасибо этому году! Ждем еще более интересных сюрпризов и потрясений в следующем. | Спаси́бо э́тому году! Ждём ещё бо́лее интере́сных сюрпри́зов и потрясе́ний в сле́дующем. | Спаси́бо э́тому году! Ждём ещё бо́лее интере́сных сюрпри́зов и потрясе́ний в сле́дующем. | |
Жуков и бабочек отлавливает юный натуралист Жуков. Он уже много таких жуков поймал. | Жуков и ба́бочек отла́вливает ю́ный натурали́ст Жу́ков. Он уже мно́го таки́х жуко́в пойма́л. | Жуков и ба́бочек отла́вливает ю́ный натурали́ст Жу́ков. Он уже мно́го таки́х жуко́в пойма́л. | |
Скандинавские боги Тор, Один и остальные известны всем. Жил у моря один человек. Один день ничего не решает. | Скандина́вские бо́ги Тор, О́дин и остальны́е изве́стны всем. Жил у моря оди́н челове́к. Один день ничего́ не реша́ет. | Скандина́вские бо́ги Тор, О́дин и остальны́е изве́стны всем. Жил у моря оди́н челове́к. Один день ничего́ не реша́ет. | |
Кубы грунта разбрасывает вокруг экскаватор. Экономика Венесуэлы, Кубы и прочих стран оставляет желать лучшего. | Кубы гру́нта разбра́сывает вокру́г экскава́тор. Эконо́мика Венесуэ́лы, Ку́бы и про́чих стран оставля́ет жела́ть лу́чшего. | Кубы гру́нта разбра́сывает вокру́г экскава́тор. Эконо́мика Венесуэ́лы, Ку́бы и про́чих стран оставля́ет жела́ть лу́чшего. | |
Темнофиолетовое трехмерное изображение трехко́мнатной квартиры из Кенигсберга выглядит замечательно. | Тёмнофиоле́товое трёхме́рное изображе́ние трёхко́мнатной кварти́ры из Кёнигсберга вы́глядит замеча́тельно. | Тёмнофиоле́товое трёхме́рное изображе́ние трёхко́мнатной кварти́ры из Кёнигсберга вы́глядит замеча́тельно. | |
Мама мыла раму. Благоустраивающаяся дамочка увидела посерьезневшее лицо таксиста. | Ма́ма мыла ра́му. Благоустра́ивающаяся да́мочка уви́дела посерьёзневшее лицо́ такси́ста. | Ма́ма мыла ра́му. Благоустра́ивающаяся да́мочка уви́дела посерьёзневшее лицо́ такси́ста. | |
В ассортименте представлены разнообразные мыла, кремы для тела, ног, рук, шампуни. | В ассортиме́нте предста́влены разнообра́зные мыла, кре́мы для тела, ног, рук, шампу́ни. | В ассортиме́нте предста́влены разнообра́зные мыла, кре́мы для тела, ног, рук, шампу́ни. | |
Стоят на полке ненужные бутылки. Они ничего не стоят. | Стоят на полке нену́жные буты́лки. Они́ ничего́ не стоят. | Стоят на полке нену́жные буты́лки. Они́ ничего́ не стоят. | |
Об этом полке сняты фильмы. | Об э́том полке сняты фи́льмы. | Об э́том полке сняты фи́льмы. | |
Его зовут Лука, он любит писать стихи о Елкине. Котяра повадился писать в тапки. | Его́ зову́т Лука́, он лю́бит писать стихи о Ёлкине. Котя́ра пова́дился писать в та́пки. | Его́ зову́т Лука́, он лю́бит писать стихи о Ёлкине. Котя́ра пова́дился писать в та́пки. | |
Лука и чеснока нам очень не хватает, особенно лука. | Лука и чеснока́ нам о́чень не хвата́ет, осо́бенно лука. | Лука и чеснока́ нам о́чень не хвата́ет, осо́бенно лука. | |
Перед ними простиралась километровая лука реки. | Перед ни́ми простира́лась километро́вая лука реки. | Перед ни́ми простира́лась километро́вая лука реки. | |
Никто не скроется от бдительного ока. Лука всё еще не спит и все его боятся. | Никто́ не скро́ется от бди́тельного о́ка. Лука всё ещё не спит и все его́ боя́тся. | Никто́ не скро́ется от бди́тельного о́ка. Лука всё ещё не спит и все его́ боя́тся. | |
В конце своего течения Ока доходит до Нижнего Новгорода, где впадает в Волгу. | В конце́ своего́ тече́ния Ока́ дохо́дит до Ни́жнего Но́вгорода, где впада́ет в Во́лгу. | В конце́ своего́ тече́ния Ока́ дохо́дит до Ни́жнего Но́вгорода, где впада́ет в Во́лгу. | |
Ока течет по территориям Орловской, Тульской, Калужской, Московской, Рязанской, Владимирской, Нижегородской областей. | Ока течёт по террито́риям Орло́вской, Ту́льской, Калу́жской, Моско́вской, Ряза́нской, Влади́мирской, Нижегоро́дской областе́й. | Ока течёт по террито́риям Орло́вской, Ту́льской, Калу́жской, Моско́вской, Ряза́нской, Влади́мирской, Нижегоро́дской областе́й. | |
Еж спрятался под елкой и посмотрел на небо. Что-то застряло у него в нёбе. | Ёж спря́тался под ёлкой и посмотре́л на небо. Что-то застря́ло у него́ в нёбе. | Ёж спря́тался под ёлкой и посмотре́л на небо. Что-то застря́ло у него́ в нёбе. | |
Орел присел на клен возле замка. | Орёл присе́л на клён во́зле замка. | Орёл присе́л на клён во́зле замка. | |
Мы хорошо узнаём математические символы и скоро узнаем, как решать это уравнение. | Мы хорошо́ узнаём математи́ческие си́мволы и ско́ро узнаем, как реша́ть э́то уравне́ние. | Мы хорошо́ узнаём математи́ческие си́мволы и ско́ро узнаем, как реша́ть э́то уравне́ние. | |
Дореформенная орфография ставит под угрозу благо Чикаго и Сантьяго. | Дореформенная орфогра́фия ста́вит под угро́зу бла́го Чика́го и Сантья́го. | Дореформенная орфогра́фия ста́вит под угро́зу бла́го Чика́го и Сантья́го. |
local export = {}
-- TODO: Implement more special cases from Benwing2's
-- https://github.com/benwing2/RuNounChanges/blob/master/auto_accent_auto_bracket_ru.py
-- All of these need to get proper test coverage.
-- TODO: Maybe handle words with more than one letter "ё". The whole dictionary only contains
-- just a few of them and for now we may just ignore them. See the "words_with_double_jo"
-- table returned from query_extra_info(). But ignoring these words is also safe.
-- TODO: Maybe have configuration knobs for enabling/disabling certain features? For example,
-- the pre-1918 orthography conversion could be turned off, forceful correction of the
-- incorrect accents in the original text could be done, maybe the words could be turned
-- into links, etc.
local decompose = require("Module:ru-common").decompose
local m_dict = require("Module:User:Ssvb/ru-accentdict")
local lookup_word = m_dict.lookup_word
local max_stress_search_steps = m_dict.query_extra_info()
local max_jo_search_steps = m_dict.query_extra_info()
local vowels = "аеёєэиіїоуюяыѣѵАЕЁЄЭИІЇОУЮЯЫѢѴ"
local vowel = ""
local nonvowel = ""
local GR = require("Module:string/char")(0x0300) -- grave
local AC = require("Module:string/char")(0x0301) -- acute
local rsubn = mw.ustring.gsub
local rfind = mw.ustring.find
local function rsub(term, foo, bar)
local retval = rsubn(term, foo, bar)
return retval
end
-- Try to add stress accent annotation to a word. Implemented via doing dictionary lookups
-- for all possible stress positions (taking into account the 'max_stress_search_steps'
-- statistical parameter as a useful performance optimization and an anti-DoS safeguard).
--
-- Returns:
-- unaccented word - the word is ambiguous and can't be safely accented
-- accented word - the suggested accent position
-- nil - abstain from making any accent placement decisions
local function try_to_recover_ac(word)
-- If the word with an already annotated accent is found in the dictionary, then it
-- is perfectly fine and gets our stamp of approval. If the word without an annotated
-- accent is found, then this is also perfectly fine because there are certain
-- multi-syllable words without accent (such as ] or ]), not to mention
-- many single-syllable words too. The author of the input text is likely to have
-- added explicit accent specifically to resolve ambiguity, so now we don't need
-- to do any further analysis to confirm this whether this was or wasn't the case.
if lookup_word(word) then
return word
end
-- If the word did have an accent, but wasn't found in the dictionary, then it's
-- possible that this happened because of a missing "ё". So abstain from making
-- any decision and return nil. Alternatively, the author of the text may have
-- just made a mistake with accenting, but it's not our call to judge him here.
if rfind(word, AC) then
return
end
-- There's no accents of any kind in the 'word' variable. So try to probe adding
-- accent in different positions, starting from the last vowel and going backwards.
local step, cnt, result = 0, 0, word
local tmp = rsub(word, "(" .. vowel .. ")(" .. nonvowel .. "*)$", "%1" .. AC .. "%2")
while word ~= tmp and step < max_stress_search_steps do
step = step + 1
word = tmp
if lookup_word(word) then
cnt = cnt + 1
-- Combine multiple accents in the 'result' variable, as this is needed for "ка́та́рсис"
-- and other similar words with multiple valid accent positions.
local accent_pos = word:find(AC)
result = result:sub(1, accent_pos - 1) .. AC .. result:sub(accent_pos)
end
tmp = rsub(word, "(" .. vowel .. ")(" .. nonvowel .. "*" .. vowel .. ")" .. AC, "%1" .. AC .. "%2")
end
if cnt > 1 then
-- If more than one accent position was found, then it's either something with multiple
-- valid accent positions like "ка́та́рсис" or an ambiguity between "замо́к" and "за́мок".
-- Doing a dictionary lookup for the word with the combined accents clarifies everything.
return (lookup_word(result) and result) or rsub(result, AC, "")
elseif cnt == 1 then
-- If only one possible accent position was found, then we have our answer
return result
end
end
-- Try to recover one missing "ё" letter in the word and also accent position.
-- Multiple "ё" letters in a single word are extremely uncommon, so this edge
-- case is not supported right now.
--
-- Returns:
-- unmodified word - the word is ambiguous and can't be modified safely
-- modified word - the suggested adjustment of the word
-- nil - abstain from making any word adjustment decisions
local flip_jejo = {
= "ё", = "е", = "Ё", = "Е"
}
local function try_to_recover_jo(word)
local step = 0
local tmp = rsub(word, "()(*)$", function (je, suffix)
return flip_jejo .. suffix end)
while word ~= tmp and step < max_jo_search_steps do
step = step + 1
word = tmp
local result = try_to_recover_ac(word)
if result then
return result
end
tmp = rsub(word, "()(*)()", function (je, midpart, jo)
return flip_jejo .. midpart .. flip_jejo end)
end
end
-- Strip accents, but save them in a table and return as a second return value
local function strip_accents(word)
local pos_gr, pos_ac = {}, {}
local cnt = 1
word = rsub(word, "(" .. vowel .. ")(?)", function (letter, stress)
if stress == AC then
pos_ac = true
elseif stress == GR then
pos_gr = true
end
cnt = cnt + 1
return letter
end)
return word, { pos_ac, pos_gr }
end
-- Restore the previously saved acute and grave accents, replacing any other accents
local function restore_accents(word, accents_backup_tbl)
local cnt = 1
return rsub(word, "(" .. vowel .. ")(*)", function (letter, stress)
if accents_backup_tbl then
stress = AC
elseif accents_backup_tbl then
stress = GR
else
stress = ""
end
cnt = cnt + 1
return letter .. stress
end)
end
-- Restore only the grave accent, keeping all other accents intact
local function restore_gr(word, accents_backup_tbl)
local cnt = 1
return rsub(word, "(" .. vowel .. ")(*)", function (letter, stress)
if accents_backup_tbl then
stress = GR
end
cnt = cnt + 1
return letter .. stress
end)
end
-- Restore the previously saved accents in a word and make somewhat smart
-- decisions about how to do it. If there were no accents saved, then just
-- keep accents in the word. If acute was saved, then override all accents.
-- Or just restore grave if it was present, while keeping the possibly
-- automatically assigned acute.
local function smart_restore_accents(word, accents_backup_tbl)
if next(accents_backup_tbl) ~= nil then
return restore_accents(word, accents_backup_tbl)
elseif next(accents_backup_tbl) ~= nil then
return restore_gr(word, accents_backup_tbl)
else
return word
end
end
-- Convert from the pre-1918 to modern Russian orthography. Check the following
-- links as reference materials for the conversion rules:
-- https://ru.wikisource.orghttps://dictious.com/en/Декрет_о_введении_нового_правописания
-- https://ru.wikisource.orghttps://dictious.com/en/Декрет_о_введении_новой_орфографии
-- https://arzamas.academy/materials/1164 and https://историк.рф/journal/post/6042
--
-- The idea is to apply changes to the pre-reform word until a match is found in
-- the modern dictionary. For example:
-- * the word "самыя" is not a correct modern spelling. So it's transformed
-- into "са́мые" and confirmed by a dictionary lookup.
-- * the word "любившаго" is not a correct modern spelling either and there are two
-- candidates for it: "любившого" and "любившего". The word "люби́вшего" is confirmed.
-- * the word "губернскаго" is not a correct modern spelling and there are two
-- candidates for it: "губернского" and "губернскего". The word "губе́рнского"
-- is confirmed.
-- * the word "большаго" is not a correct modern spelling and there are two candidates
-- for it: "большо́го" and "бо́льшего". Ironically, both of these candidates are
-- different correct words in modern spelling, albeit with different stress positions.
-- It's not totally clear, which variant to pick, but we prioritize "бо́льшего",
-- because "большого" is also a valid word in pre-reform spelling.
--
-- Technically, the underlying dictionary can have a separate section specifically
-- for identifying genitive singular adverbs, participles and pronouns for "-аго/-яго"
-- and nominative/accusative feminine/neuter plural adverbs, participles and
-- pronouns for "-ыя/-ія". But we'll cross that bridge when we get to it.
--
-- Additionally, it goes without saying that for doing correct conversion to modern
-- spelling, the dictionary MUST not be contaminated with pre-reform spelling forms.
-- So it's important to have all pre-reform Russian words correctly annotated in
-- English Wiktionary and this information should be machine readable.
local prereform_subst_words = {
= "они", = "одни", = "одних", = "одними", = "её",
= "Они", = "Одни", = "Одних", = "Одними", = "Её",
}
local prereform_subst_letters = {
= "е", = "Е", = "и", = "И", = "ф", = "Ф", = "и", = "И"
}
local prereform_subst_prefix = {
= "ис", = "вос", = "вс", = "рас", = "рос",
= "нис", = "бес", = "чрес", = "черес",
= "Ис", = "Вос", = "Вс", = "Рас", = "Рос",
= "Нис", = "Бес", = "Чрес", = "Черес",
}
local function with_different_orthography(callback_function, word)
-- Temporarily strip acute and grave accents
local word, accents_backup = strip_accents(word)
local have_ija = rfind(word, "ія$")
-- These transformations can be safely applied and hopefully don't cause any
-- ambiguity. But if a counter-example is presented, then some solution can
-- be found.
word = prereform_subst_words or word
word = rsub(word, ".", prereform_subst_letters)
word = rsub(word, "ъ$", "")
word = rsub(word, "ъ(" .. nonvowel .. ")", "%1")
word = rsub(word, "^(+з)()", function (pref, letter)
return (prereform_subst_prefix or pref) .. letter
end)
local tmp = callback_function(word)
if tmp then
return smart_restore_accents(tmp, accents_backup)
end
-- There's a possible ambiguity in "бѣлорусскія сочиненія", because the
-- former needs to be converted to "белору́сские" and the latter needs to
-- be converted to "сочине́ния" despite both having the "-ія" suffix. This
-- ambiguity is resolved by doing dictionary lookups.
tmp = rsub(word, "аго$", "его")
tmp = rsub(tmp, "яго$", "его")
tmp = rsub(tmp, "ыя$", "ые")
if have_ija then
tmp = rsub(tmp, "ия$", "ие")
end
if tmp ~= word then
local result = callback_function(tmp)
if result then
return smart_restore_accents(result, accents_backup)
end
end
-- There's another ambiguity in "независимаго отъ него, долженствовавшаго". One
-- word needs to be converted to "незави́симого" and another to "долженствовавшего"
-- despite both having the "-аго" suffix. This is again resolved by doing one
-- more dictionary lookup.
tmp = rsub(word, "аго$", "ого")
if tmp ~= word then
local result = callback_function(tmp)
if result then
return smart_restore_accents(result, accents_backup)
end
end
return restore_accents(word, accents_backup)
end
-- Combine two alternative 'subst1' and 'subst2' word alternation variants, such
-- as an accent or "ё" recovery. They may possibly agree with each other, conflict
-- each other or simply abstain (nil means 'no real opinion'). This function merges
-- them into a single one. The 'word' argument is a fallback variant.
local function evaluate_alternatives(subst1, subst2, word)
if not subst1 then
return subst2
end
if not subst2 then
return subst1
end
if subst1 ~= subst2 then
return word
else
return subst1
end
end
-- Try to do something using a callback function with both the original and the
-- de-capitalized variants of the same word to see if we end up getting different
-- results (such as, for example, "Ока́" vs. "о́ка" accent positions)
local function with_different_capitalization(callback_function, word)
local decap_word = rsub(word, "^.", function (letter) return mw.ustring.lower(letter) end)
-- If the word wasn't actually capitalized, then there's only one way to do it
if decap_word == word then
return callback_function(word)
end
-- Process both the original and de-capitalized variants
local subst1 = callback_function(word)
local subst2 = callback_function(decap_word)
-- Restore the capitalization of the de-capitalized variant
if subst2 ~= nil then
subst2 = rsub(subst2, "^.", function (letter) return mw.ustring.upper(letter) end)
end
-- Compare the results of the two routes with different capitalization
return evaluate_alternatives(subst1, subst2, word)
end
-- Process a chunk of text and opportunistically add letters "ё" and accents to Russian
-- words where it is possible to do so in an unambiguous way. While doing this, the
-- pre-1918 spelling is also converted to modern Russian spelling.
function export.normalize(text)
text = decompose(text)
local nested_square_brackets = 0
local prev_word, cur_word
local prev_sep = "", next_sep
local result = rsub(text, "(*)(*)", function (word, sep)
-- Don't do anything with the text enclosed in double square brackets (possible wikilinks or other markup)
local cur_nested_square_brackets = nested_square_brackets
rsub(sep, "%[%[", function (match) nested_square_brackets = nested_square_brackets + 1 end)
rsub(sep, "%]%]", function (match) nested_square_brackets = nested_square_brackets - 1 end)
if cur_nested_square_brackets ~= 0 then
return
end
-- First a basic check for obviously problematic words or word combinations
prev_sep = next_sep
next_sep = sep
prev_word = cur_word
cur_word = word
local lowercase_cur_word = mw.ustring.lower(cur_word)
local capitalized_cur_word = rsub(cur_word, "^.", function (letter) return mw.ustring.upper(letter) end)
-- Avoid mixed case, such as "шИзОФреНия" or other similarly weird formatting style
if cur_word ~= lowercase_cur_word and cur_word ~= capitalized_cur_word then
return
end
-- Ignore two words separated by "(", such as "галер(е́я)"
if (prev_sep == "(" and prev_word and prev_word ~= "") or next_sep == "(" then
return
end
-- Do conversion to modern orthography, accent and "ё" recovery
if prev_word and prev_word ~= "" and rfind(prev_sep, "^+$") then
-- *Definitely* the middle of a sentence here. Only spaces or commas separate us from the
-- previous word. Maybe hyphens or semicolons could be added too, but they are less reliable.
word = with_different_orthography(function (word)
-- Need to explore two routes (with and without "ё" recovery) to reliably resolve the
-- "слёзы" vs. "слезы́" or "узна́ем" vs. "узнаём" ambiguity. And since it's the middle of
-- a sentence here, the actual capitalization of the word does matter for proper nouns.
local subst1 = try_to_recover_ac(word) or with_different_capitalization(try_to_recover_ac, word)
local subst2 = try_to_recover_jo(word) or with_different_capitalization(try_to_recover_jo, word)
return evaluate_alternatives(subst1, subst2, word)
end, word)
else
-- *Likely* the first word of a sentence. Making a wrong guess is safe, because this only
-- adds ambiguity and prevents us from accenting certain words. Such as "О́ка" vs. "Ока́".
prev_word = nil
word = with_different_orthography(function (word)
-- Need to explore two routes (with and without "ё" recovery) to reliably resolve the
-- "слёзы" vs. "слезы́" or "узна́ем" vs. "узнаём" ambiguity. And since it's the start of
-- a sentence here, the actual capitalization of the word is completely irrelevant.
local subst1 = with_different_capitalization(try_to_recover_ac, word)
local subst2 = with_different_capitalization(try_to_recover_jo, word)
return evaluate_alternatives(subst1, subst2, word)
end, word)
end
-- Strip stress accent, but keep modern orthography
local modernized_without_ac = rsub(word, AC, "")
-- The current word is preceded by a single syllable preposition, which was already
-- accented in the original text
if prev_word and rfind(prev_word, AC) and mw.ustring.len(rsub(prev_word, nonvowel, "")) == 1 then
if not rfind(cur_word, AC) then
word = modernized_without_ac
end
end
-- Handle "предложно-именное сочетание" constructs (suppress accent in the second part of
-- "до́ смерти" if it's found in the dictionary even without having the explicit accent markup)
if prev_word then
local combined = prev_word .. " " .. modernized_without_ac
if lookup_word(combined) then
word = modernized_without_ac
end
local decap_combined = rsub(combined, "^.", function (letter) return mw.ustring.lower(letter) end)
if decap_combined ~= combined and lookup_word(decap_combined) then
word = modernized_without_ac
end
end
return word .. sep
end)
return mw.ustring.toNFC(result)
end
return export