2

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

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

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

请提供一些线索。

提前致谢!

4

2 回答 2

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 服务器。

于 2014-11-25T10:03:33.567 回答
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 并进一步减小句子大小,以仅在所需实体的窗口中容纳几个单词。这也可以。
我相信这将对复杂性产生巨大影响,而对性能影响很小。

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

谢谢你。

于 2014-12-24T13:37:55.770 回答