Coder Social home page Coder Social logo

georgy7 / russiannounsjs Goto Github PK

View Code? Open in Web Editor NEW
41.0 3.0 4.0 13.46 MB

Склонение существительных по падежам. Обычно требуются только форма в именительном падеже, одушевлённость и род.

License: MIT License

JavaScript 100.00%
russian-language russian-morphology russian-specific declension russian no-dependencies zero-dependency pluralization inflection inflector

russiannounsjs's Introduction

npm version MIT License


Logo

RussianNounsJS

A JavaScript library that declines nouns.

View Demo · Run Tests · Report Bug · Wiki

Table of Contents
  1. Installation
  2. Usage
  3. Limitations
  4. References

Installation

Frontend

<script src="RussianNouns.js"></script>

or (without AMD)

<!-- from the same domain -->
<script type="module" src="myscript.js"></script>
import 'RussianNouns.js';

or (in a Web Worker)

importScripts('RussianNouns.js');

Backend

npm i --save russian-nouns-js
const RussianNouns = require('russian-nouns-js');

For TypeScript, there are type definitions written by Alexander Semin.

Usage

The basics

RussianNouns.CASES;
// [
//     "именительный",
//     "родительный",
//     "дательный",
//     "винительный",
//     "творительный",
//     "предложный",
//     "местный"
// ]

// Grammatical gender is a noun class system in Russian.
RussianNouns.Gender;
// {
//     FEMININE: "женский",
//     MASCULINE: "мужской",
//     NEUTER: "средний",
//     COMMON: "общий"
// }

const rne = new RussianNouns.Engine();

rne.decline({text: 'имя', gender: 'средний'}, 'родительный');
// [ "имени" ]

rne.decline({text: 'имя', gender: 'средний'}, 'творительный');
// [ "именем" ]

const Gender = RussianNouns.Gender;
const Case = RussianNouns.Case;

let coat = RussianNouns.createLemma({
    text: 'пальто',
    gender: Gender.NEUTER,
    indeclinable: true
});

rne.decline(coat, Case.GENITIVE);
// [ "пальто" ]

RussianNouns.getDeclension(coat);
// -1

let mountain = RussianNouns.createLemma({
    text: 'гора',
    gender: Gender.FEMININE
});

RussianNouns.CASES.map(c => {
    return rne.decline(mountain, c);
});
// [
//     ["гора"]
//     ["горы"]
//     ["горе"]
//     ["гору"]
//     ["горой", "горою"]
//     ["горе"],
//     ["горе"]
// ]

rne.pluralize(mountain);
// [ "горы" ]

RussianNouns.CASES.map(c => {
    return rne.decline(mountain, c, 'горы');
});

// [ 
//     [ 'горы' ]
//     [ 'гор' ]
//     [ 'горам' ]
//     [ 'горы' ]
//     [ 'горами' ]
//     [ 'горах' ]
//     [ 'горах' ]
// ]

RussianNouns.getDeclension(mountain);
// 2

RussianNouns.getSchoolDeclension(mountain);
// 1

let way = RussianNouns.createLemma({
    text: 'путь',
    gender: Gender.MASCULINE
});

RussianNouns.getDeclension(way);
// 0

let scissors = RussianNouns.createLemma({
    text: 'ножницы',
    pluraleTantum: true
});

rne.pluralize(scissors);
// [ 'ножницы' ]

RussianNouns.CASES.map(c => {
    return rne.decline(scissors, c);
});
// [
//     [ 'ножницы' ]
//     [ 'ножниц' ]
//     [ 'ножницам' ]
//     [ 'ножницы' ]
//     [ 'ножницами' ]
//     [ 'ножницах' ]
//     [ 'ножницах' ] 
// ]

Stress dictionary tuning

let кринж = RussianNouns.createLemma({
    text: 'кринж',
    gender: Gender.MASCULINE
});

const rne = new RussianNouns.Engine();

rne.decline(кринж, Case.INSTRUMENTAL);  // [ "кринжем" ]

