Как определить правильные веса для метрических баллов - PullRequest
1 голос
/ 24 марта 2012

Я занимаюсь личным исследованием анализа текста и придумала около 70 метрик (частота использования местоимений, уровни чтения, частота гласных, использование маркеров и т. Д.), Чтобы «забить» кусок текста.

В идеале, отдельные фрагменты текста от одного автора должны иметь одинаковые оценки. Конечная цель состоит в том, чтобы проиндексировать большое количество авторов и использовать оценки, чтобы угадать, кто написал отдельный анонимный фрагмент текста.

Я бы хотел, чтобы результаты нормализовались от 0 до 100 и представляли процент того, насколько «похожи» две части текста в стиле письма. Такие вопросы, как Как определить вес? и Как рассчитать баллы? описывают математику метрик оценки и как ее нормализовать, но предположим, что каждая метрика имеет одинаковый вес.

У меня такой вопрос: как определить правильный вес, который следует использовать при подсчете каждой метрики, чтобы обеспечить, чтобы совокупный балл по каждому пользователю наиболее точно описывал записи этого конкретного пользователя?

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

Ответы [ 2 ]

2 голосов
/ 24 марта 2012

Если вы хотите сделать это с помощью взвешенных оценок, взгляните на http://en.wikipedia.org/wiki/Principal_component_analysis - вы можете построить значения первой (наибольшей) пары основных компонентов для разных авторов и посмотреть, найдете ли вы кластеризацию.Вы также можете взять график наименьшего из нескольких основных компонентов и посмотреть, если что-то выделяется - если это так, то, вероятно, это из-за сбоя или ошибки - это имеет тенденцию выделять исключения из общих правил.

Другойопция http://en.wikipedia.org/wiki/Linear_discriminant_analysis

Я полагаю, что вы могли бы построить веса для каждого автора, если вы построили веса для классификации Алиса против не-Алисы, и веса для классификации Боб против не-Боба.

Еще один способ определить авторов - создать для каждого автора http://en.wikipedia.org/wiki/Language_model.

Мне приходит в голову, что, если вы готовы заявить, что ваши различные меры независимы, вы можете объединить ихс http://en.wikipedia.org/wiki/Naive_Bayes_classifier. Журнал конечного байесовского фактора будет тогда суммой журналов отдельных байесовских факторов, которая даст вам сумму взвешенных баллов.

1 голос
/ 24 марта 2012

Похоже, вы пытаетесь объединить несколько разнородных атрибутов стиля письма в одно число, которое затем каким-то образом будет использоваться для определения сходства стилей письма пользователей.Как это сработает?Бобу - 100, Алисе - 50 и т. Д.

Что вы действительно хотите - это использовать (некоторое подмножество) метрик, чтобы сформировать вектор признаков для каждого стиля письма.Затем вы можете сказать, что определенный документ представлен (60% pronoun usage, 10th grade "reading level", 40% vowels, ...), другой - (40% pronouns, 12th grade "reading level", 50% vowels, ...), где каждый из этих атрибутов является действительным числом, а позиция в векторе говорит вам, о каком атрибуте вы говорите.

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

Если у вас есть новый документ, и вы хотите угадать, кто его написал, это стандартная проблема контролируемое обучение .Один простой способ - это подход k к ближайшему соседу , в котором вы находите k ближайшие векторы к вашей контрольной точке под некоторой метрикой расстояния и используете их метки, чтобы проголосовать, за какого автора вы думаете, что это,Если вы не представляете, какие функции будут наиболее полезными, вы можете использовать расстояние Махаланобиса, которое эквивалентно стандартному евклидову расстоянию, если вы масштабируете каждый компонент вектора, чтобы иметь единичную дисперсию ((((x - y) / all_data_stacked.std(axis=0))**2).sum() в нотации).

Но существует множество подходов к классификации, многие из которых основаны на нахождении разделяющих поверхностей в пространстве объектов, которые отделяют одного автора от другого.Чтобы сделать это со многими авторами, вы можете найти эти поверхности принятия решений между всеми парами авторов, применить каждый из этих num_authors * (num_authors - 1) / 2 классификаторов к контрольной точке и проголосовать за эти метки.Другой способ состоит в том, чтобы обучить одного классификатора для каждого автора, который делает этого автора против кого-либо еще, а затем выбрать тот, который наиболее уверен.

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

Если вы на самом деле не пытаетесь классифицировать контрольные точки, и вы просто хотите измерить, «насколько похожи стили письма Алисы и Боба?», Есть другие подходы.Что вы пытаетесь сделать в этом случае, в рамках, с которыми я здесь работаю, это взять два набора векторов и спросить «насколько они похожи»?

Есть несколько простых мер, которые людииспользуйте для таких вещей, как, например, минимальное или среднее расстояние между элементами набора, и тому подобное.Но это не обязательно очень полезно.

Одна специальная мера заключается в следующем: насколько легко спутать работу Алисы с работой Боба?Чтобы проверить это, обучите классификатор Алисы-Боба перекрестной проверке и посмотрите, как часто классификатор путает контрольные точки для Алисы против Боба.То есть используйте все, кроме k документов для Алисы или Боба, чтобы обучить классификатор между ними, а затем оцените этот классификатор по этим k.Повторите, чтобы каждый документ был засекречен.Если частота ошибок высока, то стиль их записи аналогичен;если нет, они не похожи.Использование k = 1 здесь лучше, если вы можете себе это позволить.

Мы также можем прийти к этому из более формального подхода. Исследовательский проект, в который я вовлечен, включает в себя обработку этих наборов векторов признаков как образцов из неизвестного распределения вероятностей, представляющих стиль письма отдельного автора. Поэтому, когда Алиса пишет документ, его функции выбираются в соответствии с распределением вероятностей, которое представляет способ, которым она пишет; Документы Боба выбраны из распределения Боба. Затем вы можете оценить расхождение Rényi-α между этими двумя распределениями, что является одним из способов измерения их «схожести». (Если вы выберете α около 1, оно приближается к важной дивергенции Кульбака-Лейблера (KL) .) Вот несколько статей , в которых описывается техника , , в которой приведены все математические детали оценщик и препринт , описывающий, как объединить этот оценщик с SVM, чтобы превзойти современный уровень проблем с компьютерным зрением . У меня есть реализация C ++ здесь ; дайте мне знать, если вы в конечном итоге использовать его!

Другой подобный метод, который используют люди, называется максимальное среднее расхождение .

Все эти методы (кроме классификатора), к сожалению, полагаются на то, что вы вручную масштабируете исходные объекты соответствующим образом. (Это не относится, например, к SVM для классификации; они могут помочь выяснить, являются ли некоторые функции более важными, чем другие для данного пользователя, хотя вам, вероятно, следует масштабировать их все, чтобы иметь нулевое среднее значение и дисперсию единицы в качестве первого шага.) Это проблема выбора функции , которая является сложной проблемой, которая, к сожалению, все еще требует некоторой настройки. Подходы, основанные на взаимной информации и т. П. (Тесно связанные с оценкой расхождений), могут быть здесь полезными. Как подсказал mcdowella , PCA также может быть хорошим местом для старта.

...