2016-03-02 11 views
0

У меня есть таблица базы данных, содержащая более миллиона строк. Каждая строка - это термин, который может варьироваться от двух слов до пяти или шести.Идентификация похожих строк в базе данных в Python

["big giant cars", "zebra videos", "hotels in rio de janeiro".......] 

У меня также есть черный список более чем нескольких тысяч младших членов в файле csv. То, что я хочу сделать, - это идентифицировать аналогичные термины в базе данных с черными списками в моем файле csv. Сходство в этом случае может быть истолковано как неправильное использование терминов с черным списком.

Я знаком с библиотеками в python, такими как fuzzywuzzy, которые могут оценивать сходство строк с использованием расстояния Levensthein и возвращать целочисленное представление сходства. Пример из этого урока будет:

fuzz.ratio("NEW YORK METS", "NEW YORK MEATS") ⇒ 96 

Недостатком этого подхода будет то, что он может ошибочно определить термины, которые могут означать, что-то в другом контексте.

Простым примером этого может быть «большая задница», черная строка, путаясь с более невинной строкой типа «большой, но».

Мой вопрос в том, возможно ли это программно в python для выполнения этого или было бы проще просто получить все похожие ключевые слова и фильтр для ложных срабатываний?

ответ

1

Я не уверен, что есть какой-либо окончательный ответ на эту проблему, поэтому я могу лучше всего объяснить, как я подхожу к этой проблеме, и, надеюсь, вы сможете получить какие-либо идеи от моих промахов. :-)

Первый.

На неродственном угле нечеткое совпадение строк может быть недостаточно. Люди собираются использовать похожие символы и символы, отличные от символов, чтобы обойти любые текстовые совпадения до такой степени, когда между черным списком и фактическим текстом почти нулевой совпадение, и все же он по-прежнему доступен для чтения. Поэтому, возможно, вам понадобится нормализация вашего словаря и текста поиска, например, преобразование всех «0» (нулей) в «O» (капитал O), «> <» на «X» и т. Д. Я считаю, что есть библиотеки и/или ссылки на ссылки на эту цель. Нелатинские символы также являются отличной возможностью и должны учитываться.

Второй.

Я не думаю, что вы сможете различать слова с черным списком и аналогичные варианты в один проход. Так что да, скорее всего, вам придется искать возможные черные списки, а затем проверить, соответствует ли то, что вы нашли, с некоторыми юридическими словами. Это означает, что вам понадобится не только словарь с черным списком, но и словарь с белым списком. На более позитивной ноте, вероятно, нет необходимости нормализовать словарь с белым списком, поскольку люди, которые пишут приемлемый текст, вероятно, напишут его на приемлемом языке без каких-либо трюков, описанных выше. Или вы можете нормализовать его, если почувствуете себя параноиком. :-)

В-третьих.

Однако проблема в том, что совмещение слов/выражений с черными и белыми списками на самом деле не дает вам надежного ответа. Используя ваш пример, человек может написать «большой прикладом» как честную опечатку, которая будет очевидна в контексте (или наоборот, напишите «большой», но «намеренно», чтобы получить более высокий совпадение с белым списком слов, даже если контекст делает это довольно очевидно, что такое реальный смысл). Поэтому вам, возможно, придется проверить контекст, если есть достаточно хорошие совпадения с черными и белыми списками. Это область, с которой я не знаком.Вероятно, возможно построить корреляционные карты для разных слов (из обоих словарей), чтобы определить, какие слова больше (или меньше) часто используются в сочетании с ними, и использовать их для проверки вашего конкретного примера. Используя этот самый абзац в качестве примера, слово «черный» можно было бы включить в белый список, если оно используется вместе с «списком», но в некоторых других случаях занесено в черный список.

В-четвертых.

Даже применяя все эти меры вместе, вы можете захотеть оставить определенное количество серой области. То есть, если в любом направлении не существует достаточно высокой уверенности, оставьте окончательное решение для человека (показывая комментарии/сообщения на какое-то время, автоматически помещая их в очередь модерации или что-то еще, что диктует ваш проект).

В-пятых.

Вы можете попытаться использовать алгоритмы обучения, собирая человеческий ввод с предыдущего шага и используя его для автоматической настройки вашего алгоритма с течением времени.

Надеюсь, что это поможет. :-)

+0

Да, я понял, что машинное обучение - это путь, но я почесываю голову, пытаясь понять это. Я задал вопрос о 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