// Change of stresses.
// Before the hyphen, there are singular settings.
// After the hyphen are the plural settings.
// The letter number in the settings is the case number in CASES.
// S — Stress is on the stem only.
// s — Stress is more often on the stem.
// b — Stress can be both on the stem and the ending equally.
// e — Stress is more often on the ending.
// E — Stress is on the ending only.
rne.sd.put(кринж, 'SEESESE-EEEEEE');

rne.decline(кринж, Case.INSTRUMENTAL);  // [ "кринжом" ]

rne.sd.put(кринж, 'SEESbSE-EEEEEE');
rne.decline(кринж, Case.INSTRUMENTAL);  // [ "кринжем", "кринжом" ]

rne.sd.put(кринж, 'SEESsSE-EEEEEE');
rne.decline(кринж, Case.INSTRUMENTAL);  // [ "кринжем", "кринжом" ]

rne.sd.put(кринж, 'SEESeSE-EEEEEE');
rne.decline(кринж, Case.INSTRUMENTAL);  // [ "кринжом", "кринжем" ]

A complex example

const rne = new RussianNouns.Engine();

const  = (word, caseNumber) => {
    const c = RussianNouns.CASES[caseNumber - 1];
    return rne.decline(word, c)[0];
};

const  = (word, caseNumber) => {
    const c = RussianNouns.CASES[caseNumber - 1];
    const result = rne.decline(word, c);
    return result[result.length - 1];
};

const ⰃⰃ = (word, caseNumber) => {
    const c = RussianNouns.CASES[caseNumber - 1];
    const pluralForm = rne.pluralize(word)[0];
    return rne.decline(word, c, pluralForm)[0];
};

const L = RussianNouns.createLemma;
const Gender = RussianNouns.Gender;
const cap = (str) => str[0].toUpperCase() + str.substring(1);

// -----------------------------------------------

// Александр Сергеевич Пушкин
// Зимний вечер (фрагмент)

const буря = L({text: 'буря', gender: Gender.FEMININE});
const мгла = L({text: 'мгла', gender: Gender.FEMININE});
const небо = L({text: 'небо', gender: Gender.NEUTER});
const вихрь = L({text: 'вихрь', gender: Gender.MASCULINE});

const зверь = L({text: 'зверь', gender: Gender.MASCULINE, animate: true});
const дитя = L({text: 'дитя', gender: Gender.NEUTER, animate: true});

const кровля = L({text: 'кровля', gender: Gender.FEMININE});
const солома = L({text: 'солома', gender: Gender.FEMININE});

const путник = L({text: 'путник', gender: Gender.MASCULINE, animate: true});
const окошко = L({text: 'окошко', gender: Gender.NEUTER});

console.log(`${cap((буря, 1))} ${(мгла, 5)} ${(небо, 4)} кроет,
${cap(ⰃⰃ(вихрь, 4))} снежные крутя;
То, как ${(зверь, 1)}, она завоет,
То заплачет, как ${(дитя, 1)},
То по ${(кровля, 3)} обветшалой
Вдруг ${(солома, 5)} зашумит,
То, как ${(путник, 1)} запоздалый,
К нам в ${(окошко, 4)} застучит.`);

// Буря мглою небо кроет,
// Вихри снежные крутя;
// То, как зверь, она завоет,
// То заплачет, как дитя,
// То по кровле обветшалой
// Вдруг соломой зашумит,
// То, как путник запоздалый,
// К нам в окошко застучит.

// -----------------------------------------------

// Николай Степанович Гумилев
// Рассказ девушки (фрагмент)

const ворота = L({text: 'ворота', pluraleTantum: true});
const тень = L({text: 'тень', gender: Gender.FEMININE});
const ель = L({text: 'ель', gender: Gender.FEMININE});
const снег = L({text: 'снег', gender: Gender.MASCULINE});
const высота = L({text: 'высота', gender: Gender.FEMININE});

