Giter Site home page Giter Site logo

az.js's Introduction

Az – JS-библиотека для морфологического анализа, токенизации и прочих NLP-задач для русского языка.

Основана на библиотеке pymorphy2 для Python.

Состоит из следующих модулей:

  • Az.Tokens (az.tokens.js). Токенизация. Умеет корректно разбивать текст (в виде строки) на токены. Понимает разные виды токенов — гиперссылки (в том числе без "http://" или "www." в начале), хэштеги, электронные адреса. Кроме того, умеет разбирать HTML-, вики- и Markdown-разметку.
  • Az.Morph (az.morph.js). Морфология. Определяет части речи и прочие грамматические признаки русских слов, как существующих в словаре, так и отсутствующих в нём, в том числе из-за опечаток. Словари имеют формат, очень близкий к формату словарей pymorphy2, но отличаются в некоторых деталях ради компактности. В данный момент словари доступны как часть библиотеки (в папке dicts/), в дальнейшем планируется возможность собирать их самостоятельно (из базы OpenCorpora).
  • Az.Syntax (az.syntax.js). Синтаксис. (в планах)

Поддержать автора

Данная библиотека является бесплатным программным обеспечением и вы можете её свободно использовать в соответствии с лицензией MIT.

Если вы захотите поддержать автора — это можно сделать на сайте Patreon. Я буду вам благодарен.

Установка

Через npm:

$ npm install az --save
var Az = require('az');

Через bower:

$ bower install az --save
<script src="bower_components/az/dist/az.min.js"></script>

Полезные ссылки

Токенизация

Пример:

var tokens = Az.Tokens('Мама мыла раму').done();
// => 3 слова, 2 пробельных токена

Конструктор Az.Tokens принимает на вход строку и разбивает её на токены. Например, каждое слово, последовательность пробелов, пунктуация — считаются отдельными токенами. Никакого дополнительного анализа над токенами не производится.

При этом разбивка производится относительно «умным» способом, который позволяет выделять в отдельные токены ссылки, хэштеги и адреса электронной почты. Кроме «чистого» текста поддерживается HTML-, вики- и Markdown-разметка (никакой особой структуры при этом не строится, но сущности разметки — например, HTML-теги — выделяются в отдельные токены).

Кроме того, токенизатор написан таким образом, чтобы в него можно было подавать текст кусками, и он при этом корректно обрабатывает токены на стыках кусков:

var tokens = Az.Tokens('Длинный те')
  .append('кст, разбиты')
  .append('й на несколько частей')
  .done(); // => 6 слов, 5 пробельных токенов, 1 знак препинания

Например, можно читать большой документ, постепенно «скармливая» его токенизатору.

Пробелы (и прочие служебные символы) всегда превращаются в токены наравне с остальным контентом. Это позволяет, например, склеить текст в точности в том виде, в котором он был до токенизации. Однако это может быть не очень удобно при обработке токенов. Для упрощения работы «доставать» токены можно с фильтрацией: то есть игнорировать токены определенных типов (или, наоборот, извлекать токены определенных типов).

В плане публичного API токенизатор вдохновлен классом StringTokenizer в Java.

Подробная документация: Az.Tokens.

Морфология

Пример:

Az.Morph.init('bower_components/az/dicts', function() {
  var parses = Az.Morph('стали');
  console.log(parses); // => 6 вариантов разбора
  console.log(parses[0].tag.toString()); // => 'VERB,perf,intr plur,past,indc'
  console.log(parses[1].tag.toString()); // => 'NOUN,inan,femn plur,nomn'
});

Морфологический анализатор принимает на вход единственное слово (например, полученное после токенизации) и возвращает массив возможных вариантов его разбора: часть речи, падеж, род и т.д. Варианты сортируются по убыванию «правдоподобия», поэтому предполагается, что первый вариант должен быть ближе всего к истине.

Для разбора используются словари в специальном формате DAWG, поэтому перед работой с морфологическим модулем их следует загрузить: вызвать метод Az.Morph.init([path], callback) и дождаться их загрузки (вызова callback). По умолчанию они грузятся из подпапки dicts, но её можно указать вручную первым параметром.

