Как классифицировать и табулировать ответы в свободной форме на вопрос в опросе?

Я хочу проанализировать ответы на веб-опрос ( Git User's Survey 2008, если кому-то интересно). Некоторые из вопросов были в свободной форме, например, "Как вы узнали о Git?". С более чем 3000 ответов, анализ этих ответов полностью вручную исключен (особенно из-за того, что в этом обзоре довольно много вопросов в свободной форме).

Как я могу сгруппировать эти ответы (возможно, на основе ключевых слов, использованных в ответе) по категориям, по крайней мере, полуавтоматически (т. Е. Программа может запросить подтверждение), и позже, как табулировать (подсчитать количество записей в каждой категории) эти свободные Форма ответов (ответов)? Один ответ может принадлежать более чем одной категории, хотя для простоты можно предположить, что категории являются ортогональными / исключающими.

Я хотел бы знать, по крайней мере, ключевое слово для поиска или алгоритм (метод) для использования. Я бы предпочел решения в Perl (или C).


Возможное решение № 1. (частичное): байесовская категоризация

(добавлено 2009-05-21)

Одним из решений, о котором я подумал, было бы использование чего-то вроде алгоритма (и математического метода) для фильтрации байесовского спама, только вместо одной или двух категорий ("спам" и "ветчина") их было бы больше; и сами категории будут создаваться адаптивно / интерактивно.

4 ответа

Решение

Текст::Ngrams + Алгоритм:: Кластер

  1. Сгенерируйте некоторое векторное представление для каждого ответа (например, количество слов), используя Text:: Ngrams.
  2. Сгруппируйте векторы, используя Algorithm::Cluster, чтобы определить группировки, а также ключевые слова, которые соответствуют группам.

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

В прошлом я перебирал такие грубые вещи с довольно большими корпусами. Lingua::EN::Tagger, Lingua::Stem::En. Кроме того, API Net:: Calais (к сожалению, поскольку Thomposon Reuters не совсем подходит для работы с открытым исходным кодом) довольно полезен для извлечения именованных объектов из текста. Конечно, как только вы очистите необработанные данные с помощью этого материала, фактическое извлечение данных остается за вами. Я был бы склонен подозревать, что для ваших потребностей будет достаточно подсчетов частоты и небольшой механической перекрестной проверки турок.

Ищите обычные слова в качестве ключевых слов, но пропускайте бессмысленные слова, такие как "the", "a" и т. Д. После этого вы попадаете на естественный язык, который мне недоступен.

Меня только что осенило, что идеальным решением для этого является AAI (искусственный искусственный интеллект). Используйте механический турок Амазонки. Привязки Perl: Net:: Amazon:: MechanicalTurk. По одному центу за ответ с приличным совпадением (скажем, три человека за ответ), что составит около 90 долларов США.

Другие вопросы по тегам