Как найти похожую статью — Сайт, где вы сможете решить свои вопросы



Поиск текстов, не соответствующих тематике и нахождение похожих статей

Время на прочтение
5 мин

Количество просмотров 28K

У меня есть сайт со статьями схожей тематики. На сайте было две проблемы: спамерские сообщения и дубликаты статей, причём дубликаты часто являлись не точными копиями.

Данный пост повествует о том, как я решил эти проблемы.

Дано:



  • общее количество статей 140 000;
  • количество спама: примерно 16%;
  • количество не чётких дубликатов: примерно 63%;

Задача: избавиться от спама и дубликатов, а так же не допустить их дальнейшего появления.

Часть 1. Классификация на спам/не спам

Все статьи на моём сайте относятся к одной и той же тематике и, как правило, спамерсие/рекламные сообщения прилично отличаются по содержанию. Я решил вручную отсортировать некоторое количество статей. И на их основе построить классификатор. Для классификации будем считать косинусное расстояние между вектором проверяемой статьи и векторами двух групп (спам/не спам). К какой группе проверяемая статья ближе, к той и будем относить статью.

Сначала надо вручную классифицировать статьи. Набросал для этого форму с чекбоксами и собрал за несколько часов 650 статей спама и 2000 не спама.

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

Чтобы минимизировать количество различных форм одного слова, можно использовать стеммиг Портера. Я взял готовую реализацию на Java отсюда. Спасибо, Edunov

Из слов классифицированных статей, очищенных от шумовых слов и прогнанных через стемминг надо собрать словарь.



Из словаря удалим слова, которые встречаются только в одной статье.

Для каждой классифицированной вручную статьи считаем количество вхождений каждого слова из словаря. Получатся векторы, похожие на следующие:

Усиливаем в каждом векторе веса слов, считая для них TF-IDF. TF-IDF считается отдельно для каждой группы спам/не спам.

Сначала считаем TF (term frequency — частота слова) для каждой статьи. Это отношение количества вхождений конкретного слова к общему числу слов в статье:

где ni есть число вхождений слова в документ, а в знаменателе — общее число слов в данном документе.

Дальше считаем IDF (inverse document frequency — обратная частота документа). Инверсия частоты, с которой некоторое слово встречается в документах группы (спам/не спам). IDF уменьшает вес слов, которые часто употребляются в группе. Считается для каждой группы.



где

  • |D| — количество документов в группе;
  • di⊃ti — количество документов, в которых встречается ti (когда ni≠0).

Считаем TF-IDF:

Большой вес в TF-IDF получат слова с высокой частотой в пределах конкретного документа и с низкой частотой употреблений в других документах.

Для каждой группы формируем по одному вектору, считая среднее арифметическое каждого параметра внутри группы:



Чтобы проверить статью на спам, надо получить для нее количество вхождений слов из словаря. Посчитать для этих слов TF-IDF для спама и не спама. Получится два вектора (на изображении TF-IDF не спам и TF-IDF спам). IDF для расчётов, берём тот, который считали для классифицирующей выборки.

Для каждого вектора считаем косинусное расстояние с векторами для спама и не спама, соответственно. Косинусное расстояние – это мера похожести двух векторов. Скалярное произведение векторов и косинус угла θ между ними связаны следующим соотношением:

Имея два вектора A и B, получаем косинусное расстояние – cos(θ)

Код на Java

public static double cosine(double[] a, double[] b) {
    double dotProd = 0;
    double sqA = 0;
    double sqB = 0;
    for (int i = 0; i < a.length; i++) {
        dotProd += a[i] * b[i];
        sqA += a[i] * a[i];
        sqB += b[i] * b[i];
    }
    return dotProd/(Math.sqrt(sqA)*Math.sqrt(sqB));
}

В результате получается диапазон от -1 до 1. -1 означает, что вектора полностью противоположны, 1, что они одинаковы.

Какое из полученных значений (для спама и не спама) будет ближе к 1, к той группе и будем относить статью.

При проверке схожести на не спам получилось число 0.87:

на спам – 0.62:

Следовательно, считаем, что статья – не спам.



Для тестирования я вручную отобрал ещё 700 записей. Точность результатов была 98%. При этом то, что классифицировалось ошибочно даже мне было сложно отнести к той или иной категории.

Часть 2. Поиск нечётких дубликатов

После очистки от спама осталось 118 000 статей.

Для поиска дубликатов я решил использовать инвертированный индекс (Inverted index). Индекс представляет собой структуру данных, где для каждого слова указывается, в каких документах оно содержится. Соответственно, если у нас есть набор слов, можно легко сделать запрос документов, содержащих эти слова.

