У меня большое количество текстовых сообщений.Я хочу найти обычные шаблоны, за которыми следуют эти сообщения (скажем, 20 самых распространенных шаблонов).Примеры сообщений:
msg1 = "Rahul, Your New Delhi (NDLS) - Agra Cantt (AGC) train booking is confirmed.\nPNR: 1234567890\nBooking ID: ABCDE123456789012\nView your Trip Here: https://xyz.app.link/A0b1cDEFGH\nFor any queries please write to some_url.com.\n\nHappy with our service? Rate us 5 stars: https://xyz.app.link/e/5stars"
msg2 = "Shyamu, Your Tenali Jn (TEL) - Secunderabad Jn (SC) train booking is confirmed.\nPNR: 2345678901\nBooking ID: ABCDE123456789011\nView your Trip Here: https://xyz.app.link/Ab0cdEFGHI\nFor any queries please write to some_url.com.\n\nHappy with our service? Rate us 5 stars: https://xyz.app.link/e/5stars"
msg3 = "Ramu, Sorry! Booking for your Jammu Tawi (JAT) - Kurukshetra Jn (KKDE) train with Booking ID: ABCDE123456789013 could not be confirmed due to payment failure.If money has been deducted from your account, your money will automatically be refunded to your account within 5 days.\nRe-book your ticket https://xyz.app.link/a0B1cDEFGH"
Вы можете видеть, что msg1 и msg2 используют один и тот же шаблон / шаблон (см. Ниже), а msg3 отличается (могут быть другие шаблоны обмена сообщениями с msg3).Мое требование - найти такие часто встречающиеся шаблоны в моих данных.Для приведенного выше примера шаблон / шаблон будет выглядеть следующим образом:
"<> Your <> - <> train booking is confirmed.\nPNR: <> ID: <> your Trip Here: <> any queries please write to some_url.com.\n\nHappy with our service? Rate us 5 stars: https://xyz.app.link/e/5stars"
Я попытался выполнить следующее:
- Использовал CountVectorizer для векторизации текстовых данных.
- Использовал DBSCANКластеризация для поиска всех кластеров и сортировки по размеру кластера.
Для 20 лучших кластеров:
i) Выберите 10 случайных сообщений.
ii) Найдите шаблонза ними следуют некоторые строковые манипуляции.
Вышеописанный метод работал, но кластеризация кажется узким местом и занимает значительное время.(около 10 минут для 100000 сообщений в моей системе)
Функция Python для поиска кластеров:
from sklearn.cluster import DBSCAN
import collections
def find_cluster(M_vector):
# M_vector: Vectorized messages
dbscan = DBSCAN(eps = 2, min_samples = 5)
cls = dbscan.fit_predict(M_vector)
count_dict = collections.Counter(cls)
count_dict = sorted(count_dict.items(), key = lambda kv:(kv[1], kv[0]), reverse = True)
return cls, count_dict
У меня такое ощущение, что проблему можно решить без использования машинного обучения, но яне знаю, как действовать для достижения результатов за меньшее время.В худшем случае сложность времени DBSCAN, по-видимому, составляет O(n^2)
(в среднем O(nlog(n))
).
Я предполагаю, что использование алгоритма Вагнера-Фишера приведет к увеличению времени, так как в нем будут вычисления для каждого сообщения с каждым другим сообщением (O(n^2)
сложность времени).