LINUX.ORG.RU

Изобретаем ранкер для «похожих тем»

 ,


1

3

Как искать «похожие темы» на форуме? - тут я уже спрашивал насчет общих принципов, пора обсудить более приземленные и практические вопросы.

Итак, хочется сделать на коленке тупенький ранкер, дешево и сердито. Без категоризаций контента и попыток понять его смысл. За основу берем sphinx search c его proxmity-запросами (допускающими частичное совпадение), и ранкер bm25.

Теперь хочется к bm25 подмешать дополнительные критерии:

1. Если в теме нет ответов, она явно бесполезна мне как юзеру, поэтому среди «похожих» я бы ее видеть не хотел. С другой стороны, разницы между темами где 1000 и 100000 ответов я уже не вижу.

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

Что еще можно добавить? Где можно потырить готовые коэффициенты для таких логарифмических зависимостей (видел только для reddit)?

★★★★★

Что еще можно добавить?

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

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Не приведёт ли это к тому, что какие-нибудь предлоги или сленг, будучи заюзанными единожды будут иметь максимальный вес при сравнении?

Без категоризации слов по тематикам это не имеет смысла.

ThisNameWasFree
()
Ответ на: комментарий от ThisNameWasFree

Ну это нужно ещё перед построением индексов делать - отфильтровывать значащие слова и приводить их к нормальной форме.

melkor217 ★★★★★
()
Ответ на: комментарий от ThisNameWasFree

Не приведёт ли это к тому, что какие-нибудь предлоги или сленг, будучи заюзанными единожды будут иметь максимальный вес при сравнении?

Для единичных случаев использования вес тоже нужно снижать :)

Без категоризации слов по тематикам это не имеет смысла.

На большой базе вручную — нереально.

KRoN73 ★★★★★
()

Что еще можно добавить?

В сфинке сложне накручивать сложное ранжирование, в отличие от эластика.

anonymous
()
Ответ на: комментарий от anonymous

Эластик столько жрёт, что под приличную базу под него отдельный сервер нужен :)

KRoN73 ★★★★★
()
Ответ на: комментарий от anonymous

Я понимаю, поэтому сразу написал что тупенького ранкера достаточно.

То как сфинкс ранжирует текст (sum(lcs*user_weight)*1000+bm25) меня в принципе устраивает. Но ведь есть не только текстовые критерии. Мне кажется учет количества ответов и даты обновления вполне уместен. Интересует что еще можно привернуть и как.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

Мне кажется учет количества ответов и даты обновления вполне уместен

Да, естественно. При чём учёт даты в каком-то из ранкеров есть изначально.

KRoN73 ★★★★★
()
Ответ на: комментарий от ThisNameWasFree

Не помню как это правильно называется, но смысл в том что по краям у этой сортировки надо обрезать.

spichka ★★★
()
Ответ на: комментарий от Vit

врятли по затратам выйдет дешевле написания нейронки и категоризации. обычно когда человек начинает интересоваться он еще не знает модных слов и терминов, чтоб сразу правильное найти и похожее узреть, но это лишь мое мнение

emptykiev
()
Ответ на: комментарий от emptykiev

Чтобы делать категоризатор, надо критерии хотя бы немного представлять. Иначе будут сказочки про волшебные нейронки.

Vit ★★★★★
() автор топика
Ответ на: комментарий от emptykiev

Меня уже конкретика интересует.

Vit ★★★★★
() автор топика

Что еще можно добавить?

Чтобы учитывалось наличие/отсутствие отметки «Решено» (если такая есть).

sudopacman ★★★★★
()
Ответ на: комментарий от Vit

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

emptykiev
()
Ответ на: комментарий от emptykiev

Ну я и говорю

Угу, я заметил. Обычно говоруны первый пост не читают, им некогда, говорить надо.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

Просто не догон яю, зачем портить продукт таким херовым ранкером? Вроде недостатки наколенных поделий обсудили еще в прошлом на примере ЛОРа, думаешь сильно лучше получится?

emptykiev
()
Ответ на: комментарий от emptykiev

Время не резиновое. Плохой лучше чем полное отсутствие. Такое везде стоит и пока никто не помер.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

Не легче ли тогда СААС каким-то воспользоваться, если уж так больно ранкер нужен, чем свой велос лепить? Сначала сами сошлись на том что хреновые ранкеры хреновые а потом начали еще один изобретать. Ну вперед, чо.

emptykiev
()

А как ты собираешся оценивать результаты? Какой обьем тестовых данных? Размечал вручную? Ложно-положительных к отрицательным какое соотношение?

genryRar ★★
()
Ответ на: комментарий от genryRar

А как ты собираешся оценивать результаты?

Сейчас - фактически никак, «на глаз» ведь не считается. Ну и т.к. заранее понятно что качество далеко от идеала, нет желания заморачиваться. Хочется просто понять в общих чертах, какие факторы могут войти в формулу простого ранкера.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

