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

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

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

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

我已经将类(class)数量减少到 5 个,将公报中的 token 数量减少了 400 万个,并且我已经从 prop 文件中删除了斯坦福 NER 常见问题解答网站上列出的所有功能,但我仍然遇到out of memory: 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

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

最佳答案

RegexNER 可以帮助您解决这个问题:

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

一些想法:

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

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

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

关于java - 用大公报训练斯坦福 NER,内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34940417/

相关文章:

java - Java.NET平台独立吗?

java - 从 parse.com 接收文本文件并放置在 textview 中

c++ - new 和 delete[] 比 malloc 和 free 差吗? (c++/VS2012)

.net - AppDomain 地址空间

java - 测试期间剪贴板内容不刷新

java - JSONArray 无法转换为 JSONObject 异常

c++ - C++ 中的释放(指针 vector 数组)

machine-learning - 使用 "Bag of Words"方法进行主题检测的朴素贝叶斯

nlp - 实体抽取库

nlp - 防止 Stanford Core NLP Server 输出它接收到的文本