Hadoop 在OpenNLP中合并多个文档分类器模型

Hadoop 在OpenNLP中合并多个文档分类器模型,hadoop,mapreduce,opennlp,Hadoop,Mapreduce,Opennlp,我正在尝试使用OpenNLP编写文档分类程序的MapReduce实现 在培训阶段,我计划读取大量文件,并创建一个模型文件,作为map reduce计算的结果(可能是一系列作业)。我将把文件分发给不同的映射者,我将创建许多模型文件作为这一步的结果。现在,我希望将这些模型文件简化为一个用于分类的模型文件 我知道这不是最直观的用例,但我已经准备好动手扩展/修改OpenNLP源代码,假设可以调整maxent算法以这种方式工作 如果这看起来太牵强,我请求建议通过生成与输入文件相对应的文档样本作为map r

我正在尝试使用OpenNLP编写文档分类程序的MapReduce实现

在培训阶段,我计划读取大量文件,并创建一个模型文件,作为map reduce计算的结果(可能是一系列作业)。我将把文件分发给不同的映射者,我将创建许多模型文件作为这一步的结果。现在,我希望将这些模型文件简化为一个用于分类的模型文件

我知道这不是最直观的用例,但我已经准备好动手扩展/修改OpenNLP源代码,假设可以调整maxent算法以这种方式工作

如果这看起来太牵强,我请求建议通过生成与输入文件相对应的文档样本作为map reduce步骤的输出,并通过将它们提供给document categorizer trainer,将它们简化为模型文件


谢谢

我以前做过,我的方法是不让每个reducer生成模型,而是只生成格式正确的数据。 与其使用类别作为键(将所有类别分开),只需使用单个键并将值设置为正确的格式(cat sample newline),然后在单个减速机中,您可以将该数据作为(字符串)bytearrayinputstream读取并训练模型。当然,这不是唯一的办法。要做到这一点,您根本不需要修改opennlp

简单地说,我的建议是使用一个行为如下的作业:

映射:读入数据,创建类别标签和样本对。使用名为“ALL”的键和上下文。用该键编写每一对

减少:使用stringbuilder将所有cat:sample对合并为正确的训练格式。将字符串转换为bytearrayinputstream并向训练API提供数据。把模型写在某处

可能会出现这样的问题:样本数据太大,无法发送到一个节点。如果是这样,您可以将这些值写入nosql数据库,然后从beefier培训节点读入。或者,您可以在映射器中使用随机化来生成多个键并构建多个模型,然后在分类时编写z包装器,测试所有这些键的数据,并从每个键中获得最佳的z。。。。。有很多选择。
HTH

我的用例的问题是,我每天都会得到数百万个文件进行分类。我希望系统在非高峰时间重新学习所有样本,从而生成一个包含所有现有和新接收数据的新模型文件,从而一天比一天好。您是在对传入流进行分类,还是在批量进行分类?如果是后者,那么我建议将模型写入诸如HBase之类的文件,以便在分布式缓存中使用,这样您就可以运行构建模型的作业,然后在磁盘上运行另一个使用新创建的模型的作业。保留模型的版本也是一个不错的主意,以防您对它进行了太多的训练,以至于它开始过度适合。。。。只是一些想法。我主要关注批处理。我正在考虑通过cron-jobs定期对模型进行培训,并使用迄今为止收到的所有数据。在这个新模型准备好之前,我将使用旧模型。在培训工作期间,随着时间的推移,拥有一把钥匙和一个减速器节点可能变得不可能,我想避免依赖于一个强壮的节点。我倾向于使用随机化和生成多个模型。这不会因为分布的独立变量而影响分类器的准确性吗?会的,但是如果您管理每个映射器可以发送到每个随机桶的类别数量,您可能会做得很好。此外,由于在分类时,您将基本上循环一组模型,因此在所有模型中保持每个类别的最佳分数,它将做得非常好。在进行集群时,我使用了这种技术,我在mapper类的类级别使用了一个Map,其中键是bucket编号,值是我使用该键发出的项目数量,因此,一旦一个Map任务填充了一个键,我就会开始使用另一个键等。您的键=一只猫