Обработка тем на естественном языке

Я являюсь частью группы, работающей над проектом курса по большим данным, и мы столкнулись с тем, что мы считаем проблемой для НЛП. В настоящее время у нас есть группы данных, отформатированные в JSON как таковые:

    "wine": {
        "category": "socializing",
        "category_id": 31,
        "score": 0.0,
        "topic_id": 611
    }
    "dragons": {
        "category": "lifestyle",
        "category_id": 17,
        "score": 0.279108277990115,
        "topic_id": 2137
    },
    "furry-fandom": {
        "category": "lifestyle",
        "category_id": 17,
        "score": 0.279108277990115,
        "topic_id": 48595
    },
    "legendarycreatures": {
        "category": "lifestyle",
        "category_id": 17,
        "score": 0.279108277990115,
        "topic_id": 10523
    }

Теги - это темы, связанные с соответствующей информацией (категория, рейтинг популярности и идентификатор категории / темы #). Мы уже связали категории для каждой темы, так как API, который мы извлекаем из этого, обрабатывает его. Наша проблема, однако, в том, что категории слишком широки, всего 33, для определения каких-либо значимых тенденций, а темы слишком специфичны с наложением (например, драконы / легендарные существа), а их слишком много с примерно 22 000.

Это где НЛП приходит; мы хотим создать набор супер-тем, которые не так широки, как "категория", но не так специфичны, как текущие темы. Примером использования "драконов" и "легандарных существ" снова было бы, как и другие, вписаться в супер-тему "фантазии".

Немного больше информации, мы используем Python для захвата / обработки наших данных, мы хотели бы продолжать использовать их для этого, и никто из нас не имеет никакого практического опыта работы с NLP.

Имея это в виду, мы хотели бы получить некоторые предложения и помочь в этой области борьбы. Если есть более эффективные способы или, возможно, это невозможно с НЛП, мы открыты для них. Однако мы стараемся избегать жесткого кодирования таблицы для классификации.

TL; DR: Мы пытаемся классифицировать набор из 22 000 тем, чтобы они соответствовали "супер-темам", которые являются более конкретными, чем текущие, но менее широкими, чем текущие категории. Мы пытаемся сделать это с NLP при использовании Python, но не знаем, как это сделать, и также открыты для предложений.

2 ответа

Решение

Я предложу TextBlob, поскольку он упрощает процесс обучения классификатора. Смотрите здесь учебник о том, как построить классификатор текста. Конечно, в вашей конкретной проблеме вам необходимо выяснить, сколько разных категорий вы хотите классифицировать; Затем вы должны тренироваться, отправляя значительный набор тренировок (не слишком много, чтобы избежать перебора набора данных); в этот момент ваш классификатор будет готов получить новые данные типа

"dragons": {
 "category": "lifestyle",
 "category_id": 17,
 "score": 0.279108277990115,
 "topic_id": 2137
 }

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

первый кластер отмечен как lifestyle

"dragons": {
    "category": "lifestyle",
    "category_id": 17,
    "score": 0.279108277990115,
    "topic_id": 2137
},
"furry-fandom": {
    "category": "lifestyle",
    "category_id": 17,
    "score": 0.279108277990115,
    "topic_id": 48595
},
"legendarycreatures": {
    "category": "lifestyle",
    "category_id": 17,
    "score": 0.279108277990115,
  }

второй кластер помечен socializing

"wine": {
        "category": "socializing",
        "category_id": 31,
        "score": 0.0,
        "topic_id": 611
    }

Чтобы определить свою суперкатегорию, вы должны указать классификатору, что такие термины, как dragons а также legendarycreatures принадлежит к тому же набору данных, давайте назовем это fantasy, Так что это не только вопрос или классификация, но также анализ текста и семантика: legendarycreatures => legendary + creatures (мешок слов) имеет расстояние до термина dragons это ближе, чем другие слова, поэтому word2vec может помочь здесь оценить векторы этих имен и определить метрики за ними и расстояние между ними. Хорошая реализация обеспечивается Gensim.

Я упоминаю word2vec так как это будет работать, если у вас есть текст / описание для каждой из этих записей или нет. В последнем случае вы можете просто определить метрику для заголовка элемента, как dragons или же legendarycreatures,

[ОБНОВЛЕНИЕ] Итак, я пытаюсь выяснить, как найти правильный алгоритм классификации, используя совершенно новый метод, "который автоматически создает и оптимизирует конвейеры машинного обучения с использованием генетического программирования", названный Tpot, созданный @rhiever.

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

Это типичная проблема классификации. Если вы хотите использовать Python, я бы порекомендовал вам использовать Natural Language ToolKit (NLTK), особенно nltk.classify пакет. Хорошее введение и обзор использования NLTK для классификации можно найти здесь: http://www.nltk.org/book/ch06.html. Чтобы получить больше информации о nltk.classify:

>>> import nltk
>>> help(nltk.classify)
Другие вопросы по тегам