Pull to refresh

Comments 30

Ух ты ж ё-моё. Позавчера подумал, что надо написать такую хреновину. Теперь с нуля писать не стану. :)

Форкайте на здоровье :)
Вместе с извлечением смысла из предложений будет интересен и обратный процесс. Формирование предложений из полученного смысла. В какой стадии данная часть проекта? Сразу приходит на ум масса областей в которых можно было бы применить подобную разработку.
Пока в нулевой: только-только довёл до ума морфологию.

По поводу смыслов меня уже заранее немного беспокоит тот факт, что нынешний словарь (словарь OpenCorpora) не содержит никакой семантической информации. Сейчас при разборе нельзя даже узнать идентификатор разобранного слова в словаре (не говоря о том, что этим идентификаторам хорошо бы быть векторами, полученными из word2vec, например...).

А ещё, кстати, валентность глаголов не помешает собрать откуда-нибудь — как-то мало словарей такую информацию содержат, к сожалению.
Пока нет. В исходниках есть JSDoc-комменты — я думаю, можно пройтись по ним и довольно быстро написать.
Чувак! Ты крут! Обязательно опробую в свободное время :) Спасибо
Я как-то пробывал писать что-то похожее на scala. Тоже по мотивам pymorphy.
Так вот. Самой сложной частью для меня оказалась реализация структуры DAWG для хранения словарей.
Так и не смог этого сделать. Использовал два префиксных дерева.
Как вы это обходили?
Порылся в исходниках и нашел. Я не самый большой спец по JS но вышлядит красиво. Теперь есть что курить чтоб переписать на scala) Ато раньше попадались версии только на С\С++, а они были не очень удобными для изучения.
Скажу по секрету — до конца в формат у меня так и не удалось вникнуть :)

Точнее, там все понятно, кроме центральной части — спуска к следующей вершине дерева:

DAWG.prototype.followByte = function(c, index) {
  var o = offset(this.units[index]);
  var nextIndex = (index ^ o ^ (c & 0xFF)) & PRECISION_MASK;

  if (label(this.units[nextIndex]) != (c & 0xFF)) {
    return MISSING;
  }

  return nextIndex;
}

Ну то есть, эээ, тут делается xor текущего индекса вершины с куском значения, лежащего в ней, а потом xor с символом, в который мы переходим… Wat?

В общем, я эту магию практически «дословно» переписал с питона и она магическим же образом заработала. К счастью, самая сложная часть в DAWG — это построение словаря, а в библиотеке это не нужно, нужно только уметь его читать.
В AOT вот есть английский и немецкий, не планируете добавление других языков?
Пока что нет: хочется хорошо уметь работать с одним языком, чем средненько со многими. Ряд моментов в коде привязан к специфичным особенностям русского — как минимум предсказатели слов точно. Наверняка для более распространенных языков уже существуют толковые решения.

Если поддержка в какой-то момент и появится, то начнется это, скорее всего, с родственных русскому языков — например, как в pymorphy2, с украинского.
Для украинского или английского языка сложно приспособить?
Для английского весьма сложно. Нужно уметь собирать словарь из какого-нибудь другого источника, написать свои предсказатели для неизвестных слов. Для украинского проще — например, pymorphy2 умеет, но для этого все равно надо как минимум собрать отдельный словарь, а инструмент для этого ещё не выложен в открытый доступ.

Поддержка других языка пока не в самом высоком приоритете.

(Конечно, Az.Tokens более универсален и уже сейчас адекватно должен дробить тексты на языках, использующих кириллицу или латиницу)
UFO landed and left these words here
Ну я и ES5 не считаю таким уж длинным и грязным.

Библиотека не слишком большая, не хотелось добавлять необходимость её транспайлить при сборке. Сейчас можно смело подключить прямо исходники (в демке они так и подключены) и экспериментировать с кодом «вживую», без дополнительных инструментов.

Ладно, признаю, я просто старомоден :)
Извините за оффтопик, но зачем тут первая картинка?
Иллюстрация к тому, откуда взялось название библиотеки.
Очень плохая и псевдонаучная иллюстрация. К русскому языку и его истории отношения не имеет.
Полуркайте «Ахиневич».
Беда. Уже и случайную картинку из гуглопоиска нельзя взять, не задев мракобесие какое-нибудь (хотя почва тут, конечно, благодатная).

Ладно, заменил картинку иллюстрацией из Википедии. Надеюсь, с ней ничего ужасного ни у кого не ассоциируется.
Кроме персонажа по имени «Аметист-палач» ничего ужасного :)
Но это уже мои лично-семейные ассоциации.
Главное, чтоб на ангела борцы с религиями не набижали.
А покажите первоначальный вариант, пожалуйста. Ну или каким запросом искать.
Ничего криминального, на первый взгляд.

