Обработка тем на естественном языке
Я являюсь частью группы, работающей над проектом курса по большим данным, и мы столкнулись с тем, что мы считаем проблемой для НЛП. В настоящее время у нас есть группы данных, отформатированные в 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)