我正在使用OpenNLP令牌名称查找器来解析非结构化数据,我已经创建了一个4MM记录的语料库(训练集),但是当我使用Eclipse中的OpenNLP API创建该语料库中的模型时,过程大约需要3个这是非常耗时的。模型建立在默认参数上,即迭代100和截止5。
所以我的问题是,如何加快这个过程,如何减少构建模型的过程所花费的时间。
语料库的大小可能是原因,但只是想知道是否有人遇到过这种问题,如果有的话,那么如何解决这个问题。
请提供一些线索。
提前致谢!
答案 0 :(得分:4)
通常,处理此类问题的第一种方法是将训练数据拆分为多个块,并让每个人创建自己的模型。然后合并模型。我不确定这在这种情况下是否有效(我不是OpenNLP专家),下面是另一个解决方案。此外,由于OpenNLP API似乎只提供单个线程train()方法,因此我会提出请求多线程选项的问题。
对于慢速单线程操作,两个主要的减速因素是IO和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并进一步减小句子大小,以便只在所需实体的窗口中容纳几个单词。这也适用。
我相信这会对复杂性产生巨大影响,对性能影响很小。
您是否考虑过抽样?
如上所述,这些特征是上下文的稀疏表示。可能是你有许多重复的句子,如特征生成器所见。尝试以一种表示具有不同模式的句子的方式检测这些和样本,即。应该不可能只编写几个与它们匹配的正则表达式。根据我的经验,具有不同模式的训练样本比仅代表少数模式的样本做得更好,即使前者的句子数量少得多。采样这种方式根本不应影响模型性能。
谢谢。