Как и в pymorphy2, в Az для неизвестных слов работают предсказатели (только в pymorphy2 они называются анализаторами, а тут — парсерами). Список применяемых парсеров можно посмотреть в исходниках и при желании переопределить с помощью опции parsers в конфиге. Кроме того, можно писать свои парсеры и складывать в объект Az.Morph.Parsers – они также будут доступны для анализа.

В дополнение к предсказателям, при словарном разборе можно разрешить исправление опечаток и т.н. «заикания» (это когда в слове преднамеренно растягивают буквы: «го-о-ол», «нееет»). Это, очевидно, несколько ухудшает производительность (особенно это касается именно опечаток), поэтому использоваться должно осознанно. В целом же библиотека писалась с упором на хорошую работу не только в «тепличных условиях» (когда предполагается идеальная корректность текста на входе), но в «дикой природе».

Каждый вариант разбора представляет из себя, грубо говоря, предполагаемую форму слова (т.н. «тег») и описание того, как слово нужно склонять. Просклонять его можно методом inflect, привести в начальную форму — методом normalize. Метод pluralize согласует слово с числом.

Тег — некий набор атрибутов слова (граммем), часть которых являются изменяемыми, часть — неизменяемыми. Некоторые граммемы являются «булевыми» (то есть они либо есть, либо нет) — например, наличие граммемы Arch означает, что слово является устаревшим. В таком случае присутствие такой граммемы проверяется так: if (parses[0].tag.Arch) ... (или if ('Arch' in parses[0].tag) ...). Другие граммемы объединяют в себя список «дочерних» граммем: например, граммема CAse обозначает падеж, и может принимать значения nomn, gent и т.д. В таком случае поле parses[0].tag.CAse содержит строку (допустим, 'gent') + присутствует и дочерняя граммема сама по себе: parses[0].tag.gent == true. Полный список возможных граммем доступен на сайте OpenCorpora.

Подробная документация: Az.Morph.

Синтаксис

В дальнейших планах предполагается работа над синтаксическим анализом предложений (построением синтаксических деревьев) и извлечением смыслов.

az.js's People

Contributors

denull 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  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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

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

az.js's Issues

Слишком мутный API

Почему нельзя было написать нормальный API без издевательств над библеотекой?

 {
    
    'МС': true,
    POST: 'МС',
    'мр': true,
    GNdr: 'мр',
    '3л': true,
    PErs: '3л',
    'Анаф': true,
    'ед': true,
    NMbr: 'ед',
    'им': true,
    CAse: 'им',
    POS: 'МС'
}

Чтобы определить лицо мне нужно

const лицо = variants[0].tag.PErs

Проблема с Az.Morph.init()

Привет! Я понимаю, что автор библиотеки давным-давно забил на нее (что конечно очень печально, поскольку альтернатив похоже просто не существует), но может кто-то еще пользуется ей и может помочь?

Я всё что не делал, как ни пытался, у меня никак не получается нормально встроить эту библиотеку в код. Изначально я планировал сделать так, что бы библиотека инициализировалась один раз, и потом ее методоми я бы пользовался когда мне было угодно. Но я так и не понял как так спроектировать инициализацию таким образом что бы ее методы мне были доступны всегда. Такое впечатление, что ее колбек кривой (или кривой — я).

Потом я плюнул и решил инициализировать библиотеку каждый раз, когда мне нужен ее метод и пришел к следующему:

// В функцию передается массив со строками
async function getMorph(arr) {
  console.log('сейчас будет загрузка библиотеки!')
  let rawNoun = await Az.Morph.init("./node_modules/az/dicts", () => {
    console.log('библиотека загружена!')
    // Тут мы используем метод и как-то обрабатываем переданный массив, строчка ниже просто для примера
    let noun = arr[0]
    return noun;
  })
  return rawNoun;
}

В консоли следующее:

сейчас будет загрузка библиотеки!
undefined
библиотека загружена!

Я понимаю что он возвращает промис, но как подружить все это с async/await я не понимаю.

Надеюсь кто-нибудь живой увидит это сообщение и сможет помочь или даже поделиться примером рабочего кода. И да, пишу на Deno, а не на NodeJS. Не уверен, что это имеет значение в данном случае, но все же.

