Классификация документов по категориям

У меня есть около 300 тыс. Документов, хранящихся в базе данных Postgres, которые отмечены категориями тем (всего около 150 категорий). У меня есть еще 150 тыс. Документов, которые еще не имеют категорий. Я пытаюсь найти лучший способ программно классифицировать их.

Я изучал NLTK и его классификатор Naive Bayes. Кажется хорошей отправной точкой (если вы можете предложить лучший алгоритм классификации для этой задачи, я все уши).

  • Отсутствующие ценности в обучении машинам scikits
  • SKLearn, как получить вероятностные решения для классификатора LinearSVC
  • Как я могу написать горячую кодировку в Python?
  • Является ли scikit-learn подходящим для больших задач с данными?
  • Есть ли рекомендованный пакет для машинного обучения в Python?
  • Анализ временных рядов - неравномерно распределенные меры - панды + статмодели
  • Моя проблема в том, что у меня недостаточно оперативной памяти для обучения NaiveBayesClassifier на всех 150 документах категории / 300 000 одновременно (обучение по 5 категориям было использовано 8 ГБ). Кроме того, точность классификатора, по-видимому, снижается по мере того, как я тренируюсь по более высоким категориям (точность 90% с 2 категориями, 81% с 5, 61% с 10).

    Должен ли я просто обучать классификатор по 5 категориям за раз и запускать все 150 тыс. Документов через классификатор, чтобы узнать, есть ли совпадения? Кажется, что это сработало бы, за исключением того, что было бы много ложных срабатываний, когда документы, которые действительно не соответствуют какой-либо из категорий, получают классический классификатор только потому, что это лучший доступный доступ … Есть ли способ иметь «ни один из вышеперечисленных» вариантов для классификатора, если документ не вписывается ни в одну из категорий?

    Вот мой тестовый класс http://gist.github.com/451880

  • Перечислите слова в словаре в соответствии с появлением в текстовом корпусе Scikit-Learn
  • Как провести под руководством обучение глубокой уверенности в PyBrain?
  • Как я могу классифицировать данные с помощью алгоритма ближайшего соседа с помощью Python?
  • Проблемы, связанные с получением большинства информационных функций с помощью scikit?
  • Keras + tensorflow дает ошибку "no attribute" control_flow_ops '"
  • Как получить предсказанные метки классов в примере MNIST от TensorFlow?
  • 3 Solutions collect form web for “Классификация документов по категориям”

    Вы должны начать с преобразования ваших документов в векторы TF-log (1 + IDF) : временные частоты разрежены, поэтому вы должны использовать python dict с терминами в качестве ключей и считать значениями, а затем делить на общее количество, чтобы получить глобальные частоты.

    Другое решение – использовать абс (хеш (термин)), например, как целые положительные ключи. Затем вы используете scipy.sparse векторы, которые более удобны и эффективны для выполнения операции линейной алгебры, чем python dict.

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

    Если это недостаточно, то вам следует попытаться подготовить модель логистической регрессии, используя штраф L1, как объясняется в этом примере scikit-learn (это оболочка для liblinear, как объясняется @ephes). Векторы, используемые для обучения вашей модели логистической регрессии, должны быть ранее введенными векторами TD-log (1 + IDF), чтобы получить хорошую производительность (точность и отзыв). Scikit learn lib предлагает модуль sklearn.metrics с подпрограммами для вычисления этих баллов для данной модели и заданного набора данных.

    Для более крупных наборов данных: вы должны попробовать vowpal wabbit, который, вероятно, самый быстрый кролик на земле для больших проблем классификации документов (но не простой в использовании обертки python AFAIK).

    Насколько велики (количество слов) ваши документы? Потребление памяти при 150K trainingdocs не должно быть проблемой.

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

    Является ли ваша проблема multiclass (документ относится только к одной категории эксклюзивно) или многоуровневой (документ относится к одной или нескольким категориям)?

    Точность – это плохой выбор для оценки эффективности классификатора. Вы должны скорее использовать точность vs для отзыва, точную точку перехвата точности (prbp), f1, auc и вынуждены смотреть на кривую точности и наведения, где набросок (x) отображается с точностью (y) на основе значения вашего доверительного порога (документ принадлежит к категории или нет). Обычно вы строите один бинарный классификатор для каждой категории (положительные примеры обучения одной категории по сравнению с другими учебными примерами, которые не относятся к вашей текущей категории). Вы должны выбрать оптимальный порог доверия для каждой категории. Если вы хотите объединить эти отдельные меры для каждой категории в глобальную меру производительности, вам придется микро (суммировать все истинные положительные, ложные срабатывания, ложные негативы и истинные негативы и комбинированные баллы) или макрос (оценка по шкале для каждой категории и затем средние показатели по всем категориям).

    У нас есть корпус из десятков миллионов документов, миллионы примеров обучения и тысячи категорий (многоквартирный). Поскольку мы сталкиваемся с серьезными проблемами времени на обучение (количество новых документов, обновление или удаление в день довольно велико), мы используем модифицированную версию liblinear . Но для небольших задач использование одной из оболочек python вокруг liblinear ( liblinear2scipy или scikit-learn ) должно работать нормально.

    Есть ли способ иметь «ни один из вышеперечисленных» вариантов для классификатора, если документ не вписывается ни в одну из категорий?

    Вы можете получить этот эффект, просто используя «ни одну из вышеперечисленных» псевдо-категорий, прошедших обучение каждый раз. Если макс, который вы можете тренировать, составляет 5 категорий (хотя я не уверен, почему он ел достаточно много ОЗУ), тренируйте 4 фактических категории из их фактических 2K документов каждый, а «ни один из вышеперечисленных» один с его 2K документами случайным образом из всех остальных 146 категорий (около 13-14 из каждого, если вы хотите использовать метод «стратифицированной выборки», который может быть обоснованным).

    Все еще кажется немного клочьям, и вам может быть лучше с совершенно другим подходом – найдите многомерную меру doc, которая определяет ваши 300K предварительно помеченные документы в 150 разумно разделяемых кластеров, а затем просто назначьте каждую из других – привязанные документы к соответствующему кластеру, как определено таким образом. Я не думаю, что у NLTK есть что-то прямое, чтобы поддерживать такую ​​вещь, но, эй, NLTK рос так быстро, что я, возможно, пропустил что-то … 😉

    Python - лучший язык программирования в мире.