我正在尝试使用 OpenNLP 编写 Document Categorizer 的 map-reduce 实现。
在训练阶段,我计划读取大量文件并创建一个模型文件作为 map-reduce 计算的结果(可能是一系列作业)。我会将文件分发给不同的映射器,作为这一步的结果,我会创建一些模型文件。现在,我希望将这些模型文件缩减为一个模型文件以用于分类。
我知道这不是最直观的用例,但我准备亲自动手并扩展/修改 OpenNLP 源代码,假设可以调整 maxent 算法以这种方式工作。
如果这看起来太牵强,我请求建议通过生成与输入文件对应的文档样本作为 map-reduce 步骤的输出并通过将它们提供给文档分类器训练器将它们减少为模型文件来实现这一点。
谢谢!
最佳答案
我以前做过,我的方法是不让每个 reducer 都生成模型,而是只生成格式正确的数据。 而不是使用类别作为键,它将所有类别分开只需使用一个键并将值设置为正确的格式(cat sample newline)然后在单个reducer中您可以将该数据作为(字符串)bytearrayinputstream和训练模型。当然这不是唯一的方法。您根本不必修改 opennlp 即可执行此操作。
简而言之,我的建议是使用行为如下的单个作业:
map :读入您的数据,创建类别标签和样本对。使用名为“ALL”的键和上下文。用该键写入每一对。
Reduce:使用 stringbuilder 将所有 cat: 样本对连接成正确的训练格式。将字符串转换为 bytearrayinputstream 并提供给训练 API。将模型写在某处。
可能会出现您的样本数据太大而无法发送到一个节点的问题。如果是这样,您可以将值写入 A nosql 数据库,然后从更强大的训练节点读取。或者您可以在映射器中使用随机化来生成许多键并构建许多模型,然后在分类时编写 z wrapper 来测试所有数据,并从每个 Getz 中获取最好的......有很多选择。
关于hadoop - 在 OpenNLP 中合并多个文档分类器模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24190923/