похожих, но не до степени сравнения подстрокой
нужно определить наиболее часто встречающиеся
сразу в лоб видится такое решение:
1. перебрать все циклом и посчитать близость текстов попарно
2. установить отсечение, с какого значения считать, что тексты достаточно похожи
3. посчитать количество похожих, ранжировать по убыванию
кто знает, есть ли модели/библиотеки, решающие данную задачу штатным образом?
Шаги 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 гига оперативки хватит?
На гпу не влезет. На проце будет, но медленно
Сколько памяти требует? Есть возможность ужать модель, чтобы влезла на гпу?
Ну в int8 на 16 гигов vram влезает
Дождитесь int4 версии, она точно влезет
В чате Сбера которая?
https://huggingface.co/gurgutan/ruGPT-13B-4bit
увидел, спасибо )
увидел, спасибо )
Обсуждают сегодня