Пример с Вики. Допустим, у нас есть следующие документы:

T[0] = "it is what it is"
T[1] = "what is it"
T[2] = "it is a banana"

Для этих документов построим индекс, указав, в каком документе содержится слово:

"a":      {2}
"banana": {2}
"is":     {0, 1, 2}
"it":     {0, 1, 2}
"what":   {0, 1}

Все слова «what», «is» и «it» находятся в документах 0 и 1:

{0,1} ∩ {0,1,2} ∩ {0,1,2} = {0,1} Подробнее ...

Как исправить микроволновку если она искрит — Сайт, где вы сможете решить свои вопросы



Микроволновая печь давно является неотъемлемой частью кухонной бытовой техники. Она значительно упрощает хлопоты на кухне и стала незаменимым помощником для каждой хозяйки. Однако, даже у такого прибора могут возникнуть неисправности, требующие срочного ремонта. К одной из распространенных проблем относится возникновение искрения внутри микроволновки. Подробнее ...

Как найти остаток на начало периода — Сайт, где вы сможете решить свои вопросы



Как посчитать сальдо

Сальдо – это разница между доходом и расходом за выбранный интервал времени. В бухгалтерском учете – это разница между дебетом и кредитом по выбранному счету и за определенный промежуток времени. Подробнее ...

Как найти полную мощность формула — Сайт, где вы сможете решить свои вопросы

Полная мощность — величина, равная произведению действующих значений периодического электрического тока I в цепи и напряжения U на её зажимах

Реактивная мощность связана с полной мощностью и активной : Подробнее ...

Как найти песню которая заела в голове — Сайт, где вы сможете решить свои вопросы

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

Как составить словарь минимума — Сайт, где вы сможете решить свои вопросы

Как составить словарь минимума - Сайт, где вы сможете решить свои вопросы

https://doi.orq/10.30853/filnauki.2019.8.57

Калашникова Светлана Викторовна

ФОРМИРОВАНИЕ СЛОВАРЯ-МИНИМУМА ПО ДИСЦИПЛИНЕ “ИНОСТРАННЫЙ ЯЗЫК” В

ОБРАЗОВАТЕЛЬНЫХ ОРГАНИЗАЦИЯХ МВД РОССИИ

В статье рассмотрены особенности формирования словаря-минимума по дисциплине “Иностранный язык” в образовательных организациях МВД Российской Федерации. Автор устанавливает критерии и принципы отбора лексического материала для составления словаря-минимума. Новизна данной работы заключается в том, что автор исследует поэтапное формирование навыка семантизации лексики, который является значимым для адекватного понимания профессионально ориентированных, научных и юридических текстов по специальности “Правоохранительная деятельность”. Практическая значимость исследования состоит в том, что результаты могут быть использованы в процессе обучения иностранному языку в образовательных организациях МВД Российской Федерации. Подробнее ...

Как найти требуемую доходность акции — Сайт, где вы сможете решить свои вопросы



Доходность акции – это основной показатель ее выгодности для держателя. Она определяет, какую прибыль принесет акция в процентах к номиналу или в абсолютном выражении. Если держатель получил от вложения больше, чем потратил, значит доходность положительная. Когда потратил больше, чем заработал, значит доходность отрицательная. Подробнее ...

Как составить перечень оказываемых услуг — Сайт, где вы сможете решить свои вопросы



.

ПЕРЕЧЕНЬ УСЛУГ И РАБОТ ПО СОДЕРЖАНИЮ И РЕМОНТУ ОБЩЕГО ИМУЩЕСТВА МНОГОКВАРТИРНОГО ДОМА, ВХОДЯЩИХ В СОСТАВ ПЛАТЫ ЗА СОДЕРЖАНИЕ И РЕМОНТ

1. ОБЕСПЕЧЕНИЕ САНИТАРНОГО СОДЕРЖАНИЯ

1.1.Уборка придомовой территории Подробнее ...

Как найти среднюю величину признака биология — Сайт, где вы сможете решить свои вопросы



Среднее значение признака и методы вычисления этой величины

Полученные
при обследовании значения признаков
характеризуют каждую конкретную особь
в отдельности. Общие свойства совокупности
оценивают с помощью средней величины,
которую обозначают в биометрии буквой
M или
.
Этот показатель используется для
характеристики однородных групп
животных по какому-либо признаку,
сравнения отдельных стад и пород, оценки
предприятий, хозяйств и конкретных
специалистов. Так, например, если в одном
хозяйстве средний удой на корову
составляет 3000 кг, а в другом – 4000 кг, то
по среднему значению признака видно,
где лучше стадо. Подробнее ...