如何加快OpenNLP的模型创建过程

时间:2014-11-18 05:38:16

标签: java machine-learning apache-spark opennlp maxent

我正在使用OpenNLP令牌名称查找器来解析非结构化数据,我已经创建了一个4MM记录的语料库(训练集),但是当我使用Eclipse中的OpenNLP API创建该语料库中的模型时,过程大约需要3个这是非常耗时的。模型建立在默认参数上,即迭代100和截止5。

所以我的问题是,如何加快这个过程,如何减少构建模型的过程所花费的时间。

语料库的大小可能是原因,但只是想知道是否有人遇到过这种问题,如果有的话,那么如何解决这个问题。

请提供一些线索。

提前致谢!

2 个答案:

答案 0 :(得分:4)

通常,处理此类问题的第一种方法是将训练数据拆分为多个块,并让每个人创建自己的模型。然后合并模型。我不确定这在这种情况下是否有效(我不是OpenNLP专家),下面是另一个解决方案。此外,由于OpenNLP API似乎只提供单个线程train()方法,因此我会提出请求多线程选项的问题。

对于慢速单线程操作,两个主要的减速因素是IO和CPU,两者都可以单独处理:

  • IO - 您使用哪种硬盘?常规(磁性)还是SSD?转向SSD应该有所帮助。
  • CPU - 你在使用哪个CPU?转向更快的CPU将有所帮助。不要注意核心数量,因为这里你需要原始速度。

您可能需要考虑从Amazon Web服务或Google Compute Engine获取高CPU服务器并在那里运行培训的选项 - 之后您可以下载该模型。两者都为您提供利用Xeon(Sandy Bridge或Ivy Bridge)CPU和本地SSD存储的高CPU服务器。

答案 1 :(得分:3)

我认为您应该在升级硬件之前进行与算法相关的更改 缩小句子大小
确保训练样本中没有不必要的长句。这样的句子不会提高性能,但会对计算产生巨大影响。 (不确定顺序)我通常把截止值设为200字/句。还要仔细看看这些功能,这些是默认的特征生成器
 two kinds of WindowFeatureGenerator with a default window size of only two OutcomePriorFeatureGenerator PreviousMapFeatureGenerator BigramNameFeatureGenerator SentenceFeatureGenerator
这些特征生成器在给定句子中为单词Robert生成以下特征:。

Sentence: Robert, creeley authored many books such as Life and Death, Echoes and Windows.
Features:
w=robert
n1w=creeley
n2w=authored
wc=ic
w&c=robert,ic
n1wc=lc
n1w&c=creeley,lc
n2wc=lc
n2w&c=authored,lc
def
pd=null
w,nw=Robert,creeley
wc,nc=ic,lc
S=begin


ic是初始资本,lc是小写字母

在这些功能中,S=begin是唯一依赖于句子的功能,它标志着句子开头出现Robert。 我的观点是解释完整句子在训练中的作用。您实际上可以删除SentenceFeatureGenerator并进一步减小句子大小,以便只在所需实体的窗口中容纳几个单词。这也适用。
我相信这会对复杂性产生巨大影响,对性能影响很小。

您是否考虑过抽样?
如上所述,这些特征是上下文的稀疏表示。可能是你有许多重复的句子,如特征生成器所见。尝试以一种表示具有不同模式的句子的方式检测这些和样本,即。应该不可能只编写几个与它们匹配的正则表达式。根据我的经验,具有不同模式的训练样本比仅代表少数模式的样本做得更好,即使前者的句子数量少得多。采样这种方式根本不应影响模型性能。

谢谢。