Всем мир!

Пытаюсь юзать либку, в консоле выдаёт fs.readFile is not a function

Пытаюсь запустить
Az.Morph.init('node-modules/az/dicts', function() {
var parses = Az.Morph('стали');
console.log(parses); // => 6 вариантов разбора
console.log(parses[0].tag.toString()); // => 'VERB,perf,intr plur,past,indc'
console.log(parses[1].tag.toString()); // => 'NOUN,inan,femn plur,nomn'
});

Чекал код библиотеки, по идее должен был работать для винди и без первого параметра, но почему-то у меня не работает))

бьёт в файле az.js
строчка 14
fs.readFile(url, { encoding: responseType == 'json' ? 'utf8' : null }, function (err, data) {

Может я чего не понимаю, подскажи как пофиксить ПЖ или расскажи чё нужно для работы

License

Пожалуйста добавьте License файл.

Failed to configure tokenizer

var Az = require("az");
var tokens = Az.Tokens();
tokens.append(input, {});
tokens = tokens.done();

This code throws exception on line 3:
config = config ? Az.extend(this.config, config) : this.config;
ReferenceError: Az is not defined

Numeral "2-й, 3-й, 4-й, 5-й..." wont analyze by Az.Morph

Abbreviation of numarals "2-й, 3-й, 4-й, 5-й..." wont analyze by Az.Morph - its returning just empty array.
Сокращения числительных 2-й, 3-й, 4-й и т.д. не обрабатываются Az.Morph - возвращается пустой массив.

Ошибка при инициализации Az.Morph.init

Добрый день! Не могли бы вы подсказать в чем может быть причина следующей ошибки при выполнении кода

Az.Morph.init('node_modules/az/dicts', function() {
var parses = Az.Morph('стали');
console.log(parses); // => 6 вариантов разбора
console.log(parses[0].tag.toString()); // => 'VERB,perf,intr plur,past,indc'
console.log(parses[1].tag.toString()); // => 'NOUN,inan,femn plur,nomn'
});

Ошибка:
var dv = new DataView(data),
^
Error: Object must be an ArrayBuffer.
at Function.DAWG.fromArrayBuffer (node_modules\az\dist\az.js:127:14)
at node_modules\az\dist\az.js:138:39
at node_modules\az\dist\az.js:24:13
at fs.js:266:14
at Object.oncomplete (fs.js:107:15)

Surn issue

Пытаюсь склонять фамилии, но Az почему-то упорно не может определить фамилии вроде "Исинбаев" или "Иммануилов" как фамилии (Surn: true). Как быть ?
"Петров" же нормально определяет...

Incorrect inflection of patronymics

Wrong normalisation of patronymic words.

const morp = Az.Morph("Александрович")[0]
morp.normalize()

will return

{
  formCnt: 36
  formIdx: 0
  paradigm: Uint16Array(108) [ 0, 52, 12283, … ]
  paradigmIdx: 26
  prefix: ""
  score: 1
  stutterCnt: 0
  suffix: ""
  tag: Object { NOUN: true, POST: "NOUN", anim: true, … }
  typosCnt: 0
  word: "александр"
}

So the inflections of this word is also wrong

morp.inflect({CAse: 'datv'})
/*
  ...
  tag: Object { NOUN: true, POST: "NOUN", anim: true, … }
  typosCnt: 0
  word: "александру"
*/

Module not found: Error: Can't resolve 'fs' - Как исправить?

Здравствуйте!
Не могу запустить библиотеку из-за ошибки:
ERROR in ../node_modules/az/dist/az.js Module not found: Error: Can't resolve 'fs' in '/Users/tonyshow/Hosts/anyships_new/node_modules/az/dist' @ ../node_modules/az/dist/az.js 8:13-26 @ ./pages/Index/IndexPage.tsx @ ./app.tsx @ ./index.js

Error with 'fs' module

2017-06-19 21 29 35

The project is on Vue.js. I added [AZ.js](https://github.com/deNULL/Az.js), which requires 'fs'. I have this module in my 'node-modules', and I tried to solve this problem by Google, however nothing had helped me.

Could you help me?

Можно по-русски)

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.