From 6b8b176f82d45ecaaea44485c1475646e8f6e777 Mon Sep 17 00:00:00 2001 From: Ilia Denisov Date: Sat, 13 Jun 2026 13:33:26 +0200 Subject: [PATCH] Filter OpenCorpora abbreviations & proper nouns from the Russian noun list MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit OpenCorpora tags indeclinable abbreviations as common nouns (Abbr+Fixd), and Stage 2 seeded the result with its whole noun lexicon, so non-words leaked into scrabble.txt: ндс, ст, ср, кпд, чп, гибдд, днк, … ru_stage2.py now drops Abbr+Fixd nouns from the OpenCorpora seed and lets the orthographic dictionary decide instead: a lowercase РАН headword whose note is a noun is kept (the lexicalised сельпо, под, ска, роно, врио, тв, фио, суперэвм), everything else is dropped. Function words (CONJ/PRCL, e.g. зато) and OpenCorpora inflected forms (ан = род. мн. от «ана»; proper «Ан») are excluded too. --trace WORD now prints a detailed per-signal audit (all.txt, OpenCorpora POS / Abbr / Fixd / CONJ/PRCL, libmorph, РАН note + classify, outcome) for auditing a word or repeating the analysis; tools/README.md documents the rule and method. Net: 179 words removed from scrabble.txt (83385 -> 83206) and erudit.txt (83343 -> 83164); verified to remove exactly those 179 and add none. DAWGs rebuild clean. --- sources/erudit_ru/erudit.txt | 179 ------------------------------- sources/scrabble_ru/scrabble.txt | 179 ------------------------------- tools/README.md | 62 ++++++++++- tools/ru_stage2.py | 118 +++++++++++++++++--- 4 files changed, 164 insertions(+), 374 deletions(-) diff --git a/sources/erudit_ru/erudit.txt b/sources/erudit_ru/erudit.txt index 72d6a6f..3c5de88 100644 --- a/sources/erudit_ru/erudit.txt +++ b/sources/erudit_ru/erudit.txt @@ -1261,7 +1261,6 @@ акафист акафистник акация -акб аквааэробика аквабайк аквабайкер @@ -2138,7 +2137,6 @@ амфора амфотерность амхара -ан ана анабазин анабазинсульфат @@ -2924,7 +2922,6 @@ апис апитерапия апитоксин -апк аплазия апланат апланатизм @@ -4709,7 +4706,6 @@ балясинка балясник балясы -бам бамана бамбара бамбино @@ -5173,7 +5169,6 @@ баянист баянистка баяти -бд бдение бдительность беатификация @@ -7739,7 +7734,6 @@ брянчанин брянчанка бряцание -бсвв бтр бубал бубен @@ -8630,7 +8624,6 @@ ввозка вволакивание вворачивание -ввп ввязка ввязывание вгиб @@ -9472,7 +9465,6 @@ взрыд взрытие взрыхление -взу взъезд взъем взъерошенность @@ -10078,7 +10070,6 @@ вица вициналь вицмундир -вич вичрепол вичуговец вичужанин @@ -10216,7 +10207,6 @@ вмещение вминание вмонтирование -вмф вмывание вмятина вмятость @@ -10266,8 +10256,6 @@ вобла воблер вобуляция -вов -вовд вовлекание вовлечение вовлеченность @@ -10812,7 +10800,6 @@ воплощение воплощенность вопль -вопр вопрос вопросец вопросик @@ -11144,7 +11131,6 @@ вруша врушка врытие -вс всадник всадница всаживание @@ -11285,7 +11271,6 @@ всыпка всячина всячинка -вт вталкивание втаптывание втаскивание @@ -11297,7 +11282,6 @@ втирание втируша втискивание -вто втолковывание втора вторачивание @@ -11783,7 +11767,6 @@ выныривание вынюхивание вынянчивание -вып выпад выпадание выпадение @@ -12782,7 +12765,6 @@ гарциния гаршнеп гарь -гас гасиенда гасильник гаситель @@ -12847,10 +12829,8 @@ гашник гашпиль гаэл -гаэс гаюин гаял -гб гбайт гвадалахарец гваделупец @@ -13528,7 +13508,6 @@ гиббереллин гиббон гиббсит -гибдд гибеллин гибель гибельность @@ -13925,7 +13904,6 @@ гиоид гиостилия гиосцин -гип гипаллага гипальгезия гипантий @@ -14240,8 +14218,6 @@ гифа гифомицет гичка -гк -гл глава главарь главбух @@ -14407,7 +14383,6 @@ глодание глокеншпиль глоксиния -глонасс глорификация глория глосса @@ -14895,7 +14870,6 @@ гопкомпания гоплит гопник -гор гора горак горал @@ -15289,9 +15263,6 @@ гоффурьер гохуа гошма -гоэлро -гпк -гр грааль граб грабарка @@ -15830,7 +15801,6 @@ грязца грязь грязюка -гто гуава гуайкуру гуайява @@ -16039,7 +16009,6 @@ гуща гущина гуэмал -гц гэ гэбист гэг @@ -18012,7 +17981,6 @@ дирижирование дирхам дирхем -дис дисассемблер дисахарид дисбактериоз @@ -18246,7 +18214,6 @@ диэтилендиоксид диэтилферроцен диэтилфосфит -дк длань длина длинномер @@ -18256,7 +18223,6 @@ длиннохвост длиномер длительность -дм дмитровец дмитровчанин дмитровчанка @@ -18267,7 +18233,6 @@ дневничок днепропетровец днище -днк дно дновец дноуглубитель @@ -18580,7 +18545,6 @@ долихоморфность долихоцефал долихоцефалия -долл доллар долларизация долли @@ -18743,7 +18707,6 @@ дооценка доочиститель доочистка -доп допайка допалывание допамин @@ -18991,7 +18954,6 @@ дощечка дояр доярка -др драбант дравид драга @@ -19226,7 +19188,6 @@ дрянь дряхление дряхлость -дтп дуайен дуала дуализм @@ -19638,8 +19599,6 @@ египтянка егоза егозливость -егэ -ед еда единение единица @@ -19843,7 +19802,6 @@ ехидство ехидца ехор -ея жаба жабка жабник @@ -20109,7 +20067,6 @@ жете жетон жетончик -жж жжение жженка жиардия @@ -20277,8 +20234,6 @@ житуха житье житьишко -жкт -жкх жлоб жлобство жменька @@ -21255,7 +21210,6 @@ занятность занятость занятьице -зао заоблачность заовражье заозерье @@ -21693,7 +21647,6 @@ затишье затл затмение -зато затоваренность затоваривание заток @@ -22400,7 +22353,6 @@ зодчество зодчий зоеа -зож зожник зозуля зоил @@ -22573,7 +22525,6 @@ зримость зритель зрительница -зрк зрячесть зуав зуб @@ -22999,7 +22950,6 @@ изготовитель изготовка изготовление -изд издавание издалбливание издание @@ -23292,7 +23242,6 @@ изюминка изящество изящность -ии иисусик ийолит икаб @@ -23330,7 +23279,6 @@ икосаэдр икота икотник -икр икра икринка икромет @@ -23791,7 +23739,6 @@ инкубация инкубирование инкунабула -инн иннаби иннервация иннинг @@ -24207,7 +24154,6 @@ иосифлянин иосифлянство иотний -ип ипатка ипекакуана иподиакон @@ -24225,7 +24171,6 @@ иппон иппотерапия иприт -ипс ипсилон ир иракец @@ -24542,7 +24487,6 @@ исчислимость исчисляемость исщипывание -ит итабирит италик итальянец @@ -24605,7 +24549,6 @@ ицерия ицзу ичиг -ичр ишак ишан ишачок @@ -25274,7 +25217,6 @@ канберрец канберрка канва -канд кандалакшанин кандалакшанка кандалакшец @@ -26208,11 +26150,9 @@ каяк каякер каякинг -кб кбайт кбит кбод -кв ква квагга квадра @@ -26391,16 +26331,11 @@ квитанция квитирование квиток -квн кворум квота квотирование квохтанье квочка -квт -кг -кгс -кд кеа кеб кебаб @@ -27566,9 +27501,7 @@ кляузность кляча клячонка -км кмет -кн кнастер кнедлик кнель @@ -27651,7 +27584,6 @@ коалиционер коалиция коан -коап коартикуляция коата коати @@ -29847,9 +29779,7 @@ коэрцитивность коэрцитиметр коэффициент -кпд кпелле -кпп кр крааль краб @@ -34271,7 +34201,6 @@ маорец маори маорка -мап мапутец мапутка мара @@ -34771,10 +34700,7 @@ маянье маятник маячок -мб мбайт -мвт -мг мга мгла мглистость @@ -35469,7 +35395,6 @@ мерщик меря мерянин -мес меса месиво месилка @@ -36429,7 +36354,6 @@ мимоза мимолетность мимулус -мин мина минарет минахас @@ -36721,9 +36645,6 @@ миштек мишура мишурность -мкад -мкм -мл младенец младенчество младенчик @@ -36750,11 +36671,6 @@ млекопитающее мление млечник -млн -млрд -мм -ммкф -ммоль мнемограмма мнемокод мнемометр @@ -36878,7 +36794,6 @@ множество множимое множитель -мо моа моавитянин моавитянка @@ -37755,8 +37670,6 @@ мощи мощность мощь -мп -мпа мразь мрак мракобес @@ -37773,7 +37686,6 @@ мрежа мрение мрот -мс мстерец мститель мстительница @@ -38150,7 +38062,6 @@ муштрование муштровка муэдзин -мфш мхатовец мценянин мцыри @@ -39482,7 +39393,6 @@ нацрайон нацсобрание нацшкола -нач нача начало начальник @@ -39548,18 +39458,14 @@ наядовые наякорник наян -нг нгала нганасан нганасанка -нгмд нгони -нгтс нгултрум ндебеле нджаменец нджаменка -ндс неадекватность неаккуратность неактер @@ -41530,9 +41436,6 @@ нищенствование нищета нищий -нкнх -нло -нм нобелиат нобелий нобелистика @@ -42010,8 +41913,6 @@ няша няшка оазис -оао -об обабок обалделость обалдение @@ -42299,7 +42200,6 @@ обкуривание обкурка обкусывание -обл облава облавливание облавщик @@ -42684,7 +42584,6 @@ обсаливание обсасывание обсахаривание -обсе обсев обсевок обсекание @@ -43375,7 +43274,6 @@ озорник озорница озорство -озу озье оидий оидиум @@ -44225,7 +44123,6 @@ ораторша орбита орбиталь -орви оргазм оргалит орган @@ -44335,7 +44232,6 @@ орешина орешник орешница -орз орибатида ориби оригами @@ -44530,7 +44426,6 @@ оршанец оршанка орясина -ос оса осада осадка @@ -44702,7 +44597,6 @@ основоположник основоположница основщик -осо особа особенность особина @@ -47162,9 +47056,6 @@ паясничание паясничество паяц -пво -пгт -пдд пеан пебрина певец @@ -47480,7 +47371,6 @@ пептизация пептон пептонизация -пер перборат первак первач @@ -48844,7 +48734,6 @@ пещерность пещур пещь -пзу пи пиала пиалушка @@ -49363,8 +49252,6 @@ пиявица пиявка пиявочка -пк -пл плав плавание плавбаза @@ -49923,8 +49810,6 @@ пляска плясун плясунья -пмэф -пн пневма пневматика пневматичность @@ -49998,7 +49883,6 @@ пнище пномпенец пномпенька -по побасенка побаска побег @@ -50836,7 +50720,6 @@ подофилловые подочередь подошва -подп подпадание подпадение подпаивание @@ -52968,7 +52851,6 @@ порядочек порядочность порядчик -пос посад посадка посадник @@ -54436,7 +54318,6 @@ прилунение прилюдность приляпывание -прим прима примагничивание примадонна @@ -54904,7 +54785,6 @@ приятие приятность приятство -про проа проамериканизм проатлас @@ -56048,7 +55928,6 @@ проулок проутюживание проушина -проф профаг профаза профайл @@ -56161,7 +56040,6 @@ прохождение прохожий прохромосома -проц процарапывание процветание процедура @@ -56539,7 +56417,6 @@ псовина псориаз псороптоз -пт птаха пташечка пташка @@ -57057,7 +56934,6 @@ пьянь пьяцца пэ -пэвм пэвээр пэдлбол пэр @@ -59193,7 +59069,6 @@ регуляция регуманизация регупол -ред редактирование редактор редакторат @@ -60324,7 +60199,6 @@ роение рожа рожаница -рожд рождаемость рождение рожденник @@ -60593,14 +60467,11 @@ роялистка роялти рояль -рпц ртище -ртр ртуть руандец руандиец руандийка -руб рубаб рубаи рубайят @@ -60837,7 +60708,6 @@ рушение рушник рушничок -рффи рцы рыба рыбак @@ -61990,7 +61860,6 @@ саше сашими саяногорец -сб сбавка сбавление сбавочник @@ -62036,7 +61905,6 @@ сбруйщик сбруя сбрызгивание -сбс сбывание сбыт сбытовик @@ -62707,7 +62575,6 @@ сейша сейшелец сейшелка -сек секанс секарь секатор @@ -63126,7 +62993,6 @@ септоль септон септориоз -сер сера сераделла серак @@ -63486,7 +63352,6 @@ сизигия сизина сизиф -сизо сизоворонка сизоворонок сизость @@ -64882,7 +64747,6 @@ сляб слябинг слякоть -см смазанность смазка смазливость @@ -64978,7 +64842,6 @@ смещаемость смещение смещенность -сми смилакс сминаемость сминание @@ -65049,7 +64912,6 @@ смотчица смрад смрадность -смс смска смуглина смуглость @@ -65105,7 +64967,6 @@ снаряжение снасть снашивание -снв снег снегириха снегирь @@ -65222,7 +65083,6 @@ сныть сныч снятие -со соавтор соавторство соавторша @@ -65962,7 +65822,6 @@ соссюрея соссюрианство соссюрит -сост состав составитель составительница @@ -66621,7 +66480,6 @@ сплюшка сплющенность сплющивание -спо сподвижник сподвижница сподвижничество @@ -66775,7 +66633,6 @@ спутывание спюрк спячка -ср срабатывание сработанность сработка @@ -66862,7 +66719,6 @@ сселение ссечки ссора -сср ссуда ссудодатель ссудополучатель @@ -66881,7 +66737,6 @@ ссыппункт ссыпщик ссыпщица -ст стабилизатор стабилизация стабилитрон @@ -67580,8 +67435,6 @@ стлань стланье стлище -сто -стоа стобалльник стоваттка стог @@ -67714,7 +67567,6 @@ стояние стоянка стоячок -стр страбизм стравливание страгивание @@ -68124,7 +67976,6 @@ субгармоника субгигант субгрант -субд субдилер субдилерство субдиректория @@ -68755,7 +68606,6 @@ суставчик сустак сусук -сут сутаж сутана сутартине @@ -69210,7 +69060,6 @@ табетик таби табия -табл табла таблетирование таблетка @@ -69728,7 +69577,6 @@ таялка таяние таянка -тб тбилисец тбилиска тв @@ -69864,7 +69712,6 @@ тектонофизика текучесть текучка -тел телавец теламон телантроп @@ -70854,7 +70701,6 @@ тешенит тешка теща -тз ти тиазин тиазол @@ -72163,7 +72009,6 @@ триеровка триестинец триец -триз тризм тризна триипостасник @@ -72328,7 +72173,6 @@ триэтиламин триэтилфосфит триязычие -трлн троакар трог трогание @@ -72936,7 +72780,6 @@ туя тхэквондист тхэквондо -тчк тщание тщательность тщедушие @@ -72960,7 +72803,6 @@ тырло тырса тыртыр -тыс тысчонка тысяцкий тысяча @@ -72993,7 +72835,6 @@ тэнно тэта тэтчеризм -тэц тюб тюбаж тюбетеечка @@ -73398,7 +73239,6 @@ удлинитель удмурт удмуртка -удо удобность удобоваримость удобопонятность @@ -73475,7 +73315,6 @@ узелочек узерк узерка -узи узик узилище узина @@ -73620,7 +73459,6 @@ укупорщица укус укутывание -ул улавливание улавливатель улаживание @@ -73888,7 +73726,6 @@ упирательство упитанность упихивание -упк уплата уплачивание уплотнение @@ -75099,7 +74936,6 @@ фециал фешенебельность фея -фз фиакр фиал фиалка @@ -76508,8 +76344,6 @@ фрутеровщик фрюктидор фря -фса -фсдн фталазол фталан фталат @@ -77431,7 +77265,6 @@ хлюст хлябь хлястик -хмао хмара хмарь хмелевка @@ -78615,8 +78448,6 @@ цокотанье цокотуха цоликаури -цп -цтк цуба цуг цугтромбон @@ -78656,7 +78487,6 @@ чабер чабрец чавканье -чаво чавыча чага чад @@ -78815,7 +78645,6 @@ чваканье чванливость чванство -чгк чебак чебоксарец чебоксарка @@ -78851,7 +78680,6 @@ чекпойнт чекуша чекушка -чел челдонка челдрон челеста @@ -79126,7 +78954,6 @@ чесуча чет чета -четв четверг четвереньки четверик @@ -79374,7 +79201,6 @@ членкорство членовредитель членство -чм чмоканье чобот чозения @@ -79399,7 +79225,6 @@ чоризо чох чоха -чп чреватость чрево чревовещание @@ -79416,7 +79241,6 @@ чрен чресла чресполосица -чт чтение чтец чтиво @@ -80613,7 +80437,6 @@ шропшир шрот шрути -шт штаб штабелевание штабелевка @@ -81078,7 +80901,6 @@ эвкоммиевые эвкоммия эвкрит -эвм эвмена эвменида эвокатор @@ -81223,7 +81045,6 @@ экгонин экдизон экер -экз экзальтация экзамен экзаменатор diff --git a/sources/scrabble_ru/scrabble.txt b/sources/scrabble_ru/scrabble.txt index 8afd627..c64a346 100644 --- a/sources/scrabble_ru/scrabble.txt +++ b/sources/scrabble_ru/scrabble.txt @@ -1262,7 +1262,6 @@ акафист акафистник акация -акб аквааэробика аквабайк аквабайкер @@ -2139,7 +2138,6 @@ амфора амфотерность амхара -ан ана анабазин анабазинсульфат @@ -2925,7 +2923,6 @@ апис апитерапия апитоксин -апк аплазия апланат апланатизм @@ -4711,7 +4708,6 @@ балясинка балясник балясы -бам бамана бамбара бамбино @@ -5175,7 +5171,6 @@ баянист баянистка баяти -бд бдение бдительность беатификация @@ -7745,7 +7740,6 @@ брянчанин брянчанка бряцание -бсвв бтр бубал бубен @@ -8636,7 +8630,6 @@ ввозка вволакивание вворачивание -ввп ввязка ввязывание вгиб @@ -9479,7 +9472,6 @@ взрыд взрытие взрыхление -взу взъезд взъерошенность взъерошивание @@ -10085,7 +10077,6 @@ вица вициналь вицмундир -вич вичрепол вичуговец вичужанин @@ -10223,7 +10214,6 @@ вмётывание вминание вмонтирование -вмф вмывание вмятина вмятость @@ -10273,8 +10263,6 @@ вобла воблер вобуляция -вов -вовд вовлекание вовлечение вовлечённость @@ -10819,7 +10807,6 @@ воплощение воплощённость вопль -вопр вопрос вопросец вопросик @@ -11151,7 +11138,6 @@ вруша врушка врытие -вс всадник всадница всаживание @@ -11292,7 +11278,6 @@ всыпка всячина всячинка -вт вталкивание втаптывание втаскивание @@ -11304,7 +11289,6 @@ втирание втируша втискивание -вто втолковывание втора вторачивание @@ -11790,7 +11774,6 @@ выныривание вынюхивание вынянчивание -вып выпад выпадание выпадение @@ -12789,7 +12772,6 @@ гарциния гаршнеп гарь -гас гасиенда гасильник гаситель @@ -12854,10 +12836,8 @@ гашник гашпиль гаэл -гаэс гаюин гаял -гб гбайт гвадалахарец гваделупец @@ -13535,7 +13515,6 @@ гиббереллин гиббон гиббсит -гибдд гибеллин гибель гибельность @@ -13932,7 +13911,6 @@ гиоид гиостилия гиосцин -гип гипаллага гипальгезия гипантий @@ -14247,8 +14225,6 @@ гифа гифомицет гичка -гк -гл глава главарь главбух @@ -14414,7 +14390,6 @@ глодание глокеншпиль глоксиния -глонасс глорификация глория глосса @@ -14902,7 +14877,6 @@ гопкомпания гоплит гопник -гор гора горак горал @@ -15296,9 +15270,6 @@ гоффурьер гохуа гошма -гоэлро -гпк -гр грааль граб грабарка @@ -15838,7 +15809,6 @@ грязца грязь грязюка -гто гуава гуайкуру гуайява @@ -16048,7 +16018,6 @@ гуща гущина гуэмал -гц гэ гэбист гэг @@ -18021,7 +17990,6 @@ дирижирование дирхам дирхем -дис дисассемблер дисахарид дисбактериоз @@ -18255,7 +18223,6 @@ диэтилендиоксид диэтилферроцен диэтилфосфит -дк длань длина длинномер @@ -18265,7 +18232,6 @@ длиннохвост длиномер длительность -дм дмитровец дмитровчанин дмитровчанка @@ -18276,7 +18242,6 @@ днепропетровец днёвка днище -днк дно дновец дноуглубитель @@ -18589,7 +18554,6 @@ долихоморфность долихоцефал долихоцефалия -долл доллар долларизация долли @@ -18752,7 +18716,6 @@ дооценка доочиститель доочистка -доп допайка допалывание допамин @@ -19000,7 +18963,6 @@ дощечка дояр доярка -др драбант дравид драга @@ -19235,7 +19197,6 @@ дрянь дряхление дряхлость -дтп дуайен дуала дуализм @@ -19647,8 +19608,6 @@ египтянка егоза егозливость -егэ -ед еда единение единица @@ -19840,7 +19799,6 @@ ехидность ехидство ехидца -ея ёж ёжик ёлка @@ -20122,7 +20080,6 @@ жёрдочка жёрнов жёсткость -жж жжение жжёнка жиардия @@ -20290,8 +20247,6 @@ житуха житьё житьишко -жкт -жкх жлоб жлобство жменька @@ -21269,7 +21224,6 @@ занятность занятость занятьице -зао заоблачность заовражье заозерье @@ -21707,7 +21661,6 @@ затишье затл затмение -зато затоваренность затоваривание заток @@ -22414,7 +22367,6 @@ зодчество зодчий зоеа -зож зожник зозуля зоил @@ -22587,7 +22539,6 @@ зримость зритель зрительница -зрк зрячесть зуав зуб @@ -23013,7 +22964,6 @@ изготовитель изготовка изготовление -изд издавание издалбливание издание @@ -23307,7 +23257,6 @@ изюминка изящество изящность -ии иисусик ийолит икаб @@ -23345,7 +23294,6 @@ икосаэдр икота икотник -икр икра икринка икрометание @@ -23806,7 +23754,6 @@ инкубация инкубирование инкунабула -инн иннаби иннервация иннинг @@ -24222,7 +24169,6 @@ иосифлянин иосифлянство иотний -ип ипатка ипекакуана иподиакон @@ -24240,7 +24186,6 @@ иппон иппотерапия иприт -ипс ипсилон ир иракец @@ -24557,7 +24502,6 @@ исчислимость исчисляемость исщипывание -ит итабирит италик итальянец @@ -24620,7 +24564,6 @@ ицерия ицзу ичиг -ичр ишак ишан ишачок @@ -25289,7 +25232,6 @@ канберрец канберрка канва -канд кандалакшанин кандалакшанка кандалакшец @@ -26223,11 +26165,9 @@ каяк каякер каякинг -кб кбайт кбит кбод -кв ква квагга квадра @@ -26406,16 +26346,11 @@ квитанция квитирование квиток -квн кворум квота квотирование квохтанье квочка -квт -кг -кгс -кд кеа кеб кебаб @@ -27582,9 +27517,7 @@ кляузность кляча клячонка -км кмет -кн кнастер кнедлик кнель @@ -27667,7 +27600,6 @@ коалиционер коалиция коан -коап коартикуляция коата коати @@ -29865,9 +29797,7 @@ коэрцитивность коэрцитиметр коэффициент -кпд кпелле -кпп кр крааль краб @@ -34291,7 +34221,6 @@ маорец маори маорка -мап мапутец мапутка мара @@ -34792,10 +34721,7 @@ маянье маятник маячок -мб мбайт -мвт -мг мга мгла мглистость @@ -35487,7 +35413,6 @@ мерщик меря мерянин -мес меса месиво месилка @@ -36452,7 +36377,6 @@ мимоза мимолётность мимулус -мин мина минарет минахас @@ -36744,9 +36668,6 @@ миштек мишура мишурность -мкад -мкм -мл младенец младенчество младенчик @@ -36773,11 +36694,6 @@ млекопитающее мление млечник -млн -млрд -мм -ммкф -ммоль мнемограмма мнемокод мнемометр @@ -36901,7 +36817,6 @@ множество множимое множитель -мо моа моавитянин моавитянка @@ -37779,8 +37694,6 @@ мощи мощность мощь -мп -мпа мразь мрак мракобес @@ -37797,7 +37710,6 @@ мрежа мрение мрот -мс мстёрец мститель мстительница @@ -38175,7 +38087,6 @@ муштрование муштровка муэдзин -мфш мхатовец мценянин мцыри @@ -39507,7 +39418,6 @@ нацрайон нацсобрание нацшкола -нач нача начало начальник @@ -39573,18 +39483,14 @@ наядовые наякорник наян -нг нгала нганасан нганасанка -нгмд нгони -нгтс нгултрум ндебеле нджаменец нджаменка -ндс неадекватность неаккуратность неактёр @@ -41556,9 +41462,6 @@ нищенствование нищета нищий -нкнх -нло -нм нобелиат нобелий нобелистика @@ -42037,8 +41940,6 @@ няша няшка оазис -оао -об обабок обалделость обалдение @@ -42326,7 +42227,6 @@ обкуривание обкурка обкусывание -обл облава облавливание облавщик @@ -42711,7 +42611,6 @@ обсаливание обсасывание обсахаривание -обсе обсев обсевок обсекание @@ -43402,7 +43301,6 @@ озорник озорница озорство -озу озье оидий оидиум @@ -44252,7 +44150,6 @@ ораторша орбита орбиталь -орви оргазм оргалит орган @@ -44362,7 +44259,6 @@ орешник орешница орёл -орз орибатида ориби оригами @@ -44557,7 +44453,6 @@ оршанец оршанка орясина -ос оса осада осадка @@ -44729,7 +44624,6 @@ основоположник основоположница основщик -осо особа особенность особина @@ -47190,9 +47084,6 @@ паясничание паясничество паяц -пво -пгт -пдд пеан пебрина певец @@ -47508,7 +47399,6 @@ пептизация пептон пептонизация -пер перборат первак первач @@ -48875,7 +48765,6 @@ пёрышко пёс пёсик -пзу пи пиала пиалушка @@ -49394,8 +49283,6 @@ пиявица пиявка пиявочка -пк -пл плав плавание плавбаза @@ -49954,8 +49841,6 @@ пляска плясун плясунья -пмэф -пн пневма пневматика пневматичность @@ -50029,7 +49914,6 @@ пнище пномпенец пномпенька -по побасёнка побаска побег @@ -50868,7 +50752,6 @@ подофилловые подочередь подошва -подп подпадание подпадение подпаивание @@ -53000,7 +52883,6 @@ порядочек порядочность порядчик -пос посад посадка посадник @@ -54468,7 +54350,6 @@ прилунение прилюдность приляпывание -прим прима примагничивание примадонна @@ -54938,7 +54819,6 @@ приятие приятность приятство -про проа проамериканизм проатлас @@ -56082,7 +55962,6 @@ проулок проутюживание проушина -проф профаг профаза профайл @@ -56195,7 +56074,6 @@ прохождение прохожий прохромосома -проц процарапывание процветание процедура @@ -56573,7 +56451,6 @@ псовина псориаз псороптоз -пт птаха пташечка пташка @@ -57091,7 +56968,6 @@ пьянь пьяцца пэ -пэвм пэвээр пэдлбол пэр @@ -59224,7 +59100,6 @@ регуляция регуманизация регупол -ред редактирование редактор редакторат @@ -60361,7 +60236,6 @@ роёк рожа рожаница -рожд рождаемость рождение рожденник @@ -60630,14 +60504,11 @@ роялистка роялти рояль -рпц ртище -ртр ртуть руандец руандиец руандийка -руб рубаб рубаи рубайят @@ -60874,7 +60745,6 @@ рушение рушник рушничок -рффи рцы рыба рыбак @@ -62027,7 +61897,6 @@ саше сашими саяногорец -сб сбавка сбавление сбавочник @@ -62073,7 +61942,6 @@ сбруйщик сбруя сбрызгивание -сбс сбывание сбыт сбытовик @@ -62740,7 +62608,6 @@ сейша сейшелец сейшелка -сек секанс секарь секатор @@ -63156,7 +63023,6 @@ септоль септон септориоз -сер сера сераделла серак @@ -63523,7 +63389,6 @@ сизигия сизина сизиф -сизо сизоворонка сизоворонок сизость @@ -64920,7 +64785,6 @@ сляб слябинг слякоть -см смазанность смазка смазливость @@ -65016,7 +64880,6 @@ смещённость смётка смётывание -сми смилакс сминаемость сминание @@ -65087,7 +64950,6 @@ смотчица смрад смрадность -смс смска смуглина смуглость @@ -65143,7 +65005,6 @@ снаряжение снасть снашивание -снв снег снегириха снегирь @@ -65260,7 +65121,6 @@ сныть сныч снятие -со соавтор соавторство соавторша @@ -66001,7 +65861,6 @@ соссюрея соссюрианство соссюрит -сост состав составитель составительница @@ -66660,7 +66519,6 @@ сплюшка сплющенность сплющивание -спо сподвижник сподвижница сподвижничество @@ -66814,7 +66672,6 @@ спутывание спюрк спячка -ср срабатывание сработанность сработка @@ -66901,7 +66758,6 @@ сселение ссечки ссора -сср ссуда ссудодатель ссудополучатель @@ -66920,7 +66776,6 @@ ссыппункт ссыпщик ссыпщица -ст стабилизатор стабилизация стабилитрон @@ -67619,8 +67474,6 @@ стлань стланьё стлище -сто -стоа стобалльник стоваттка стог @@ -67753,7 +67606,6 @@ стояние стоянка стоячок -стр страбизм стравливание страгивание @@ -68163,7 +68015,6 @@ субгармоника субгигант субгрант -субд субдилер субдилерство субдиректория @@ -68794,7 +68645,6 @@ суставчик сустак сусук -сут сутаж сутана сутартине @@ -69249,7 +69099,6 @@ табетик таби табия -табл табла таблетирование таблетка @@ -69767,7 +69616,6 @@ таялка таяние таянка -тб тбилисец тбилиска тв @@ -69902,7 +69750,6 @@ тектонофизика текучесть текучка -тел телавец теламон телантроп @@ -70894,7 +70741,6 @@ тёша тёшка тёща -тз ти тиазин тиазол @@ -72203,7 +72049,6 @@ триеровка триестинец триец -триз тризм тризна триипостасник @@ -72368,7 +72213,6 @@ триэтиламин триэтилфосфит триязычие -трлн троакар трог трогание @@ -72976,7 +72820,6 @@ туя тхэквондист тхэквондо -тчк тщание тщательность тщедушие @@ -73000,7 +72843,6 @@ тырло тырса тыртыр -тыс тысчонка тысяцкий тысяча @@ -73033,7 +72875,6 @@ тэнно тэта тэтчеризм -тэц тюб тюбаж тюбетеечка @@ -73438,7 +73279,6 @@ удлинитель удмурт удмуртка -удо удобность удобоваримость удобопонятность @@ -73515,7 +73355,6 @@ узелочек узерк узерка -узи узик узилище узина @@ -73660,7 +73499,6 @@ укупорщица укус укутывание -ул улавливание улавливатель улаживание @@ -73928,7 +73766,6 @@ упирательство упитанность упихивание -упк уплата уплачивание уплотнение @@ -75139,7 +74976,6 @@ фециал фешенебельность фея -фз фиакр фиал фиалка @@ -76548,8 +76384,6 @@ фрутеровщик фрюктидор фря -фса -фсдн фталазол фталан фталат @@ -77471,7 +77305,6 @@ хлюст хлябь хлястик -хмао хмара хмарь хмелевод @@ -78655,8 +78488,6 @@ цокотанье цокотуха цоликаури -цп -цтк цуба цуг цугтромбон @@ -78697,7 +78528,6 @@ чабёр чабрец чавканье -чаво чавыча чага чад @@ -78856,7 +78686,6 @@ чваканье чванливость чванство -чгк чебак чебоксарец чебоксарка @@ -78891,7 +78720,6 @@ чекпойнт чекуша чекушка -чел челдонка челдрон челеста @@ -79152,7 +78980,6 @@ честь чесуча чета -четв четверг четвереньки четверик @@ -79415,7 +79242,6 @@ членкорство членовредитель членство -чм чмоканье чобот чозения @@ -79440,7 +79266,6 @@ чоризо чох чоха -чп чреватость чрево чревовещание @@ -79457,7 +79282,6 @@ чрен чресла чресполосица -чт чтение чтец чтиво @@ -80655,7 +80479,6 @@ шропшир шрот шрути -шт штаб штабелевание штабелевка @@ -81120,7 +80943,6 @@ эвкоммиевые эвкоммия эвкрит -эвм эвмена эвменида эвокатор @@ -81265,7 +81087,6 @@ экгонин экдизон экер -экз экзальтация экзамен экзаменатор diff --git a/tools/README.md b/tools/README.md index 36a156b..332d815 100644 --- a/tools/README.md +++ b/tools/README.md @@ -74,8 +74,8 @@ go run ./tools/ruwords # Stage 2 — the brain (Python + mawo + libmorph): writes scrabble.txt ru-venv/bin/python tools/ru_stage2.py -# ask how a word did or did not reach the dictionary -ru-venv/bin/python tools/ru_stage2.py --trace травмпункт +# audit how a single word did or did not reach the dictionary (detailed, per-signal report) +ru-venv/bin/python tools/ru_stage2.py --trace ндс # also write the in-memory buckets (undefined, adjectives, verbs, singulars, fate.tsv) ru-venv/bin/python tools/ru_stage2.py --dump ``` @@ -111,7 +111,9 @@ Each Stage-1 word (length 2–15) is routed by three sources, most authoritative 1. **OpenCorpora** (`words.dawg`, read directly — *not* the predictor): a common-noun reading ⇒ keep the OpenCorpora lemma. The full OpenCorpora common-noun lexicon is also - added (so nouns absent from the PDF are included). + added (so nouns absent from the PDF are included), **minus indeclinable abbreviations** + (`Abbr`+`Fixd`: ндс, кпд, чп, …) — OpenCorpora tags those as nouns but they are not + Scrabble words. See *Abbreviations, proper nouns & function words* below for the full rule. 2. **libmorph** (independent dictionary, via `libmorph_check`): a common-noun reading ⇒ keep the libmorph lemma. The two dictionaries are treated as **complementary** — a noun reading in *either* is enough (their disagreements were reviewed and resolved this way, @@ -151,6 +153,60 @@ speech. The codes were reverse-engineered (the docs omit the table): The analyser instance is requested with the key `libmorph.api.v4:utf-8` so words are passed and lemmas returned in UTF-8. +## Abbreviations, proper nouns & function words + +OpenCorpora lists indeclinable abbreviations as common nouns (`Abbr`+`Fixd`), so seeding the +result with its whole noun lexicon leaked non-words like **ндс, ст, ср, кпд, чп** into +`scrabble.txt`. They are filtered as follows (see `oc_noun_lemmas`, `oc_abbr_fixd_only`, +`oc_function_word` and the Stage-2 loop in `ru_stage2.py`): + +- An `Abbr`+`Fixd` noun is **never** admitted on OpenCorpora's word alone; the orthographic + dictionary decides via its own note (`classify`): + - attested as a **lowercase** РАН headword whose note is a noun ⇒ **kept** — the + lexicalised abbreviations that are real words: **сельпо, под, ска, роно, врио, тв, фио, + суперэвм** (present in `all.txt`, `classify == noun`); + - everything else ⇒ **dropped**: bare letter-abbreviations not in `all.txt` (ндс, кпд, чп, + гибдд, днк, …) and lowercase РАН headwords whose note is *not* a noun (гор, мин, про — + «приставка»; об, по, со — «предлог»; сто — числительное). +- A word OpenCorpora also reads as a **function word** (`CONJ`/`PRCL`) is dropped even if the + note looks noun-like — **зато** (союз), and any like it. +- A word whose OpenCorpora common-noun reading is an **inflected form** (its lemma is a + different word) is not a headword and stays out — **ан** (род. мн. от «ана»; the proper + noun «Ан», самолёт Антонова, is capitalised and never reaches `all.txt`). + +The discriminator is **not** the `(сокр.)` mark — сельпо carries it just like ндс: + +| word | in `all.txt` (lowercase РАН headword) | `classify` (РАН note) | OC `CONJ`/`PRCL` | verdict | +|------|:---:|:---:|:---:|---------| +| сельпо, под, ска, роно, врио, тв, фио, суперэвм | yes | noun | no | **keep** | +| ндс, кпд, чп, гибдд, днк, … | no | — | no | drop (seed) | +| гор, мин, про, об, по, со, сто, прим | yes | not noun | — | drop (note) | +| зато | yes | — | **yes** | drop (function word) | +| ан | yes | noun | yes | drop (OC lemma ≠ word) | + +### Auditing a word and repeating this analysis + +`--trace WORD` prints a per-signal audit — Stage-1/`all.txt` membership, every OpenCorpora +reading (POS, `Abbr`/`Fixd`, `CONJ`/`PRCL`), libmorph, the РАН note with its `classify` +verdict, and the final outcome: + +```sh +ru-venv/bin/python tools/ru_stage2.py --trace ндс # → НЕ в словаре: исключено из посева +ru-venv/bin/python tools/ru_stage2.py --trace сельпо # → В СЛОВАРЕ: по помете орфословаря +``` + +To find a *whole class* of suspect words (the procedure used to catch the abbreviations above), +read the signals straight from the dictionaries with the same primitives the pipeline uses: + +1. iterate `M._dawg_dict.words_dawg` and collect the lemmas with the grammemes you suspect + (e.g. `Abbr`+`Fixd` on the lemma, no clean noun paradigm) — the candidate set; +2. split it by `w in all.txt` (lowercase РАН headword), by `classify(w, note)` (РАН-note POS), + and by an OpenCorpora `CONJ`/`PRCL` reading — these three signals separate real words from + abbreviations / proper nouns / function words; +3. review the candidate list by hand, add the distinguishing grammeme to the filter, re-run, + and diff the rebuilt list against the previous one to confirm only the intended words moved + (`--trace` each borderline decision). + ## Notes & caveats - The hard tail (≈ 35 000 Stage-1 words / our candidates) is in **no** morphological diff --git a/tools/ru_stage2.py b/tools/ru_stage2.py index 938fe6a..3e87d28 100644 --- a/tools/ru_stage2.py +++ b/tools/ru_stage2.py @@ -38,6 +38,8 @@ LIBMORPH_BIN = os.path.join(HERE, "libmorph_check") ALPHABET = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя" ORDER = {c: i for i, c in enumerate(ALPHABET)} PROPER = {"Name", "Surn", "Patr", "Geox", "Orgn", "Trad"} +ABBR_NOUN = {"Abbr", "Fixd"} # indeclinable abbreviation marker (НДС, КПД, сельпо, …) +FUNCTION_POS = {"CONJ", "PRCL"} # conjunction / particle: a function word, never a Scrabble noun LIBMORPH_NOUN_CODES = set(range(7, 22)) | {24} # 7..21 plus 24 (pluralia tantum) ADJ_END = {"ая", "яя", "ое", "ее", "ье", "ья", "ьи"} VERB3 = ("ет", "ёт", "ит", "ют", "ут", "ает", "яет", "ует", "уют", "нет", "жет", "чет") @@ -72,7 +74,10 @@ D = M._dawg_dict def oc_noun_lemmas(): - """Every common-noun lemma (nom. sing. / pluralia tantum) in OpenCorpora's words.dawg.""" + """Every common-noun lemma (nom. sing. / pluralia tantum) in OpenCorpora's words.dawg, + excluding indeclinable abbreviations (Abbr+Fixd, e.g. НДС, КПД). Such words are admitted + only when the orthographic dictionary attests them as nouns (see oc_abbr_fixd_only and the + Stage-2 loop); abbreviations carried by OpenCorpora alone (ст, ср, кпд, …) are dropped.""" gp, pt = D.get_paradigm, D.parse_tag_string para0, tagc = {}, {} @@ -104,6 +109,8 @@ def oc_noun_lemmas(): pre0, suf0, gr0 = g0(pid) if (PROPER & gr) or (PROPER & gr0): continue + if ABBR_NOUN <= gr0: # indeclinable abbreviation: not seeded; the loop decides via the note + continue stem = word[len(pre):len(word) - len(suf)] if suf else word[len(pre):] out.add(pre0 + stem + suf0) return {w for w in out if cyr_ok(w)} @@ -126,6 +133,43 @@ def oc_status(word): return False, True +def oc_abbr_fixd_only(word): + """True when OpenCorpora's only common-noun reading of word is an indeclinable + abbreviation (Abbr+Fixd) — e.g. сельпо, ндс, ан. Such a word is not admitted as a noun on + OpenCorpora's say-so; the Stage-2 loop hands it to the orthographic note (and the function- + word check) instead, so lexicalised nouns (сельпо, под, ска) survive while bare letter- + abbreviations (ндс, кпд) and proper/служебные homographs (ан, зато) do not.""" + parses = D.get_word_parses(word) + if not parses: + return False + gp, pt = D.get_paradigm, D.parse_tag_string + has_noun = has_plain = False + for pid, idx in parses: + suf, tag, pre = gp(pid, idx) + pos, gr = pt(tag) + if pos != "NOUN": + continue + _, tag0, _ = gp(pid, 0) + _, gr0 = pt(tag0) + if PROPER & gr or PROPER & gr0: + continue + has_noun = True + if not (ABBR_NOUN <= gr0): + has_plain = True + return has_noun and not has_plain + + +def oc_function_word(word): + """True when OpenCorpora reads word as a conjunction or particle — a function word that + shares a spelling with an abbreviation/proper noun (ан «ан нет», зато). It is never a + Scrabble noun even if the orthographic note looks noun-like (ан → «самолёт Антонова»).""" + gp, pt = D.get_paradigm, D.parse_tag_string + for pid, idx in (D.get_word_parses(word) or []): + if pt(gp(pid, idx)[1])[0] in FUNCTION_POS: + return True + return False + + def libmorph_analyze(words): """Map each word to (known, noun_lemma, codes) per libmorph; noun_lemma is None when it is not a common noun there. Empty result if the helper binary is not built.""" @@ -240,9 +284,27 @@ def build(): scrabble = set(oc) adj, verb, amb = [], [], [] for w in pdf: + if oc_abbr_fixd_only(w): + # Indeclinable abbreviation in OpenCorpora: do not trust OC's noun verdict. Drop it + # if OC also reads it as a function word (ан, зато — служебное/пропер); otherwise let + # the orthographic note decide, keeping lexicalised nouns (сельпо, под, ска) and + # dropping the rest (кпд, чп, гор, …). + if oc_function_word(w): + fate[w] = "отброшено: служебное слово (CONJ/PRCL в OpenCorpora)" + elif classify(w, hmap.get(w)) == "noun": + s = to_singular(w) + scrabble.add(s) + fate[w] = "scrabble: несклон. аббрев.-сущ. по помете орфословаря" + ("" if s == w else f" → {s}") + else: + fate[w] = "отброшено: аббревиатура без подтверждающей пометы орфословаря" + continue oc_noun, oc_known = oc_status(w) if oc_noun: - fate[w] = "scrabble: сущ. по OpenCorpora" + # A common-noun reading already put w in the seed (scrabble = set(oc)) — unless its + # lemma is a different word, i.e. w is an inflected form (ан = род. мн. от «ана»); + # such a form is not a headword and stays out. + fate[w] = ("scrabble: сущ. по OpenCorpora" if w in scrabble + else "отброшено: словоформа OpenCorpora (лемма — другое слово)") continue lm_known, lm_lemma, _ = lm.get(w, (False, None, frozenset())) if lm_lemma is not None: @@ -295,21 +357,51 @@ def build(): return { "oc": oc, "scrabble": scrabble, "undefined": undefined, "adjectives": adj, "verbs": verb, "singulars": ed_nouns, - "fate": fate, "all": set(all_words), + "fate": fate, "all": set(all_words), "hmap": hmap, } def trace(word, r): + """A detailed, per-signal audit of how WORD did or did not reach the dictionary: its + Stage-1 (all.txt) membership, every OpenCorpora reading, libmorph, the orthographic note + with its classify verdict, and the final outcome. Used by `--trace WORD`.""" w = destress(word) - if w in r["fate"]: - return r["fate"][w] - if w in r["scrabble"]: - return "scrabble: лексикон OpenCorpora" if w in r["oc"] else "scrabble: производная/лемма" - if w not in r["all"]: - return "нет в russian_all (не извлечено на Stage 1 — нет в .pdf, либо имя собств./дефис/форма)" - if not cyr_ok(w): - return "отсеяно: длина или символы вне диапазона (2–15 кириллица)" - return "не определено" + note = r["hmap"].get(w) + parses = D.get_word_parses(w) or [] + gp, pt = D.get_paradigm, D.parse_tag_string + pos = sorted({pt(gp(pid, idx)[1])[0] for pid, idx in parses}) + oc_noun, _ = oc_status(w) + + out = [f"{word} → {'В СЛОВАРЕ' if w in r['scrabble'] else 'НЕ в словаре'}"] + out.append(f" Stage-1 / all.txt (строчный заголовок РАН): {'да' if w in r['all'] else 'нет'}") + if parses: + kind = ("только несклон. аббрев. (Abbr+Fixd)" if oc_abbr_fixd_only(w) else + "обычное сущ." if oc_noun else + "не существительное") + out.append(f" OpenCorpora: части речи {pos}; как сущ. — {kind}; " + f"служебное (CONJ/PRCL): {'да' if oc_function_word(w) else 'нет'}") + else: + out.append(" OpenCorpora: нет в словаре") + lm = libmorph_analyze([w]).get(w) + if lm: + known, lemma, _ = lm + out.append(" libmorph: " + (f"сущ. → {lemma}" if lemma else ("известно, не сущ." if known else "нет"))) + else: + out.append(" libmorph: helper отсутствует — в анализе не участвует") + out.append(" Орфословарь РАН: " + (f"помета «{note}» → classify={classify(w, note)}" + if note is not None else "нет заголовка")) + reason = r["fate"].get(w) + if reason is None: + if w in r["scrabble"]: + reason = "лексикон OpenCorpora (обычное сущ.)" + elif oc_abbr_fixd_only(w) and w not in r["all"]: + reason = "исключено из посева: несклон. аббрев. (Abbr+Fixd), нет в all.txt" + elif not parses and w not in r["all"]: + reason = "нет ни в OpenCorpora, ни в all.txt" + else: + reason = "не прошло ни один путь отбора" + out.append(f" ИТОГ: {reason}") + return "\n".join(out) def main(): @@ -320,7 +412,7 @@ def main(): r = build() if args.trace: - print(f"{args.trace}: {trace(args.trace, r)}") + print(trace(args.trace, r)) return write(os.path.join(OUT_DIR, "scrabble.txt"), r["scrabble"])