Skip to content

Commit

Permalink
Update readme; bump version
Browse files Browse the repository at this point in the history
  • Loading branch information
mixaildudin committed Jul 11, 2020
1 parent f048573 commit 8914adb
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 23 deletions.
58 changes: 37 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,11 @@
* водоворот -> х\*еворот
* бзглснхбкв -> `null`

В последнем случае построить х*ефицированную форму не удалось.
Как видно, в последнем случае построить х*ефицированную форму не удалось.

#### Особенности
* Нет внешних зависимостей
* Синхронный API

## Использование
### REPL
Expand All @@ -27,33 +31,30 @@
### В коде
#### Самый простой вариант использования
```javascript
const DefaultStressManager = require('reduplicator').DefaultStressManager;
const Reduplicator = require('reduplicator').Reduplicator;
const { DefaultStressManager, Reduplicator } = require('reduplicator');

const dict = new DefaultStressManager();
const r = new Reduplicator(dict);
r.reduplicate('собака'); // => х*яка
```

#### Как это все устроено и почему пакет весит 60Мб
На то, какая будет гласная после префикса "ху" и сколько будет слогов в итоговом слове, влияет ударение в слове исходном. Пример:
#### Как это работает
На то, какая будет гласная после префикса "ху" и сколько будет слогов в итоговом слове, влияет ударение в исходном слове. Пример:
* собáка -> х\*яка
* со́бака -> х\*ёбака

Поэтому `reduplicator` внутри себя использует словарь ударений. **Словарь весит около 60Мб.**
Именно из-за этого и сам пакет весит так много.

Редупликатору для работы нужна реализация [интерфейса](https://github.com/mixaildudin/reduplicator/blob/master/src/interfaces/stressManager.ts) `StressManager`. То есть *нечто, что умеет определять ударение в слове*. Сейчас таких реализаций написано две:
Поэтому редупликатору для работы нужна реализация [интерфейса](https://github.com/mixaildudin/reduplicator/blob/master/src/interfaces/stressManager.ts) `StressManager`. То есть *нечто, что умеет определять ударение в слове*. Сейчас таких реализации написано три:
* `DefaultStressManager` - работает со встроенным словарем ударений
* `DynamicStressManager` - умеет работать со встроенным словарем, но ему также можно подсказать правильное ударение в слове
* `DynamicStressManager` - умеет работать со встроенным словарем, но пользователи также могут указать ему какое-то своё ударение в слове
* `NullStressManager` - всегда отвечает, что ударение неизвестно и не использует словарь ударений. Может пригодиться для случаев, когда мало памяти и загружать в нее словарь нет возможности.
Разумеется, результат работы редупликатора будет хуже

В теории можно легко написать свою реализацию с произвольной логикой.

#### Продвинутый вариант использования
Если мы хотим использовать встроенный словарь ударений, но также иметь возможность указывать редупликатору кастомные ударения в словах (подробнее о пользовательских ударениях - ниже):
Если мы хотим использовать встроенный словарь ударений, но также иметь возможность указывать редупликатору кастомные ударения в словах:
```javascript
const DynamicStressManager = require('reduplicator').DynamicStressManager;
const Reduplicator = require('reduplicator').Reduplicator;
const { DynamicStressManager, Reduplicator } = require('reduplicator');

const dict = new DynamicStressManager();
const r = new Reduplicator(dict);
Expand All @@ -63,20 +64,21 @@ r.reduplicate('собАка'); // => х*яка
r.reduplicate('собака'); // => х*яка - ударение возьмется из встроенного словаря
```

`DynamicDictionaryManager` анализирует регистр букв в слове и, если одна гласная буква в нем написана капсом (например, "москвА"), посчитает ее ударной.
`DynamicDictionaryManager` анализирует регистр букв в слове и, если одна и только одна гласная буква в нем написана капсом (например, "москвА"), посчитает ее ударной.
Эти ударения можно сохранять в кастомный словарь, который переопределяет встроенный. Об этом - ниже.

#### Пользовательский словарь ударений
Если в дефолтном словаре нет какого-то слова, для него редупликатор может давать не совсем точные результаты. Решить эту проблему можно с помощью пользовательских словарей. Так вы можете сообщить редупликатору ударения для новых слов или переопределить дефолтные ударения.
#### Переопределение встроенных ударений
Если во встроенном словаре нет какого-то слова, для него редупликатор может давать не совсем правильный результат. Решить эту проблему можно с помощью пользовательского словаря. Так вы можете сообщить редупликатору ударения для новых слов или переопределить дефолтные ударения.

Для этого подходит все тот же `DynamicDictionaryManager`.

Его конструктор принимает два необязательных параметра:
* путь к JSON-файлу с пользовательским словарем ударений; на момент создания объекта файл не обязательно должен существовать
* путь к JSON-файлу с пользовательским словарем ударений (на момент создания объекта файл не обязательно должен существовать)
* второй параметр - `boolean`, если его установить в `true`, пользовательский словарь будет read-only. Это может быть полезно, если вы хотите подложить какие-то свои слова, но не доверяете пользователям изменять словарь.

JSON-файл со словарем должен иметь формат "слово -> zero-based индекс ударной буквы".

Например, чтобы переопределить дефолтное ударение в слове "собака", как будто оно падает на первый слог, т.е. букву "о" (индекс буквы "о" - 1), создайте файл `custom.json` со следующим контентом:
Например, чтобы переопределить дефолтное ударение в слове "собака", как будто оно падает на первый слог, т.е. букву "о" (индекс буквы "о" - 1), создайте файл `custom.json` со следующим содержимым:
```json
{
"собака": 1
Expand All @@ -86,7 +88,13 @@ JSON-файл со словарем должен иметь формат "сло
В коде создайте экземпляр `DynamicStressManager` и передайте ему путь к словарю:

```javascript
const dict = new DynamicStressManager('./custom.json', true);
const path = require('path');
const { DynamicStressManager, Reduplicator } = require('reduplicator');

// допустим, путь к вашему словарю такой
const customDictionaryPath = path.join(__dirname, './custom.json');

const dict = new DynamicStressManager(customDictionaryPath, true);
const r = new Reduplicator(dict);
r.reduplicate('сОбака'); // => х*ёбака
```
Expand All @@ -98,8 +106,16 @@ r.reduplicate('сОбака'); // => х*ёбака
## Тесты
`npm run test`

## Что нового
#### v1.1.0
* Инициализация редупликатора ускорена приблизительно в 25 раз
* Потребление оперативной памяти снижено в 5 раз
* Объем пакета в распакованном виде уменьшен в 11 раз
* Улучшена обработка слов, содержащих дефисы
* Добавлен `NullStressManager`

## Кредиты
Словарь ударений составлен из словаря "Полная парадигма. Морфология. Частотный словарь. Совмещенный словарь. Автор М. Хаген", доступного [тут](http://www.speakrus.ru/dict/).

## P.S.
Пожелания, баг-репорты, звезды на гитхабе, пулл-реквесты - все это приветствуется.
## Фидбэк
Предложения, баг-репорты, звезды на гитхабе, пулл-реквесты - любой фидбэк приветствуется.
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "reduplicator",
"version": "1.0.6",
"version": "1.1.0",
"description": "Х*ефикатор русских слов",
"keywords": [
"russian",
Expand Down

0 comments on commit 8914adb

Please sign in to comment.