я спросил потому, что без понимания специфики задачи оперировать факторами ранжирования довольно глупо, уж извини.
Гдето дата - имбовый фактор, гдето репутация пользователей с аппрувнутым решением (для q&a), гдето кол-во комментариев, гдето достаточно вообще только тегов.
И при этом при наличии формализованного алгоритма оценки результата все это уходит на второй план, ибо позволяет прогнать тысячи тестов с любыми факторами, которые только придут в голову и обеспечить выбор этих самых факторов в полуавтоматическом режиме. и этот путь имеет куда больше смысла, ибо для какогонибуть сложного (составного) фактора посчитать его релевантность станет задачей неподьемной. и при этом будет легко решаться через прогон тестов и оценку результатов.

genryRar ★★
()
Ответ на: комментарий от genryRar

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

IMHO из явно полезного - когда ищут конкретное название по заголовкам тем. Иногда пытаются вспомнить «вот недавно обсуждали» и хотят найти внутри темы конкретный пост. Еще будет (позже) барахолка с каталогом, там видимо будет рулить поиск названия модели по заголовкам объявлений. Что ищут по содержимому постов - одному аллаху известно.

По собственному опыту использования поиска на подобных сайтах - чаще наиболее продуктивным оказывается поиск в заголовках с сортировкой по дате.

Демка тут https://dev.rcopen.com/search

Не знаю, есть ли такая понятийная область как «поиск по форуму». Потому что все что написал выше про потребности пользователей - мое не очень достоверное мнение.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

«смешались в кучу кони, люди»
Дак ранкер похожих тем или всетаки поиск? несмотря на похожесть это разные задачи. В первую очередь по тому, что при ранжировании у тебя на входе куда больше данных, чем просто поисковый запрос. И соответственно алгоритм куда навороченнее.

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

genryRar ★★
()
Ответ на: комментарий от genryRar

Я описал все задачи, чтобы было понятно что происходит и что юзеры могут хотеть.

Конкретно в данной теме интересует поиск похожих тем. Обычный proximity search уже есть Изобретаем ранкер для «похожих тем» (комментарий).

Мне не нравится что он может выдать очень старые результаты. Обычно инфа 10-летней давности давно протухла.

И не нравится, что на «Помогите настроить ХХХ», когда нет XXX он начнет выдавать «Помогите настроить YYY».

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

дабы исключить путаницу, оговорюсь - под ранжированием в ЭТОМ топике я имел ввиду ранкер похожих тем. Извиняюсь за неточность формулировки. Все остальное остается также.

Мне не нравится что он может выдать очень старые результаты. Обычно инфа 10-летней давности давно протухла.

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

И не нравится, что на «Помогите настроить ХХХ», когда нет XXX он начнет выдавать «Помогите настроить YYY».

При учете частотности слова «помогите настроить» у тебя в топ вылезут только в исключительных случая. При этом частота их будет на порядок отличаться от XXX. Никаких проблем не вижу, отсеять раз плюнуть. При этом если XXX это не одно слово а например бренд и модель, то в случае отсутствия полного соответствия тема с «помогите настроить тотже бренд другая модель» может комуто оказаться полезнее, чем савсем ничего.

genryRar ★★
()
Ответ на: комментарий от genryRar

на похожесть темы это не влияет, разве нет?

IMHO влияет. Если похожих тем много, то свежие (но не из одного сообщения) скорее всего более предпочтительны. Если похожих тем мало - ну старые тогда тоже сойдут.

Чтобы не путаться в терминологии - юзер все-таки хочет получить в первую очередь полезное, а не «из лучших слов». Поэтому на сайтах, где инфа «проходящая», есть смысл дату учитывать. IMHO на форуме инфа проходящая, в отличие от википедии.

Это конечно очень эмпирически, без доказательств. Из реальных применений видел только статейку про реддит. Больше не нашел.

При учете частотности слова «помогите настроить» у тебя в топ вылезут только в исключительных случая. При этом частота их будет на порядок отличаться от XXX. Никаких проблем не вижу, отсеять раз плюнуть.

Типа нужен пинок, как из этого конкретную формулу собрать, с правдоподобными коэффициентами http://sphinxsearch.com/docs/devel.html#expression-ranker

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

IMHO влияет

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

как из этого конкретную формулу собрать

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

genryRar ★★
()
Ответ на: комментарий от genryRar

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

Такая фича уже есть, и отсечка «за последние XX дней». И в принципе даже хорошо работает. Но вопрос о втором варианте сортировки - по релевантности. Хочется из него что-то выжать, просто из любопытства.

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

Вопрос более прикладной. В сфинксе есть BM25, и он по идее все это считает. Но вроде как еще учитывают количество совпадающих подряд слов и т.п.

Сейчас у меня так: https://github.com/nodeca/nodeca.forum/blob/master/internal/forum/topic_simil...

В доке по сфинксу написаны такие формулы: http://sphinxsearch.com/docs/devel.html#formulas-for-builtin-rankers

У меня получается, что вес хорошего результата 2500, а совсем плохого - 1000 («помогите настроить»). Подозрительно маленькая разница.

Vit ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.