Объединение нескольких моделей классификаторов документов в OpenNLP

Я пытаюсь написать реализацию Document Categorizer с уменьшением карты, используя OpenNLP.

На этапе обучения я планирую прочитать большое количество файлов и создать файл модели в результате вычисления уменьшения карты (может быть цепочка заданий). Я раздам ​​файлы по разным мапперам, в результате этого шага я создам несколько файлов моделей. Теперь я хочу сократить эти файлы моделей до одного файла модели, который будет использоваться для классификации.

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

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

Спасибо!


person jatinpreet    schedule 12.06.2014    source источник


Ответы (1)


Я делал это раньше, и мой подход заключался в том, чтобы каждый редуктор не создавал модель, а создавал только правильно отформатированные данные. Вместо того, чтобы использовать категорию в качестве ключа, который разделяет все категории. Просто используйте один ключ и сделайте значение в правильном формате (пример новой строки cat), затем в одном редукторе вы можете прочитать эти данные как (строку) bytearrayinputstream и обучить модель. Конечно, это не единственный способ. Вам вообще не нужно было бы модифицировать opennlp, чтобы сделать это.

Проще говоря, я рекомендую использовать одно задание, которое ведет себя следующим образом:

Карта: прочитайте свои данные, создайте метку категории и пару образцов. Используйте ключ под названием «ALL» и context.write каждую пару с этим ключом.

Сокращение: используйте построитель строк, чтобы объединить все пары cat: sample в правильный формат обучения. Преобразуйте строку в bytearrayinputstream и передайте обучающему API. Напишите куда-нибудь модель.

Может возникнуть проблема, что данные ваших образцов слишком велики для отправки на один узел. Если это так, вы можете записать значения в A nosql db и прочитать их с более крупного учебного узла. Или вы можете использовать рандомизацию в вашем картографе, чтобы создать много ключей и построить много моделей, а затем во время классификации написать z-оболочку, которая проверяет данные по всем им, и Getz выбирает лучшее из каждого... Множество вариантов. ХТН

person markgiaconia    schedule 13.06.2014
comment
Проблема с моим вариантом использования заключается в том, что каждый день я буду классифицировать миллионы файлов. И я хочу, чтобы система становилась лучше с каждым днем, заново изучая все образцы в непиковые часы и, следовательно, создавая новый файл модели со всеми существующими и вновь полученными данными. - person jatinpreet; 13.06.2014
comment
Вы выполняете классификацию входящего потока или это также происходит в пакетном режиме? если последнее, то я рекомендую записать модель во что-то вроде HBase или в файл, который будет использоваться в распределенном кеше, чтобы вы могли запустить задание для построения модели, а затем запустить другое задание, использующее только что созданную модель на диске. Также неплохая идея хранить версии модели на тот случай, если вы так много тренировали ее, что она начинает подходить... просто несколько мыслей. - person markgiaconia; 13.06.2014
comment
Я сосредоточусь в первую очередь на пакетной обработке. Я думаю о периодическом обучении модели с помощью заданий cron со всеми данными, полученными до сих пор. Пока эта новая модель не будет готова, я буду использовать старую модель. - person jatinpreet; 13.06.2014
comment
Во время обучения наличие одного ключа и, следовательно, одного узла-редюсера может стать невозможным, поскольку дни проходят, и я хочу избежать зависимости от одного мощного узла. Я склоняюсь к использованию рандомизации и созданию нескольких моделей. Не повлияет ли это на точность классификатора из-за распределенных независимых переменных? - person jatinpreet; 13.06.2014
comment
так и будет, но если вы управляете количеством категорий, которые каждый маппер может выдать в каждую случайную корзину, у вас, вероятно, все будет в порядке. Кроме того, поскольку во время классификации вы, по сути, будете перебирать набор моделей, сохраняйте лучший результат для каждой категории во всех моделях, это будет очень хорошо. Я использовал эту технику однажды, выполняя кластеризацию, я использовал Map‹Integer, Integer› на уровне класса моего класса картографа, где ключ — это номер корзины, а значение — количество элементов, которые я испустил с этим ключом, поэтому однажды задача карты заполнила ключ, я бы начал использовать другой ключ и т. д. Ваш ключ = кошка - person markgiaconia; 13.06.2014
comment
Потрясающий! Я вижу, как это улучшит точность, если будет хотя бы некоторое представление каждой категории в каждом файле модели. Надеюсь, это решит мою проблему. Я должен сделать небольшое доказательство концепции, прежде чем перейти к производству, хотя я знаю, что это сработало для вас. Я также рассматриваю возможность использования Mahout для этой задачи, я выбрал OpenNLP из-за его точности. У вас есть опыт работы с Mahout для выполнения такого рода задач? - person jatinpreet; 13.06.2014
comment
нет, никогда не использовал mahout для классификации. дайте мне знать, как это происходит! - person markgiaconia; 14.06.2014