Які алгоритми можна використовувати, щоб виявити, чи статті чи публікації є дублікатами?


17

Я намагаюся виявити, чи є стаття чи публікація на форумі дублікатом запису в базі даних. Я задумався над цим, прийшовши до висновку, що той, хто копіює вміст, зробить це за допомогою одного з трьох (у низхідній ситуації важко виявити):

  1. проста копія, вставити весь текст
  2. скопіюйте та вставте частини тексту, об’єднавши їх із своїми
  3. скопіюйте статтю із зовнішнього веб-сайту та маскуйте її як власну

Підготовка тексту до аналізу

В основному будь-які аномалії; мета - зробити текст максимально «чистим». Для більш точних результатів текст "стандартизується" за:

  1. Стрижка дублікатів білих пробілів та обрізка ведучих та кінцевих.
  2. Нові рядки стандартизовані до \ n.
  3. Теги HTML видалено.
  4. Використовуючи RegEx під назвою URL-адреси Daring Fireball, знімаються.
  5. Я використовую код BB у своїй програмі, так що це стосується.
  6. (ä) центровані та іноземні (крім Enlgish) перетворюються на їхню не іноземну форму.

Я зберігаю інформацію про кожну статтю в таблиці (1) статистики та в (2) таблиці ключових слів.

(1) Таблиця статистики Про текстовий вміст зберігається наступна статистика (як і ця публікація)

  1. довжина тексту
  2. кількість літер
  3. підрахунок слів
  4. кількість пропозицій
  5. середні слова на речення
  6. автоматизований індекс читабельності
  7. оцінка туману

Для європейських мов слід використовувати Coleman-Liau та Автоматизований індекс читабельності, оскільки вони не використовують підрахунок складів, тому вони повинні давати досить точну оцінку.

(2) Таблиця ключових слів

Ключові слова генеруються за рахунок виключення величезного списку стоп-слів (загальних слів), наприклад, 'the', 'a', 'of', 'to' тощо, тощо.

Зразок даних

  • text_length, 3963
  • лист_кант, 3052
  • word_count, 684
  • вирок_счет, 33
  • word_per_sentence, 21
  • 11.5
  • auto_read_index, 9.9
  • ключове слово 1, убитий
  • ключове слово 2, офіцери
  • ключове слово 3, поліція

Слід зазначити, що після оновлення статті всі перераховані вище статистичні дані відновлюються і можуть мати зовсім інші значення.

Як я міг би використовувати вищевказану інформацію для виявлення, якщо стаття, яка публікується вперше, вже існує в базі даних?


Я знаю, що все, що я буду розробляти, не буде ідеальним, найбільший ризик - це (1) Вміст, який не є дублікатом, буде позначено як дублікат (2) Система дозволяє пропускати дублікат вмісту.

Таким чином, алгоритм повинен генерувати номер оцінки ризику від 0, не дублюючи ризик, 5 можливий дублікат і 10 - дублікат. Що-небудь вище 5, то є хороша можливість, що вміст дублюється. У цьому випадку вміст може бути позначений і пов’язаний із статтями, які є можливими копіями, і людина може вирішити, видалити чи дозволити.

Як я вже говорив перед тим, як зберігати ключові слова для всієї статті, проте мені цікаво, чи можна було б зробити те саме на абзаці; це також означатиме подальше відокремлення моїх даних у БД, але це також спростить виявлення (2) у моїй початковій посаді.

Я думаю, середнє зважене значення між статистикою, але в якому порядку і якими будуть наслідки ...


Якщо це точно збіг, ви можете просто встановити поле унікальним. Якщо ні, то вам потрібно буде вирішити, в який момент текст може вважатися копією чи твірним твором.
Джеймс П.

2
Є багато напрямків, в яких може піти такий аналіз. Люди пишуть цілі книги на цю тему. Якщо ваша мета - визначити "відносну близькість", у вас дійсно мало вибору, крім того, щоб заглибитись у те, що називається " Обробка природних мов" та " Машинне навчання" . Так називають комп'ютерні вчені, але це справді просто розширений статистичний аналіз. Гарною відправною точкою може бути погляд на відстані Левенштейна, але "німі" статистичні дані, такі як підрахунок слів / речень, швидше за все, зроблять для вас дуже мало.
rdlowrey

1
Крім того, перед тим, як його перенести з SO, це було позначено [php], тому ви можете перевірити натиснуту функцію php levenshtein
rdlowrey

Чудова ідея, щоб людина перевірила, ймовірно, копії! Можливо, ви зможете автоматично вирішити, що> 7 - це дублікат, а <6 - це інше, і лише люди перевіряють бали 6 або 7. Я знаю, що зі ідентифікацією спаму існує машина - не знаю-а-людина- не знає жодної категорії; сіра область між близьким дублікатом та оригінальною роботою, де найкраще зробити - це зробити дещо довільний виклик рішення.
GlenPeterson

@rdlowrey - Алгоритми Левенштайна - це те, що я використовував у подібному проекті, який я робив у C #. Я погоджуюся, це хороше місце для початку і може бути достатньо.
jfrankcarr

Відповіді:


4

Існує багато алгоритмів, які займаються подібністю документів в NLP. Ось докладна стаття з описом різних алгоритмів. Також у вікіпедії є більшу колекцію. Я віддаю перевагу заході Яро Вінклера і використовую його для проектів шкільних класів у методах агломеративної кластеризації.


6

Погляньте на алгоритм Рабіна-Карпа . Він використовує прокатний хеш, дещо подібний до rsync, щоб мінімізувати байти, передані під час синхронізації. Регулюючи розмір вікна, яке ви використовуєте для хешу, ви можете зробити його більш-менш чутливим. РК використовується, крім усього іншого, для виявлення плагіату, який, в основному, шукає родів гномів.


4
Проблема, яку описує ОП, схожа на виявлення плагіату , і я б запропонував, як перше місце, шукати допомоги. (Просто обов’язково вкажіть свої джерела!)
Калеб

4

Першим кроком у цьому може бути виявлення речень (або якогось іншого розумного блоку даних. Візьміть ці блоки та зніміть будь-які дані мете, html випадкові пробіли, повернення тощо). Візьміть результат MD5 і зберігайте їх у таблиці. потім порівнюйте з цими блоками, щоб спробувати знайти збіги

Якщо це не працює, ви можете спробувати n-грам. Тут вам потрібно по одному слову кожного слова на сторінці, але воно повинне дати вам досить хороші збіги.

http://en.wikipedia.org/wiki/N-gram


Заходи на основі n-грам значно кращі, ніж хеди md5, особливо для напівструктурованих даних, таких як html.
Кандід

1

Для точної математичної математики я б зберігав хеш, а потім порівнював би це.

Я думаю, що системи, які використовуються для іспитів, вимірюють групи слів, а потім частоту груп кожного розміру. Наприклад, ланцюжок з 30 слів, які скопіюються, набрав би 5 балів ризику, а 5 випадків із 10 слів ланцюга мають 5 балів. Тоді у вас буде затримка 30 балів на 500 слів.

Дійсно, вам потрібен семантичний алгоритм, щоб слова типу "також" і "і" розбиралися як однакові.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.