и посмотреть медиа
Data analysis - DA SQL
и посмотреть медиа
Data analysis: SQL, Python.
Data analysis: SQL, Python.
AI bot for text-to-speech and voice cloning in Telegram. Create audio using neural network quickly and easily.
About data analysis: databases, SQL, Python and more for analysts.
Нечёткий поиск и дедупликация записей на Python В DWH бывают ситуации, когда разные записи означают одно и то же. Например, "ООО Ромашка", "ООО Ромашкa" (с лат. 'a') и "Ромашка ООО" могут быть 3 разными клиентами в витрине, но 1 реальным бизнесом. Таких расхождений может быть много. Вручную перебирать это долго и неэффективно, т.к. есть риск что-то пропустить. На помощь приходит кластеризация дубликатов при помощи косинусного сходства. Суть метода в следующем: 1️⃣Данные нужно подготовить, т.е. привести к одному формату: убрать лишние пробелы и переносы, сокращения, привести текст к нижнему регистру. Нужно это для облегчения работы алгоритма и для снижения риска лишних ошибок. Делается это просто и быстро: import pandas as pd import numpy as np from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity #ДАННЫЕ + DataFrame df['name1'] = df['name'].str.lower().str.strip().str.replace(r'\s+', ' ', regex=True) 2️⃣Затем делается блокировка - т.е. выбирается сильный атрибут (ИНН, ОГРН, номер телефона) и вокруг него строится кластеризация, где ищутся названия с опечатками. Но стоит сделать оговорку. Во-первых, если нужно сделать JOIN, то можно сделать это по ИНН или другому сильному атрибуту, а не по битым названиям. Во-вторых, если такой JOIN невозможен или не нужен, то можно в каком-нибудь полу-автоматическом режиме заменить названия, фильтруя их по логике SELECT name FROM table WHERE inn = XXX Представить на практике ситуации, где невозможно ни то, ни другое, довольно сложно. Поэтому логичнее усложнить задачу и представить, что твердого атрибута нет. Например, такое возможно в клиентских таблицах, где клиенты - физ лица. В таких таблицах часто единственный идентификатор помимо id - это ФИО человека, и всяких ИНН там может и не быть. 🟠Но если в таблице много строк, то блокировка все равно нужна, т.к. она делит расчет на блоки. Если же в лоб сравнивать каждую запись между собой, то скорее всего такая операция никогда не будет завершена. Если нет ни одного сильного атрибута, то универсальный способ - это блокировать по первым буквам ФИО. Если есть хоть какая-то другая информация, то можно использовать её: год рождения, последние цифры номера телефона... И еще в случае с ФИО важно отсортировать слова по алфавиту: df['name_sorted'] = df['name1'].apply(lambda x: ' '.join(sorted(x.split()))) df['block_key'] = df['name_sorted'].str[0] print(df[['name', 'name_sorted', 'block_key']].to_string(index=False)) 3️⃣И, наконец, построение самой кластеризации: all_pairs = [] threshold = 0.9 for block_key, group in df.groupby('block_key'): if len(group) < 2: continue vectorizer = TfidfVectorizer(analyzer='char_wb', ngram_range=(2, 4)) tfidf_matrix = vectorizer.fit_transform(group['name_sorted']) cosine_sim = cosine_similarity(tfidf_matrix) rows, cols = np.where(cosine_sim > threshold) pairs = [ (r, c, round(cosine_sim[r, c], 3)) for r, c in zip(rows, cols) if r < c ] for r, c, score in pairs: all_pairs.append({ 'id_1': group.iloc[r]['client_id'], 'id_2': group.iloc[c]['client_id'], 'score': score }) df_pairs = pd.DataFrame(all_pairs) df_pairs['name_1'] = df_pairs['id_1'].map(df.set_index('client_id')['name']) df_pairs['name_2'] = df_pairs['id_2'].map(df.set_index('client_id')['name']) print(df_pairs[['name_1', 'name_2', 'score']].to_string(index=False)) Задается порог косинусного сходства (threshold) от 0 до 1. 1 - выводятся идентичные данные. 0 - выводятся все данные. Потом данные группируются по признаку блокировки. Затем для блоков текст режется на n-граммы (кусочки по 2-4 буквы). Это нужно для того, чтобы находить опечатки. Т.к. там, где есть опечатки, только 1-2 n-грамма будут различаться, что в итоге даст высокий threshold и позволит обнаружить дубликаты. Ну а дальше текст превращается в вектора, между ними ищется косинусное сходство и выводится в виде матрицы. И фильтруются те пары, которые проходят заданный нами порог threshold.
Открыть канал и посмотреть медиаOnly registered users can share their opinion.
Be the first to share your impression of this resource!