用大公报训练斯坦福 NER,内存问题

Train Stanford NER with big gazette, memory issue

我之前使用 Stanford NER 和一个包含 450.000 个标记的训练文件训练了一个德语分类器。因为我有将近 20 个 类,这花了大约 8 个小时,我不得不在 prop 文件中删减很多功能。

我现在有一个公报文件,其中包含 16.000.000 个唯一标记的令牌。我想在使用这些标记的情况下重新训练我的分类器,但我一直 运行ning 陷入内存问题。 gazette-txt 为 386mb,主要包含双标记对象(名字 + 名字),所有对象都是唯一的。

我已将 类 的数量减少到 5,将公报中的代币数量减少了 400 万,并且我已经从支持中删除了斯坦福 NER 常见问题解答网站上列出的所有功能-文件,但我仍然 运行 进入内存不足:java 堆 space 错误。我有 16gb 的 ram 并使用 -mx15g -Xmx14g.

启动 jvm

错误发生在该过程大约 5 小时后。

我的问题是我不知道如何在不随意删除公报条目的情况下进一步减少内存使用。有人对我如何减少内存使用有进一步的建议吗?

我的道具文件如下所示:

trainFile = ....tsv
serializeTo = ...ser.gz
map = word=0,answer=1

useWordPairs=false
useNGrams=false
useClassFeature=true
useWord=true
noMidNGrams=true
usePrev=true
useNext=true
useSequences=true
usePrevSequences=true
maxLeft=1
useTypeSeqs=true
useTypeSeqs2=true
useTypeySequences=true
wordShape=chris2useLC
useDisjunctive=true
saveFeatureIndexToDisk=true
qnSize=2
printFeatures=true
useObservedSequencesOnly=true

cleanGazette=true
gazette=....txt

希望这不会太麻烦。提前致谢!

RegexNER 可以帮助您:

http://nlp.stanford.edu/static/software/regexner/

一些想法:

  1. 从 1,000,000 个条目开始,看看您可以处理多大的地名词典,如果 1,000,000 个条目太大,则进一步缩小。

  2. 根据条目在大型语料库中的出现频率对条目进行排序,并剔除不常见的条目

  3. 希望你的地名词典中的许多稀有条目没有歧义,所以你可以只使用 RegexNER 并在你的系统中有一个基于规则的层,自动将它们标记为 PERSON

以下是我一直在做的更新: 首先,我尝试使用我们大学服务器上可用的 128gb RAM 上的所有可用数据来训练分类器。但由于进展非常缓慢(5 天后约 120 次优化迭代),我决定过滤地名词典。

我在我的地名词典中检查了德语维基百科中的所有 n-Grams,只保留了出现不止一次的那些。这减少了 ~12 mio 的 PER 数量。到 260k。 一开始我只为我的 PER-list 做了这个,然后重新训练了我的 classifier。这导致 F 值增加 3%(从 ~70.5% 到 73.5%)。到目前为止,我也过滤了 ORG 和 LOC 列表,但我不确定是否应该使用它们。

ORG 列表包含很多缩写词。这些都是用大写字母写的,但我不知道训练过程是否考虑了大写字母。因为如果不这样做,这将导致德语中首字母缩略词和实际单词之间出现大量不必要的歧义。

我还注意到,每当我使用未过滤的 ORG 或未过滤的 LOC 列表时,那个 class 的 F 值可能会上升一点,但其他 [=20] 的 F 值=]es 明显下降了一些。这就是为什么我现在只使用 PER-list 的原因。

这是我目前的进度。再次感谢所有提供帮助的人。