Что является хорошей мерой для классификации текстовых документов? - PullRequest
0 голосов
/ 10 мая 2018

Я написал приложение, которое измеряет важность текста. Он берет текстовую статью, разбивает ее на слова, отбрасывает стоп-слова, выполняет основание и считает частоту слов и частоту документов. Частота слова - это мера, которая подсчитывает, сколько раз данное слово появилось во всех документах, а частота документа - это мера, которая подсчитывает, сколько документов появилось данное слово.

Вот пример с двумя текстовыми статьями:

  • Статья I) "Лиса перепрыгивает через другую лису."
  • Статья II) «Охотник увидел лису».

Статья I разбита на слова (после того, как я поставлю и опущу стоп-слова):

  • ["лиса", "прыжок", "другой", "лиса"].

Статья II разбита на слова:

  • ["охотник", "смотри", "лиса"].

Эти две статьи производят следующие счетчики частоты слов и частоты документов:

  • fox (частота слова: 3, частота документа: 2)
  • jump (частота слова: 1, частота документа: 1)
  • another (частота слова: 1, частота документа: 1)
  • hunter (частота слова: 1, частота документа: 1)
  • see (частота слова: 1, частота документа: 1)

Учитывая новую текстовую статью, как мне измерить, насколько эта статья похожа на предыдущие статьи?

Я читал о мере df-idf, но здесь она не применима, так как я сбрасываю стоп-слова, поэтому такие слова, как "a" и "the", не появляются в счетчиках.

Например, у меня есть новая текстовая статья, которая гласит: «Охотники любят лис». Как я могу придумать меру, которая говорит, что эта статья очень похожа на те, что видели ранее?

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

Я предполагаю, что мне нужно как-то суммировать значения счетчиков частоты слов и частоты документа, но какую формулу лучше использовать?

Ответы [ 7 ]

0 голосов
/ 18 мая 2018

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

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

Вам нужно найти самые важные слова в тексте. Тогда вам нужно уловить их возможные синонимы.

Для этого может помочь следующее api . С некоторыми словарями можно создать нечто похожее.

synonyms("complex")

function synonyms(me){
  var url = 'https://api.datamuse.com/words?ml=' + me;
  fetch(url).then(v => v.json()).then((function(v){
    syn = JSON.stringify(v)
    syn = JSON.parse(syn)
    for(var k in syn){
      document.body.innerHTML += "<span>"+syn[k].word+"</span> "
      }
    })
  )
}

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

0 голосов
/ 19 мая 2018

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

0 голосов
/ 18 мая 2018

Когда я ищу по df-idf, я ничего не нахожу.

tf-idf с косинусным сходством является очень общепринятой и обычной практикой

Фильтрация стоп-слов не нарушает его. Для общих слов idf в любом случае придает им малый вес.

tf-idf используется Lucene .

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

Не понимаю, почему вы думаете, что сумма df idf является мерой подобия.

Для классификации у вас есть предопределенные классы и образцы документов для изучения? Если это так, можно использовать Наивный Байес . С тф-идф.

Если у вас нет предопределенных классов, вы можете использовать k означает кластеризацию . С тф-идф.

Это во многом зависит от ваших знаний о корпусе и цели классификации. Как и в случае с документами поддержки судебных разбирательств, которые вы получили, у вас нет сведений о них В Enron они использовали имена хищников для многих плохих вещей, и вы ни за что не узнаете об этом. k означает, что документы могут найти свои собственные кластеры.

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

0 голосов
/ 18 мая 2018

Достаточное решение, возможно, в аналогичной задаче:

  • Использование двоичного подхода "мешок слова" (BOW) для представления вектора (часто встречающиеся слова имеют больший вес, чем редко встречающиеся слова), а не реальный подход TF

  • Встраиваемый подход "word2vec" чувствителен к эффектам последовательности и расстояний. Это может сделать - в зависимости от ваших гиперпараметров - разницу между «охотник видел лису» и «лиса видел прыгающего охотника» ... поэтому вам нужно решить, означает ли это добавление шума к вашей задаче - или, в качестве альтернативы, использовать его как усредненный вектор, по всему тексту

  • Извлечение слов с высокой корреляцией внутри предложения (например, с использованием переменных-средних-нормализованных косинус-сходств)

  • Второй шаг: используйте этот список высококоррелированных слов в качестве положительного списка, то есть в качестве нового словаря для нового двоичного векторизатора

Это выделение значимых слов для сравнения косинусов 2-го шага - в моем случае, даже для довольно небольшого количества обучающих текстов

0 голосов
/ 17 мая 2018

Похоже, что вы пытаетесь ответить на несколько связанных вопросов:

  1. Как измерить сходство между документами A и B?(Обучение метрике)
  2. Как измерить, насколько необычен документ C по сравнению с некоторым набором документов?(Обнаружение аномалий)
  3. Как разбить коллекцию документов на группы похожих?(Кластеризация)
  4. Как предсказать, к какому классу относится документ?(Классификация)

Все эти проблемы обычно решаются в 2 этапа:

  1. Извлечение функций: Документ -> Представление (обычно числовой вектор)
  2. Применение модели: Представление -> Результат (обычно одно число)

Существует множество вариантов как для конструирования элементов, так и для моделирования.Вот лишь некоторые из них.

