2016-04-10 4 views
2

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

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

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

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

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

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

+0

Посмотрите на http://stackoverflow.com/a/22905260/610569 – alvas

ответ

1

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

"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 быть longs к одному набору данных, назовем это fantasy.Таким образом, это не только вопрос или классификация, но и текстовый анализ и семантика: legendarycreatures =>legendary + creatures (сумка слов) имеет расстояние до слова dragons, что ближе, чем другие слова, поэтому word2vec может помочь здесь для оценки векторов этих имен и определения показателей позади них и расстояния между ними. Хорошая реализация обеспечивается gensim.

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

[UPDATE] Итак, я пытаюсь выяснить, как найти алгоритм правильного классификации с использованием совершенно новой техники «которая автоматически создает и оптимизирует машинного обучения трубопроводов с использованием генетического программирования», названный Tpot сделанное @rhiever

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

+0

Вот несколько различных наборов данных у меня есть: (http://txt.do/5wvo8) (HTTP: // TXT. do/5wvj6) Это самое маленькое, что у нас есть; с другой, достигая близких к ГБ по размеру и гораздо большего разнообразия. –

+0

ok давайте посмотрим ... – loretoparisi

+0

@AustinHoller Я только что обновил эту ветку с дальнейшим анализом, теперь есть хорошая отправная точка. – loretoparisi

1

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

>>> import nltk 
>>> help(nltk.classify)