Комментарии 30
Ух ты ж ё-моё. Позавчера подумал, что надо написать такую хреновину. Теперь с нуля писать не стану. :)
+1
Форкайте на здоровье :)
0
Вместе с извлечением смысла из предложений будет интересен и обратный процесс. Формирование предложений из полученного смысла. В какой стадии данная часть проекта? Сразу приходит на ум масса областей в которых можно было бы применить подобную разработку.
0
Пока в нулевой: только-только довёл до ума морфологию.
По поводу смыслов меня уже заранее немного беспокоит тот факт, что нынешний словарь (словарь OpenCorpora) не содержит никакой семантической информации. Сейчас при разборе нельзя даже узнать идентификатор разобранного слова в словаре (не говоря о том, что этим идентификаторам хорошо бы быть векторами, полученными из word2vec, например...).
А ещё, кстати, валентность глаголов не помешает собрать откуда-нибудь — как-то мало словарей такую информацию содержат, к сожалению.
По поводу смыслов меня уже заранее немного беспокоит тот факт, что нынешний словарь (словарь OpenCorpora) не содержит никакой семантической информации. Сейчас при разборе нельзя даже узнать идентификатор разобранного слова в словаре (не говоря о том, что этим идентификаторам хорошо бы быть векторами, полученными из word2vec, например...).
А ещё, кстати, валентность глаголов не помешает собрать откуда-нибудь — как-то мало словарей такую информацию содержат, к сожалению.
0
Есть ли typescript definition?
0
Чувак! Ты крут! Обязательно опробую в свободное время :) Спасибо
+1
Я как-то пробывал писать что-то похожее на scala. Тоже по мотивам pymorphy.
Так вот. Самой сложной частью для меня оказалась реализация структуры DAWG для хранения словарей.
Так и не смог этого сделать. Использовал два префиксных дерева.
Как вы это обходили?
Так вот. Самой сложной частью для меня оказалась реализация структуры DAWG для хранения словарей.
Так и не смог этого сделать. Использовал два префиксных дерева.
Как вы это обходили?
0
Порылся в исходниках и нашел. Я не самый большой спец по JS но вышлядит красиво. Теперь есть что курить чтоб переписать на scala) Ато раньше попадались версии только на С\С++, а они были не очень удобными для изучения.
0
Скажу по секрету — до конца в формат у меня так и не удалось вникнуть :)
Точнее, там все понятно, кроме центральной части — спуска к следующей вершине дерева:
Ну то есть, эээ, тут делается xor текущего индекса вершины с куском значения, лежащего в ней, а потом xor с символом, в который мы переходим… Wat?
В общем, я эту магию практически «дословно» переписал с питона и она магическим же образом заработала. К счастью, самая сложная часть в DAWG — это построение словаря, а в библиотеке это не нужно, нужно только уметь его читать.
Точнее, там все понятно, кроме центральной части — спуска к следующей вершине дерева:
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 — это построение словаря, а в библиотеке это не нужно, нужно только уметь его читать.
0
НЛО прилетело и опубликовало эту надпись здесь
Пока что нет: хочется хорошо уметь работать с одним языком, чем средненько со многими. Ряд моментов в коде привязан к специфичным особенностям русского — как минимум предсказатели слов точно. Наверняка для более распространенных языков уже существуют толковые решения.
Если поддержка в какой-то момент и появится, то начнется это, скорее всего, с родственных русскому языков — например, как в pymorphy2, с украинского.
Если поддержка в какой-то момент и появится, то начнется это, скорее всего, с родственных русскому языков — например, как в pymorphy2, с украинского.
0
Для украинского или английского языка сложно приспособить?
0
Для английского весьма сложно. Нужно уметь собирать словарь из какого-нибудь другого источника, написать свои предсказатели для неизвестных слов. Для украинского проще — например, pymorphy2 умеет, но для этого все равно надо как минимум собрать отдельный словарь, а инструмент для этого ещё не выложен в открытый доступ.
Поддержка других языка пока не в самом высоком приоритете.
(Конечно, Az.Tokens более универсален и уже сейчас адекватно должен дробить тексты на языках, использующих кириллицу или латиницу)
Поддержка других языка пока не в самом высоком приоритете.
(Конечно, Az.Tokens более универсален и уже сейчас адекватно должен дробить тексты на языках, использующих кириллицу или латиницу)
0
я пользую solarix.ru :)
0
НЛО прилетело и опубликовало эту надпись здесь
Ну я и ES5 не считаю таким уж длинным и грязным.
Библиотека не слишком большая, не хотелось добавлять необходимость её транспайлить при сборке. Сейчас можно смело подключить прямо исходники (в демке они так и подключены) и экспериментировать с кодом «вживую», без дополнительных инструментов.
Ладно, признаю, я просто старомоден :)
Библиотека не слишком большая, не хотелось добавлять необходимость её транспайлить при сборке. Сейчас можно смело подключить прямо исходники (в демке они так и подключены) и экспериментировать с кодом «вживую», без дополнительных инструментов.
Ладно, признаю, я просто старомоден :)
+2
Извините за оффтопик, но зачем тут первая картинка?
+1
Иллюстрация к тому, откуда взялось название библиотеки.
0
Очень плохая и псевдонаучная иллюстрация. К русскому языку и его истории отношения не имеет.
Полуркайте «Ахиневич».
Полуркайте «Ахиневич».
+1
Беда. Уже и случайную картинку из гуглопоиска нельзя взять, не задев мракобесие какое-нибудь (хотя почва тут, конечно, благодатная).
Ладно, заменил картинку иллюстрацией из Википедии. Надеюсь, с ней ничего ужасного ни у кого не ассоциируется.
Ладно, заменил картинку иллюстрацией из Википедии. Надеюсь, с ней ничего ужасного ни у кого не ассоциируется.
0
Кроме персонажа по имени «Аметист-палач» ничего ужасного :)
Но это уже мои лично-семейные ассоциации.
Главное, чтоб на ангела борцы с религиями не набижали.
Но это уже мои лично-семейные ассоциации.
Главное, чтоб на ангела борцы с религиями не набижали.
0
А покажите первоначальный вариант, пожалуйста. Ну или каким запросом искать.
0
Ничего криминального, на первый взгляд.
![](https://habrastorage.org/r/w1560/files/db7/c2b/920/db7c2b920a264b1da0edf60467619e9a.png)
![](https://habrastorage.org/files/db7/c2b/920/db7c2b920a264b1da0edf60467619e9a.png)
0
Зато на второй взгляд выковыриваются варианты букв, сделанные отдельными буквами, лигатура от, сделанная отдельной буквой, странные названия для букв кириллицы и, наконец, шедевр: буква æ, которая использовалась ранее в интернете при html-изданиях летописей в те далёкие годы, когда найти в кириллических кодировках ѣ или ѧ было проблематично (а ꙗ и вовсе отсутствовала вместе с Уникодом), а сунуть их в текст как-то надо было, вот и заменяли на латинскую лигатуру.
Но нашлись альтернативные умы, которые решили, что «так в древнесловянском и было» и сотворили сию «Буквицу».
Но нашлись альтернативные умы, которые решили, что «так в древнесловянском и было» и сотворили сию «Буквицу».
0
думаю было бы неплохо добавить параметр «силы слова» и «эмоциональной окраски» или эмоционального вектора. Грубо говоря — удивление, вопрос, злость и т.д.
0
Очень хотелось посмотреть как раз на морфоразбор, а он на все подряд говорит
Может это как-то связано с
Точно, в хроме все хорошо.
ушел развлекаться
Результаты разбора
Нет вариантов
Может это как-то связано с
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
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
Точно, в хроме все хорошо.
ушел развлекаться
0
Здорово, конечно. Биг дата. Словарь в монгоДБ. Рутину на ядра, чтоб распараллелить подзадачи.
А вот еще можно парсить/анализировать арифметические задачи, их сюжет. И выводить на экран соответствующу формулу решения. Стоить попробовать.
А вот еще можно парсить/анализировать арифметические задачи, их сюжет. И выводить на экран соответствующу формулу решения. Стоить попробовать.
0
Забросили библиотеку?
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Az.js: JavaScript-библиотека для обработки текстов на русском языке