Извлечение признаков

  1. Мешок слов: Документ -> количество вхождений каждого отдельного слова (то есть частоты терминов).Это базовый вариант, но не единственный.
  2. Пакет с n-граммами (на уровне слов или на уровне символов): учитывается одновременное использование нескольких токенов.
  3. Пакет с словами + грамматические особенности (например, POS-теги)
  4. Мешок встраивания слов (изученный внешней моделью, например, word2vec).Вы можете использовать встраивание как последовательность или взять их средневзвешенное значение.
  5. Все, что вы можете придумать (например, правила, основанные на поиске в словаре) ...

Элементы могут быть предварительно обработаны для уменьшения относительного количества шума в них.Вот некоторые варианты предварительной обработки:

  • деление на IDF, если у вас нет жесткого списка стоп-слов или вы полагаете, что слова могут быть более или менее "тупыми"
  • нормализуеткаждый столбец (например, число слов) должен иметь нулевое среднее значение и единичную дисперсию
  • , принимая журналы количества слов для уменьшения шума
  • , нормализуя каждую строку, чтобы иметь норму L2, равную 1

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

Теперь вы можете построить модель ML .Каждая из 4 задач имеет свои хорошие решения.

Для классификации , наиболее изученной задачи, вы можете использовать несколько видов моделей, включая наивные байесовские, k-ближайшие соседи, логистическую регрессию, SVM, деревья решений и нейронные сети.Опять же, вы не можете знать заранее, что будет лучше.

Большинство этих моделей могут использовать практически любые функции.Однако KNN и основанный на ядре SVM требуют, чтобы ваши функции имели особую структуру: представления документов одного класса должны быть близки друг к другу в смысле евклидовой метрики расстояния.Иногда это может быть достигнуто простой линейной и / или логарифмической нормализацией (см. Выше).Более сложные случаи требуют нелинейных преобразований, которые в принципе могут быть изучены нейронными сетями.Изучение этих преобразований - это , что люди называют метрическим обучением , и в целом это проблема, которая еще не решена.

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

Для кластеризация , основными опциями являются K-means и DBScan.Обе эти модели требуют, чтобы у вашего пространства функций было это евклидово свойство.

Для обнаружения аномалий вы можете использовать оценки плотности, которые производятся различными вероятностными алгоритмами: классификация (например, наивные байесовские или нейронные сети), кластеризация (например, смесь гауссовых моделей) или другие неконтролируемые методы (например, вероятностный PCA).Для текстов вы можете использовать последовательную языковую структуру, оценивая вероятности каждого слова на основе предыдущих слов (используя n-граммы или сверточные / рекуррентные нейронные сети) - это называется языковых моделей , и обычно этоболее эффективен, чем предположение о наивном байесовском подходе, которое игнорирует порядок слов.Несколько языковых моделей (по одной для каждого класса) могут быть объединены в один классификатор.

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

Если у вас нет ресурсов или желания проводить несколько экспериментов, я бы рекомендовал выбрать один из следующихподходы к оценке сходства между текстами:

  • количество слов + нормализация idf + нормализация L2 (эквивалентная решению @mcoav) + евклидово расстояние
  • означает вложение word2vec по всем словам в тексте(словарь встраивания может быть найден и загружен) + Евклидово расстояние

На основе одного из этих представлений вы можете построить модели для других задач - например, KNN для классификаций или k-средних для кластеризации.

0 голосов
/ 10 мая 2018

Стандартным решением является применение наивного байесовского классификатора, который оценивает апостериорную вероятность класса C с учетом документа D , обозначенного как P (C = k | D) (для задачи двоичной классификации k = 0 и 1).

Это оценивается путем вычисления априорных значений из обучающего набора документов, помеченных классом, где для данного документа D мы знаем его класс C .

P(C|D) = P(D|C) * P(D)              (1)

Наивный Байес предполагает, что термины независимы, и в этом случае вы можете написать P (D | C) как

P(D|C) = \prod_{t \in D} P(t|C)     (2)

P (t | C) можно просто вычислить, посчитав, сколько раз встречается термин в данном классе, например, вы ожидаете, что слово футбол будет встречаться много раз в документах, относящихся к классу (категории) спорт .

Когда дело доходит до другого фактора P (D) , вы можете оценить его, посчитав, сколько помеченных документов дано в каждом классе, может быть, у вас есть больше спортивных статей чем финансы , что заставляет вас думать, что вероятность того, что невидимый документ будет классифицирован в категорию sports , выше.

Очень легко включить в уравнение (1) такие факторы, как важность термина (idf) или зависимость термина. Для idf вы добавляете его как событие выборки терминов из коллекции (независимо от класса). Для зависимости от термина вы должны добавить вероятности вида P (u | C) * P (u | t) , что означает, что вы выбрали другой термин u и изменили ( преобразовать) в t .

Стандартные реализации наивного байесовского классификатора можно найти в пакете Stanford NLP , Weka и Scipy и многих других.

0 голосов
/ 10 мая 2018

Я бы предложил tf-idf и косинусное сходство .

Вы все равно можете использовать tf-idf, если пропустите стоп-слова.Возможно даже, что если вы включите стоп-слова или нет, это не изменится: мера обратной частоты документа автоматически снижает стоп-слова, поскольку они встречаются очень часто и появляются в большинстве документов.

Если ваш новыйдокумент полностью состоит из неизвестных терминов, косинусное сходство будет равно 0 с каждым известным документом.

...