Похоже, вы пытаетесь объединить несколько разнородных атрибутов стиля письма в одно число, которое затем каким-то образом будет использоваться для определения сходства стилей письма пользователей.Как это сработает?Бобу - 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 также может быть хорошим местом для старта.