console.log(`* * *
Я отдыхала у ${ⰃⰃ(ворота, 2)}
Под ${(тень, 5)} милой, старой ${(ель, 2)},
А надо мною пламенели
${cap(ⰃⰃ(снег, 1))} неведомых ${ⰃⰃ(высота, 2)}.`);

// * * *
// Я отдыхала у ворот
// Под тенью милой, старой ели,
// А надо мною пламенели
// Снега неведомых высот.

Limitations

This library does not prevent you from misusing the singularia tantum.

References

  • Современный русский язык. Морфология - Камынина А.А., Уч. пос. 1999 - 240 с.
  • Russian grammar (English Wikipedia)
  • OpenCorpora (Russian text corpus)
  • К семантике русского локатива ("второго предложного" падежа) - Плунгян В. А., Семиотика и информатика. - Вып. 37. - М., 2002. - С. 229-254

Please take the survey to make this library better.

russiannounsjs's People

Contributors

georgy7 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

russiannounsjs's Issues

Улучшить API локатива

Хоть библиотека и выдаёт нужную форму слова, без предлогов или дополнительной семантической информации, эту форму не получится использовать для синтеза осмысленного текста.

Окончания нье/ньи в предложном падеже ед. ч. Средний род.

Слов, у которых по корпусу должно быть окончание -ньи довольно много. У меня не получилось выделить какие-то признаки, по которым их можно было бы определить.
Сейчас эти слова вываливаются в предупреждения.

Ссылки по теме:
https://rus.stackexchange.com/questions/426448/%d0%a1%d1%83%d1%89%d0%b5%d1%81%d1%82%d0%b2%d0%b8%d1%82%d0%b5%d0%bb%d1%8c%d0%bd%d1%8b%d0%b5-%d0%bd%d0%b0-%d0%bd%d1%8c%d0%b5-%d0%b2-%d0%bf%d1%80%d0%b5%d0%b4%d0%bb%d0%be%d0%b6%d0%bd%d0%be%d0%bc-%d0%bf%d0%b0%d0%b4%d0%b5%d0%b6%d0%b5-%d0%ba%d0%be%d0%b3%d0%b4%d0%b0-%d0%b8-%d0%ba%d0%be%d0%b3%d0%b4%d0%b0-%d0%b5

http://litset.ru/stuff/21-1-0-468

Хотя это относится не к языку, а скорее к правописанию.

Тестирование 1. Подготовить данные OpenCorpora (ед.ч.)

В ветке gh-pages есть данные из словаря OpenCorpora для определения рода, одушевленности существительного и его несклоняемости. Этот словарь компактный, там вся необходимая для алгоритма информация. Он хорош для демонстрации алгоритма.

Нужно подготовить OpenCorpora в другом формате - список склоненных форм для всех лемм. Пока что только формы в ед.ч. Расположить эти данные в другой папке. Например, OpenCorpora-Testing. Названия файлов nouns_singular_а.json.

И переделать страницу test так, чтобы она проверяла алгоритм по этому словарю, и показывала процент верных.
Т.к. список очень большой, лучше сделать так, чтобы показывался урезанный список (первая тысяча, например, и только буква А: эта страница потом вообще будет не нужна, ее выкинем, возможно).

Migration to ES Module

Hello! I want to know when this project will migrate to ESM?

I use Deno and the workaround to support CommonJS modules is too long: you need both Deno's PM and NPM installed in one project. Not good

Слово "счёт" во множественном числе в родительном падеже склоняется неправильно.

Сейчас возвращается: "счет".
Должно быть "счетов/счётов".

Также пропадает буква "ё" во множественном числе.

Output:
singular: [счёт, счёта, счёту, счёт, счётом, счёте, счету]
plural: [счета, счет, счетам, счета, счетами, счетах, счетах]

Пробую слово "товар"

Получаю:

ед множ
["товар"] ["товари"]
["товара"] ["товар"]
["товару"] ["товарям"]
["товар"] ["товари"]
["товаром"] ["товарями"]
["товаре"] ["товарях"]
["товаре"] -

Хочется исправления )))

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.