Как удалить «похожий», но не идентичный контент в базе данных MySQL - PullRequest
3 голосов
/ 04 октября 2009

Предположим, у меня есть эта таблица:

ID | description
-------------------
5  | The bird flew over the tree.
2  | The birds, flew over the tree

Эти две строки имеют "похожий" контент. Как бы я удалил # 2?

  1. Какой алгоритм использовать для «похожего» текста?
  2. Как бы я сделал это с Python?

Спасибо!

Ответы [ 4 ]

5 голосов
/ 04 октября 2009

То, что вы можете попробовать, это убрать необходимую пунктуацию и пропустить каждое предложение через парадигматический (например, Porter Stemmer ).

После того, как вы получите основанную версию предложения, вы можете сохранить ее в другом столбце для сравнения. Тем не менее, вам может быть удобнее использовать хешированные предложения, если предложения длинные (например, в среднем более 40 символов).

Любые строки, в которых есть одно и то же предложение или хэш, с большой вероятностью будут эквивалентны - вы можете автоматизировать их удаление или создать пользовательский интерфейс, позволяющий человеку быстро одобрить каждую из них.

Вот реализация Python для стеммера Porter .

3 голосов
/ 04 октября 2009

Как правило, для каждого значения вы создаете «упрощенное» значение (удаляете все, что не было существенным ... в вашем примере пунктуацию и множественное число), а затем сравниваете упрощенные значения на равенство.

0 голосов
/ 05 мая 2012

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

http://en.wikipedia.org/wiki/Edit_distance

Я бы порекомендовал

http://en.wikipedia.org/wiki/Levenshtein_distance

или

http://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance

Затем вы должны установить порог расстояния редактирования, который указывает, что две строки похожи, например, 2 правки или 3 правки.

Это может быть не очень хорошей идеей, если у вас большая база данных.

В псевдокоде вы в основном сказали бы

if editDist(stringA, stringB) > editThreshold
    remove stringA %or stringB
end
0 голосов
/ 04 октября 2009

Вы можете использовать оператор LIKE .

DELETE FROM myTable WHERE description LIKE 'The bird%flew over the tree%';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...