На самом деле, НЛП является одной из наиболее распространенных областей, в которых требуется повторная выборка данных, поскольку существует много задач классификации текста, связанных с несбалансированной проблемой (например, фильтрация спама, обнаружение оскорбительных комментариев, классификация статей и т. Д.). Но SMOTE кажется проблематичным по ряду причин:
- SMOTE работает в пространстве функций. Это означает, что выходные данные SMOTE не являются синтетическими данными, которые являются реальным представителем текста в его пространстве признаков.
- С одной стороны, SMOTE работает с KNN, а с другой стороны, функциональные пространства для проблемы НЛП чрезвычайно велики. KNN легко потерпит неудачу в этих огромных размерах.
Поэтому я могу предложить вам два подхода:
- Не волнует реальное текстовое представление новых синтетических образцов, которое, я полагаю, должно быть в порядке. Вы должны сбалансировать распределение для вашего классификатора, а не для чтения текстовых данных. Поэтому примените SMOTE как традиционный (однако я обычно использую решение 2 ниже, чтобы не оценивать результат!) С некоторым шагом по уменьшению размерности.
1) Предположим, вы хотите, чтобы ваши выборки данных из второстепенного класса удваивались с использованием 3-NN. Игнорируйте основной класс (ы) и оставляйте только второстепенные образцы.
2) Для каждой точки выборки в пространстве признаков выберите 5 ближайших соседей. Затем выберите 3 из них случайным образом (не слишком ли это сложно? Если бы я не хотел объяснять оригинальный алгоритм, я бы сказал, просто выберите 3 соседей!)
3) Для каждого измерения вычислите расстояние между образцом и соседями, умножьте его на случайное число от 0 до 1 и добавьте к исходному значению образца в этом измерении. (этот сложный абзац просто означает, что для каждого измерения выберите случайное значение между исходным образцом и соседом!)
- Но я обычно делаю другую передискретизацию, которая находится в тексте (более интуитивно понятная) и является своего рода SMOTE.
1) Игнорировать основной класс. Получите распределение длины всех документов в младшем классе, чтобы мы генерировали новые образцы в соответствии с истинной длиной документа (количество слов / фраз). Мы предполагаем, что хотим сделать размер класса тройным (таким образом, получая синтетических документа на исходный документ)к = 2
2) Генерация последовательности из случайных целых чисел в соответствии с этим распределением. Используется для определения длины нового синтетического документа.N
3) Для каждого документа: выберите одно целое число из последовательности случайной длины и случайного документа, длина которого близка к целому числу. Положите токены всех документов в набор и случайным образом выберите токенов раз. это ваши новые документы.м н к кmmnkk
Если вы хотите добавить больше текста / предложений, вы можете использовать предварительно обученные вложения слов. Предварительно обученные модели, такие как, обеспечивают представление вектора слов для каждого словарного слова. Он также предоставляет слова «Most_smiliar».
Вы можете просто использовать примерное предложение и генерировать новые образцы, выполняя перестановки каждого слова с его наиболее TOP_N подобными словами.
Например, если в вашем предложении 3 слова, и если вы выбираете 3 наиболее похожих для каждого слова, вы можете повысить выборку в 27 раз.
источник