vitaly
Хеширование по сигнатуре
Этот алгоритм описан в статье Бойцова Л.М. «Хеширование по сигнатуре». Он базируется на достаточно очевидном представлении «структуры» слова в виде битовых разрядов, используемой в качестве хеша (сигнатуры) в хеш-таблице.
При индексации такие хеши вычисляются для каждого из слов, и в таблицу заносится соответствие списка словарных слов этому хешу. Затем, во время поиска, для запроса вычисляется хеш и перебираются все соседние хеши, отличающиеся от исходного не более чем в k битах. Для каждого из таких хешей производится перебор списка соответствующих ему слов.
Процесс вычисления хеша — каждому биту хеша сопоставляется группа символов из алфавита. Бит 1 на позиции i в хеше означает, что в исходном слове присутствует символ из i-ой группы алфавита. Порядок букв в слове абсолютно никакого значения не имеет.
vitaly
вот теперь - кто нить может это реализовать на луа???
Ivan
vitaly
https://habr.com/post/114997/
vitaly
тут все рассписано в теории
vitaly
https://code.google.com/archive/p/fuzzy-search-tools/source/default/source
vitaly
тут исходинки на джвае
Ivan
https://gist.github.com/wtsnjp/2b193a5b8096126050055f12ea90ee43
vitaly
да мне это нх не нужно
vitaly
это слишком сложно для порно сайта
vitaly
это искусство для всех
vitaly
http://lua-users.org/lists/lua-l/2008-01/msg00095.html
vitaly
function levenshtein(s, t)
local s, t = tostring(s), tostring(t)
if type(s) == 'string' and type(t) == 'string' then
local m, n, d = #s, #t, {}
for i = 0, m do d[i] = { [0] = i } end
for j = 1, n do d[0][j] = j end
for i = 1, m do
for j = 1, n do
local cost = s:sub(i,i) == t:sub(j,j) and 0 or 1
d[i][j] = math.min(d[i-1][j]+1, d[i][j-1]+1, d[i-1][j-1]+cost)
end
end
return d[m][n]
end
end
vitaly
алгоритм вот есть - частное решение уже сам могу додумать 😀 - другое дело что сложно это все - но не безнадежно - поиски то сохранены в базе - анализ их можно проводить хоть месяцы никто не подгоняет
vvzvlad
Что-то я в регулярки не вкурю никак. Как сказать, что надо захватывать строку, в конце которой может быть "/", а может и не быть? "(.-)/?" не работает, "(.-)[/]* тоже
Snusmumriken
Мм. "(.-)/?$"
.- == .*? (в PCRE), захватывает наименьшую последовательность.
Если есть шанс не схомячить ничего - оно не схомячит ничего.
Поэтому нужен правый ограничитель, если тебе всё таки нужно что-то схомячить.
/? - плохой ограничитель, потому что с ним можно не считаться.
$ - хороший ограничитель, с ним нельзя не считаться и он указывает на конец строки.
vvzvlad
ну вот * жадный же, а все равно не захватывает
Snusmumriken
Последовательность "ноль или более".
То есть, (.-) пытается захватить наименьшую последовательность, а /* - думает что после этой наименьшей (например, после пустой строки) может быть и ноль символов /, поэтому можно не морочиться.
Snusmumriken
Хех.
Snusmumriken
Карочи, с /* можно не считаться точно так же как с /?.
Snusmumriken
Блин, тут надо моск чутка перестроить и много экспериментировать.
Я сам регулярно проверяю-перепроверяю регулярки, на всяк случ, и иногда они меня ещё удивляют.
vvzvlad
Запутался. вот у меня строка "/wb/AN4SSJFL/wb-map12h/156/Frequency", которую я в цикле разбираю такой регуляркой: "/(.-)(/.*)", где первый захват — подстрока, а второй захват — новая строка, которая снова разбирается той же регуляркой. И все хорошо, но вот последнее значение не захватывается, потому что ожидается вида "/нечто/", а оно "/нечто". Не пойму как захватить.
vvzvlad
Я обходным путем разобрал нормально, но хочется понять, как это сделать красиво за одно действие
Snusmumriken
Ты не можешь делать такие конструкции:
str:match('(/foo(/)bar/)'),
чтобы из строки /foo/bar/ вычленялось
/foo/ и /bar/.
Приводить и нормализовать придётся в любом случае.
vvzvlad
Не, а мне и не надо. первый токен захватывается без разделителей, значит разделитель остается второму захвату
vvzvlad
просто на последней итерации мне надо захватить не "/(.-)(/.*)", а "/(.-)(.*)"
Snusmumriken
Карочи.
function parse(url)
local list = {}
for block in (url .. '/'):gmatch('(.-)/+') do
list[#list + 1] = '/' .. block .. '/'
end
return list
end
Snusmumriken
Хм, ну довольно близко. Первый слеш убрать и ок.
vvzvlad
vvzvlad
ой
vvzvlad
А зачем добавлять "/"?
vvzvlad
Мне наоборот, надо без них захватить, только токены, без разделителей
Snusmumriken
Окей. Убери разделители при добавлении в список.
vvzvlad
На самом деле, к моему коду можно было тоже просто добавить topic = topic.."/", и все.
vvzvlad
Спасибо)
Александр
Подскажите: статически линкуюсь с liblua5.3.a (C++), получаю неотлаживаемый код, когда захожу во внутренности либы. Хочу слинковаться с каким-нибудь liblua5.3.a-debug, но в упор не нахожу у себя в системе (Debian 9) подобного. Вопрос - ЧЯДНТ?
mva
если вкратце, то всё
mva
во-первых, отсутствие debug-сборки проблема дебиана и с этим надо на их багтркер (впрочем, можно нарваться на мейнтейнера-упорка и выслушать что ты дурак и тебе это не нужно и он лучше знает как паковать)
mva
во-вторых - не стоит свято надеяться на бинарный дистрибутив при разработке. Собери Lua из исходников и будут тебе и дебаг либа и всё что хочешь
mva
как ни печально, но да
mva
правда, это было давно и с git-daemon'ом
Александр
Александр
раз уж зашёл.. никто не сталкивался с проблемой сегфолтов при использовании общего lua_State из разных shared library, где каждая имеет свой статически слинкованный lua (один и тот же)?
mva
маловероятно что кто-то ответит на это утвердительно
mva
т.к. попахивает чем-то, чего делать не стоит
mva
общий стейт для разных библиотек сам по себе выглядит опасно
mva
даже если принять за истинность утверждение о том, что все они слинкованы с одной и той же статической liblua (что может таки однажды оказаться и ложным утверждением)
Александр
mva
мне кажется, в этом случае, лучше линковать (и держать стейты) в основной бинарник, который и подгружает те динамические библиотеки, которые сейчас слинкованы с lua
mva
впрочем, допустимость общего стейта для разных библиотек всё равно зависит от контекста
Александр
разные либы дают разный вклад в прослойку C++ <-> lua
Александр
любопытно - собрал свежий lua из сорцов, проблема исчезла
vitaly
бугага - бугага
vitaly
6 лет работы с рести на практике и мучений с луа 😂
Snusmumriken
Ну, если ты борешься с технологией - происходит явно что-то не то : )
Snusmumriken
Луа рассчитана на непрограммистов : )
Это, конечно, может значить что "программистам будет тяжко", с таким-то синтаксисом (do-then-end) и индексацией массивов с единички, но за шесть лет-то можно давно перестать бороться с луями ))
Tadeusz
Tadeusz
ну и с ~= тоже, ибо хотелось !=
Snusmumriken
Ну, нумерация с единицы подзадалбывает только в самом начале и в крайних случаях. Зато типа сразу видно сколько конкретно элементов будет внесено, после луёв переходить на нуль-индексацию задалбывает несколько больше, потому что надо напрягать моск в сторону вычислений "а скока элементов", особенно во всяких двухмерных-трёхмерных массивах.
vitaly
vitaly
В данной связке много прелестей и много чего изобретать приходиться.
vitaly
Мне сайты делать нужно :). Мне парсеры контента нужны. Луа подходит.
Snusmumriken
Это просто один из способов.
Ты просто уточняешь что "луа сам по себе бесполезен", а я тут типо на luajit делаю вендовые сервисы и кнопочно-окошечные приложули ))
Snusmumriken
Ну типа дополнительное вендовое окно, прикрученное к love2d, с обратной связью. Что характерно, winapi чисто через luajit. Никаких внешних dll-ок (кроме user32 и system32 из папки с:/windows/system32)
Andrei
Snusmumriken
Ну, могу гифку записать ))
Andrei
Andrei
Snusmumriken
Поздно
Yuriy
Snusmumriken
На luajit можно писать всё что можно писать на сишке, поэтому лично я нежно люблю именно luajit (совершенно произвольные вещи). Там есть недостатки в виде "нельзя писать слишком сложное ПО из-за хреноватого стека jit-трасс", но сравнительно небольшие вещи - запросто, и скорость исполнения в данном случае близка к той же сишке.
Если мы пишем "нормальную" прогу на плюсах/сишке - аналогично, сценарии эффективнее скриптовать луями (потому что легко переписать/модифицировать без компиляций-перекомпиляций). Фактически, мы делаем ядро, расширяющее синтаксис луа, и уже скриптиками дёргаем эти расширения.
В общем, имхо, вполне можно практически полностью переходить на луа, за редким исключением (системный код/фронтенд), благо уже куча вещей используют луи за скрипто-основу (тарантул/редис/рести/игрушки). Если бы какой-нибудь андроид использовал луа вместо java, имхо, у него было бы значительно меньше проблем производительности/тормозов/проблем с написанием ПО (но это не точно) и не нужен был бы NDK, ибо сишка под луа ложится нативно, в отличии от.
Но скорость разработки самой ОС, вероятно, замедлилась бы за отсутствием многих библиотек в поставке.
vitaly
я не против
vitaly
но мне кушать нада
vitaly
по этому порносайты
Yuriy
А еще делал call-center как оказалось потом для питерского борделя )
Yuriy
Я скидон деньгами забрал )
Yuriy
Зачем?)
Snusmumriken
Пожизненный. Приходишь такой в 80 лет, обслуживайте, мол.