Зато на второй взгляд выковыриваются варианты букв, сделанные отдельными буквами, лигатура от, сделанная отдельной буквой, странные названия для букв кириллицы и, наконец, шедевр: буква æ, которая использовалась ранее в интернете при html-изданиях летописей в те далёкие годы, когда найти в кириллических кодировках ѣ или ѧ было проблематично (а ꙗ и вовсе отсутствовала вместе с Уникодом), а сунуть их в текст как-то надо было, вот и заменяли на латинскую лигатуру.
Но нашлись альтернативные умы, которые решили, что «так в древнесловянском и было» и сотворили сию «Буквицу».
думаю было бы неплохо добавить параметр «силы слова» и «эмоциональной окраски» или эмоционального вектора. Грубо говоря — удивление, вопрос, злость и т.д.
Было бы неплохо, конечно. Трудности возникают в отсутствии такой информации в OpenCorpora и других общедоступных базах.

Если кому-то известны открытые ресурсы, из которых подобные вещи можно было бы почерпнуть — буду благодарен.
Очень хотелось посмотреть как раз на морфоразбор, а он на все подряд говорит
Результаты разбора
Нет вариантов


Может это как-то связано с
opera dev console log
az.js:2 GET http://denull.github.io/Az.js/dicts/words.dawg 502 ()load @ az.js:2DAWG.load @ az.dawg.js:3Morph.init @ az.morph.js:39(anonymous function) @ (index):117
az.dawg.js:2 Uncaught RangeError: Offset is outside the bounds of the DataViewDAWG.fromArrayBuffer @ az.dawg.js:2(anonymous function) @ az.dawg.js:3xhr.onload @ az.js:2XMLHttpRequest.send (async)load @ az.js:2DAWG.load @ az.dawg.js:3Morph.init @ az.morph.js:39(anonymous function) @ (index):117
az.js:2 GET http://denull.github.io/Az.js/dicts/prediction-suffixes-0.dawg 502 ()load @ az.js:2DAWG.load @ az.dawg.js:3(anonymous function) @ az.morph.js:39Morph.init @ az.morph.js:39(anonymous function) @ (index):117
az.dawg.js:2 Uncaught RangeError: Offset is outside the bounds of the DataViewDAWG.fromArrayBuffer @ az.dawg.js:2(anonymous function) @ az.dawg.js:3xhr.onload @ az.js:2XMLHttpRequest.send (async)load @ az.js:2DAWG.load @ az.dawg.js:3(anonymous function) @ az.morph.js:39Morph.init @ az.morph.js:39(anonymous function) @ (index):117
az.js:2 GET http://denull.github.io/Az.js/dicts/p_t_given_w.intdawg 502 ()load @ az.js:2DAWG.load @ az.dawg.js:3Morph.init @ az.morph.js:39(anonymous function) @ (index):117
az.dawg.js:2 Uncaught RangeError: Offset is outside the bounds of the DataViewDAWG.fromArrayBuffer @ az.dawg.js:2(anonymous function) @ az.dawg.js:3xhr.onload @ az.js:2XMLHttpRequest.send (async)load @ az.js:2DAWG.load @ az.dawg.js:3Morph.init @ az.morph.js:39(anonymous function) @ (index):117
az.js:2 GET http://denull.github.io/Az.js/dicts/prediction-suffixes-1.dawg 502 ()load @ az.js:2DAWG.load @ az.dawg.js:3(anonymous function) @ az.morph.js:39Morph.init @ az.morph.js:39(anonymous function) @ (index):117
az.dawg.js:2 Uncaught RangeError: Offset is outside the bounds of the DataViewDAWG.fromArrayBuffer @ az.dawg.js:2(anonymous function) @ az.dawg.js:3xhr.onload @ az.js:2XMLHttpRequest.send (async)load @ az.js:2DAWG.load @ az.dawg.js:3(anonymous function) @ az.morph.js:39Morph.init @ az.morph.js:39(anonymous function) @ (index):117
az.js:2 GET http://denull.github.io/Az.js/dicts/paradigms.array 502 ()load @ az.js:2Morph.init @ az.morph.js:39(anonymous function) @ (index):117
az.morph.js:39 Uncaught RangeError: byte length of Uint16Array should be a multiple of 2


Точно, в хроме все хорошо.
ушел развлекаться
Здорово, конечно. Биг дата. Словарь в монгоДБ. Рутину на ядра, чтоб распараллелить подзадачи.
А вот еще можно парсить/анализировать арифметические задачи, их сюжет. И выводить на экран соответствующу формулу решения. Стоить попробовать.
Only those users with full accounts are able to leave comments. Log in, please.