170 похожих чатов

Коллеги, всем привет ) есть есть набор фраз, в том числе

похожих, но не до степени сравнения подстрокой
нужно определить наиболее часто встречающиеся

сразу в лоб видится такое решение:
1. перебрать все циклом и посчитать близость текстов попарно
2. установить отсечение, с какого значения считать, что тексты достаточно похожи
3. посчитать количество похожих, ранжировать по убыванию

кто знает, есть ли модели/библиотеки, решающие данную задачу штатным образом?

12 ответов

21 просмотр

Шаги 2 и 3 выполняются стандартно алгоритмами agglomerative clustering – они реализованы, например, в sklearn. Для всей задачи сразу библиотеку не подскажу, но задам два уточняющих вопроса: 1) Какие пары тексты для вас «достаточно похожи», а какие – «похожи, но недостаточно, чтобы отнести их к одному кластеру»? Приведите несколько примеров. От этого зависит, какую меру близости вам советовать. Может быть, нужна близость каких-нибудь тяжелых эмбеддингов, а может, достаточно левенштейна. 2) Между любой парой непохожих текстов можно придумать такую цепочку текстов, что каждые два соседних попарно похожи. Поэтому есть риск, что у вас все или почти все тексты попадут в один мегакластер. В AgglomerativeClustering эту проблему можно решить, поставив параметр linkage="complete", но это может привести к обратной проблеме: какие-то похожие предложения окажутся в разных кластерах. И эта проблема не техническая, а принципиальная: задача разделения непрерывного множества на дискретные куски плохо определена, и если в ваших данных нет четких естественных кластеров, она может просто не иметь хорошего решения. Так что придется придумывать компромиссы.

а что такое - "определить часто встречающиеся"? ибо если просто нужно определить слова или фразы по частотным характеристикам, то можно же использую простейший zipf отсортировать, либо лучше - по idf отсортировать . (если нужно коллокации это чуть сложнее, но несильно, тем же countvectorizer получить co-occurrence матрицу, а дальше по ней посчитать pmi матрицу) но есть подозрение что не это надо. судя по вашему описанию и ответу Давида, это больше на дедупликацию похоже. как бы это не совсем тоже самое, что обычная кластеризация скажем по семантике текстов, тех же эмбеддингов. это задача на самом деле частный случай класса задач link prediction, когда у нас все возможные пары и нужно предсказать какой линк между ними, в простейшем случае same_as/same_cluster/etc. (и метрики многие считаются исходя из этого, такие как precision, recall, etc.) делается да, похожим образом 1. считается self-similarity matrix . если пар много, то лучше заранее прикидывать по сочетаниям из n по 2 = n*(n-1) возможно ли это за предоставленное время и имеющейся памяти - и для большого числа разбивать т.о. датасет, чтобы с большей вероятностью искомые тексты были в одном блоке - т.е. сделать блокинг, потом каждый такой блок обрабатывать отдельно - в простейшем случае сделать token based блокинг aka inverted index (есть еще техники как прунить такие индексы поскольку они довольно сильно тавтологичны) 2. дальше кластеризовать используя выше посчитанный результат, - distance матрицу можно просто посчитать как = 1-self_matrix. agglomerative да вполне годится, можно hierarchical clustering из любого пакета , например отсюда https://pypi.org/project/fastcluster/ . насчет проблемы непохожих, очень хорошо написал Давид, там надо поэкспериментировать и ключевое - все зависит именно от функции которая скоры посчитала (и которой лучше клипать непохожие значения в ноль), поскольку именно все так, есть риск получить один большой ̶о̶с̶т̶р̶о̶в̶кластер где все есть (в частности там внутри у agglomerative используется union-find структура aka connected components, которая все соберет, если из каждой точки есть связность до другой точки). (конечно если не хочется возится с этим, с вопросами similarity/dissimilarity и проблемой транзитивности, можно просто в лоб использовать dbscan с нужным радиусом eps, качество может быть похуже правда) есть задача когда просто нужно найти релевантные тексты. это именно про третий пункт, - "ранжировать по убыванию". 1. создать индекс(какой годится для задачи: есть модель и вектора тогда faiss, если нет ничего, можно tf-idf/bm25/ngram+jaccard/аппроксимация jaccarcd используя MinHashLSH (https://github.com/ekzhu/datasketch)). 2. найти top_k . 3. отфильтровать по threshold (если индекс не возвращает скоры или они не нормализованы, или это distance, то можно просто посчитать для top_k скоры на лету и отфильтровать)

Сбер выложил в открытый доступ свою модель gpt. Подскажите, каких ресурсов будет достаточно для запуска на локальном компьютере (дать запрос, получить ответ)? Системы с 3080 (10 гигов), Рязань 3700х и 64 гига оперативки хватит?

Anton
Сбер выложил в открытый доступ свою модель gpt. По...

На гпу не влезет. На проце будет, но медленно

datascience xc
На гпу не влезет. На проце будет, но медленно

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

datascience xc
Уже есть

В чате Сбера которая?

Grigory Frantsuzov
В чате Сбера которая?

https://huggingface.co/gurgutan/ruGPT-13B-4bit

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта