Я не уверен, что есть какой-либо окончательный ответ на эту проблему, поэтому я могу лучше всего объяснить, как я подхожу к этой проблеме, и, надеюсь, вы сможете получить какие-либо идеи от моих промахов. :-)
Первый.
На неродственном угле нечеткое совпадение строк может быть недостаточно. Люди собираются использовать похожие символы и символы, отличные от символов, чтобы обойти любые текстовые совпадения до такой степени, когда между черным списком и фактическим текстом почти нулевой совпадение, и все же он по-прежнему доступен для чтения. Поэтому, возможно, вам понадобится нормализация вашего словаря и текста поиска, например, преобразование всех «0» (нулей) в «O» (капитал O), «> <» на «X» и т. Д. Я считаю, что есть библиотеки и/или ссылки на ссылки на эту цель. Нелатинские символы также являются отличной возможностью и должны учитываться.
Второй.
Я не думаю, что вы сможете различать слова с черным списком и аналогичные варианты в один проход. Так что да, скорее всего, вам придется искать возможные черные списки, а затем проверить, соответствует ли то, что вы нашли, с некоторыми юридическими словами. Это означает, что вам понадобится не только словарь с черным списком, но и словарь с белым списком. На более позитивной ноте, вероятно, нет необходимости нормализовать словарь с белым списком, поскольку люди, которые пишут приемлемый текст, вероятно, напишут его на приемлемом языке без каких-либо трюков, описанных выше. Или вы можете нормализовать его, если почувствуете себя параноиком. :-)
В-третьих.
Однако проблема в том, что совмещение слов/выражений с черными и белыми списками на самом деле не дает вам надежного ответа. Используя ваш пример, человек может написать «большой прикладом» как честную опечатку, которая будет очевидна в контексте (или наоборот, напишите «большой», но «намеренно», чтобы получить более высокий совпадение с белым списком слов, даже если контекст делает это довольно очевидно, что такое реальный смысл). Поэтому вам, возможно, придется проверить контекст, если есть достаточно хорошие совпадения с черными и белыми списками. Это область, с которой я не знаком.Вероятно, возможно построить корреляционные карты для разных слов (из обоих словарей), чтобы определить, какие слова больше (или меньше) часто используются в сочетании с ними, и использовать их для проверки вашего конкретного примера. Используя этот самый абзац в качестве примера, слово «черный» можно было бы включить в белый список, если оно используется вместе с «списком», но в некоторых других случаях занесено в черный список.
В-четвертых.
Даже применяя все эти меры вместе, вы можете захотеть оставить определенное количество серой области. То есть, если в любом направлении не существует достаточно высокой уверенности, оставьте окончательное решение для человека (показывая комментарии/сообщения на какое-то время, автоматически помещая их в очередь модерации или что-то еще, что диктует ваш проект).
В-пятых.
Вы можете попытаться использовать алгоритмы обучения, собирая человеческий ввод с предыдущего шага и используя его для автоматической настройки вашего алгоритма с течением времени.
Надеюсь, что это поможет. :-)
Да, я понял, что машинное обучение - это путь, но я почесываю голову, пытаясь понять это. Я задал вопрос о Cross Validated, задав тот же вопрос, и похоже, что это будет сложно в любом случае. http://stats.stackexchange.com/questions/199311/clustering-a-database-of-strings-based-on-their-similarity-to-a-seperate-set-of/199423?noredirect=1#comment378505_199423 – GreenGodot