我有一个很大的邮件地址列表(大约一百万),我想使用/调整/创建一个算法来找到它们之间的相似之处(基本上是对它们进行聚类)。
到目前为止我检查过的所有算法,例如 n-gram 变体、词袋等,仅用于对属于上下文的字符串进行聚类,但情况并非如此。
到目前为止,我已经尝试过Levensthein,LCS。它们都非常准确,但我对使用机器学习技术的算法感兴趣,如果此任务存在这样的算法。对于我的数据集,它们也很慢。
我有一个很大的邮件地址列表(大约一百万),我想使用/调整/创建一个算法来找到它们之间的相似之处(基本上是对它们进行聚类)。
到目前为止我检查过的所有算法,例如 n-gram 变体、词袋等,仅用于对属于上下文的字符串进行聚类,但情况并非如此。
到目前为止,我已经尝试过Levensthein,LCS。它们都非常准确,但我对使用机器学习技术的算法感兴趣,如果此任务存在这样的算法。对于我的数据集,它们也很慢。
你说:
到目前为止我检查过的所有算法,例如 n-gram 变体、词袋等,仅用于对属于上下文的字符串进行聚类,但情况并非如此。
但是,如果您不将标记视为完整的单词,而是将其视为字符的组合,则仍然可以使用这些算法。
这是使用 Sklearn 的 Python 中此类算法的示例。
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
data = [
'alex@examplemail.com',
'bernard@examplemail.com',
'chris@newmail.com',
'dorothy@nemail.com',
'emily@examplemail.com'
]
X = TfidfVectorizer(analyzer='char').fit_transform(data)
kmeans = KMeans(n_clusters=2).fit(X)
for cluster in set(kmeans.labels_):
print('\nCluster: {}'.format(cluster))
for i, label in enumerate(kmeans.labels_):
if label == cluster:
print(data[i])
> Cluster: 0
> alex@examplemail.com
> bernard@examplemail.com
> emily@examplemail.com
>
> Cluster: 1
> chris@newmail.com
> dorothy@nemail.com
主要技巧是TfidfVectorizer(analyzer='char'),您不处理n-gram单词,而是处理字符。
PS 如果您在某些时候想要使用单词 n-gram(如果您的句子通常写得很好),您可以使用TfidfVectorizer(analyzer='word').