У меня есть список из ~ 20 000 адресов электронной почты, некоторые из которых я знаю как мошеннические попытки обойти ограничение "1 на электронную почту", например [email protected], [email protected], username1b @gmail.com и т.д. Я хочу найти похожие адреса электронной почты для оценки. В настоящее время я использую алгоритм Levenshtein для проверки каждого сообщения электронной почты против других в списке и сообщения любого с расстоянием редактирования менее 2. Однако это кропотливо медленно. Существует ли более эффективный подход?
Используемый мной тестовый код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading;
namespace LevenshteinAnalyzer
{
class Program
{
const string INPUT_FILE = @"C:\Input.txt";
const string OUTPUT_FILE = @"C:\Output.txt";
static void Main(string[] args)
{
var inputWords = File.ReadAllLines(INPUT_FILE);
var outputWords = new SortedSet<string>();
for (var i = 0; i < inputWords.Length; i++)
{
if (i % 100 == 0)
Console.WriteLine("Processing record #" + i);
var word1 = inputWords[i].ToLower();
for (var n = i + 1; n < inputWords.Length; n++)
{
if (i == n) continue;
var word2 = inputWords[n].ToLower();
if (word1 == word2) continue;
if (outputWords.Contains(word1)) continue;
if (outputWords.Contains(word2)) continue;
var distance = LevenshteinAlgorithm.Compute(word1, word2);
if (distance <= 2)
{
outputWords.Add(word1);
outputWords.Add(word2);
}
}
}
File.WriteAllLines(OUTPUT_FILE, outputWords.ToArray());
Console.WriteLine("Found {0} words", outputWords.Count);
}
}
}
Изменить: Некоторые вещи, которые я пытаюсь уловить, выглядят следующим образом:
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]