训练斯坦福NER与大公报,记忆问题

时间:2016-01-22 06:33:40

标签: java memory nlp stanford-nlp named-entity-recognition

我之前使用斯坦福NER训练了一个德国分类器和一个450.000令牌的训练文件。因为我有近20个班级,这花了大约8个小时,我不得不在道具文件中缩短很多功能。

我现在有一个带有16.000.000个唯一标记标记的公报文件。我想在使用这些令牌的情况下重新训练我的分类器,但我一直在遇到内存问题。 gazette-txt是386mb,主要包含两个令牌对象(第一个+第二个名字),都是唯一的。

我已将课程数量减少到5,将公告中的令牌数量减少了400万,并且我已从prop文件中删除了Stanford NER常见问题解答网站上列出的所有功能但我仍然遇到内存不足:java堆空间错误。我有16GB的ram并用-mx15g -Xmx14g启动jvm。

错误发生在整个过程的大约5个小时。

我的问题是,我不知道如何进一步减少内存使用量,而无需在公报中任意删除条目。有人对如何减少我的记忆力使用有进一步的建议吗?

我的prop文件看起来像这样:

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

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

2 个答案:

答案 0 :(得分:1)

RegexNER可以帮助您:

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

一些想法:

  1. 从1,000,000个条目开始,看看你能够处理多大的地名词典,或者1,000,000太大会使它缩小更多。

  2. 根据条目在大型语料库中的频率排序并消除不常见的条目

  3. 希望你的地名词典中很多稀有条目都不含糊,所以你可以使用RegexNER并在你的系统中有一个基于规则的图层,自动将它们标记为PERSON

答案 1 :(得分:0)

继续对我正在做的事情进行更新: 首先,我尝试使用我们的大学服务器上的所有可用数据来训练分类器,并提供128 GB RAM。但由于进展非常缓慢(5天后大约120次优化迭代),我决定过滤地名词典。

我在德国维基百科检查了我的gazeteer中的所有n-Grams,并且只保留了不止一次的那些。这使PER的量从~12 mio降低。到260k。 我最初只为我的PER列表做了这个,并重新训练了我的分类器。这导致F值增加3%(从~70.5%增加到73.5%)。到目前为止,我也过滤了ORG和LOC列表,但我不确定是否应该使用它们。

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

我还注意到,每当我使用未过滤的ORG或未过滤的LOC列表时,该类的F值可能会有所上升,但其他类的F值有所下降。这就是为什么我现在只使用PER列表。

这是我目前的进展。再次感谢所有帮助过的人。