斯坦福NER再培训的内存要求

时间:2014-11-25 19:01:46

标签: java jvm stanford-nlp

我正在根据我自己的训练数据对斯坦福NER模型进行再培训,以便提取组织。但是,无论我使用4GB RAM机器还是8GB RAM机器,我都会遇到相同的Java堆空间错误。

有人能说出我们可以在不解决这些内存问题的情况下重新训练模型的机器的一般配置是什么吗?

我使用了以下命令:

 java -mx4g -cp stanford-ner.jar edu.stanford.nlp.ie.crf.CRFClassifier -prop newdata_retrain.prop

我正在处理培训数据(多个文件 - 每个文件大约有15000行,格式如下) - 每行一个字及其类别

她啊 是啊 工作O. 在O. 微软组织

我们还能做些什么来让这些模型可靠地运行吗?我确实尝试过减少训练数据中的课程数量。但这会影响提取的准确性。例如,某些位置或其他实体被归类为组织名称。我们可以减少特定的类数而不影响准确性吗?

我使用的一个数据是Alan Ritter twitter nlp数据:https://github.com/aritter/twitter_nlp/tree/master/data/annotated/ner.txt

属性文件如下所示:

#location of the training file
trainFile = ner.txt
#location where you would like to save (serialize to) your
#classifier; adding .gz at the end automatically gzips the file,
#making it faster and smaller
serializeTo = ner-model-twitter.ser.gz

#structure of your training file; this tells the classifier
#that the word is in column 0 and the correct answer is in
#column 1
map = word=0,answer=1

#these are the features we'd like to train with
#some are discussed below, the rest can be
#understood by looking at NERFeatureFactory
useClassFeature=true
useWord=true
useNGrams=true
#no ngrams will be included that do not contain either the
#beginning or end of the word
noMidNGrams=true
useDisjunctive=true
maxNGramLeng=6
usePrev=true
useNext=true
useSequences=true
usePrevSequences=true
maxLeft=1
#the next 4 deal with word shape features
useTypeSeqs=true
useTypeSeqs2=true
useTypeySequences=true
wordShape=chris2useLC
saveFeatureIndexToDisk = true

我得到的错误:堆栈跟踪是这样的:

CRFClassifier invoked on Mon Dec 01 02:55:22 UTC 2014 with arguments:
   -prop twitter_retrain.prop
usePrevSequences=true
useClassFeature=true
useTypeSeqs2=true
useSequences=true
wordShape=chris2useLC
saveFeatureIndexToDisk=true
useTypeySequences=true
useDisjunctive=true
noMidNGrams=true
serializeTo=ner-model-twitter.ser.gz
maxNGramLeng=6
useNGrams=true
usePrev=true
useNext=true
maxLeft=1
trainFile=ner.txt
map=word=0,answer=1
useWord=true
useTypeSeqs=true
[1000][2000]numFeatures = 215032
setting nodeFeatureIndicesMap, size=149877
setting edgeFeatureIndicesMap, size=65155
Time to convert docs to feature indices: 4.4 seconds
numClasses: 21 [0=O,1=B-facility,2=I-facility,3=B-other,4=I-other,5=B-company,6=B-person,7=B-tvshow,8=B-product,9=B-sportsteam,10=I-person,11=B-geo-loc,12=B-movie,13=I-movie,14=I-tvshow,15=I-company,16=B-musicartist,17=I-musicartist,18=I-geo-loc,19=I-product,20=I-sportsteam]
numDocuments: 2394
numDatums: 46469
numFeatures: 215032
Time to convert docs to data/labels: 2.5 seconds
Writing feature index to temporary file.
numWeights: 31880772
QNMinimizer called on double function of 31880772 variables, using M = 25.
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at edu.stanford.nlp.optimization.QNMinimizer.minimize(QNMinimizer.java:923)
        at edu.stanford.nlp.optimization.QNMinimizer.minimize(QNMinimizer.java:885)
        at edu.stanford.nlp.optimization.QNMinimizer.minimize(QNMinimizer.java:879)
        at edu.stanford.nlp.optimization.QNMinimizer.minimize(QNMinimizer.java:91)
        at edu.stanford.nlp.ie.crf.CRFClassifier.trainWeights(CRFClassifier.java:1911)
        at edu.stanford.nlp.ie.crf.CRFClassifier.train(CRFClassifier.java:1718)
        at edu.stanford.nlp.ie.AbstractSequenceClassifier.train(AbstractSequenceClassifier.java:759)
        at edu.stanford.nlp.ie.AbstractSequenceClassifier.train(AbstractSequenceClassifier.java:747)
        at edu.stanford.nlp.ie.crf.CRFClassifier.main(CRFClassifier.java:2937)

5 个答案:

答案 0 :(得分:2)

您可以尝试减少课程数量的一种方法是不使用B-I表示法。例如,俱乐部B设施和I设施进入设施。当然,另一种方式是使用更大的内存机器。

答案 1 :(得分:1)

不应该是 -Xmx4g 而不是-mx4g?

答案 2 :(得分:1)

很抱歉有点迟到了!我怀疑问题是文件的输入格式;特别是,我的第一个猜测是该文件被视为一个长句。

训练文件的预期格式是CoNLL格式,这意味着文件的每一行都是新的标记,句子的结尾用双重换行符表示。因此,例如,文件可能如下所示:

Cats  O
have  O
tails  O
.  O

Felix  ANIMAL
is  O
a  O
cat  O
.  O

如果确实采用这种格式,你可以告诉我吗?如果是这样,您是否可以包含错误的堆栈跟踪以及您正在使用的属性文件?如果只运行文件的前几个句子,它是否有效?

- 伽柏

答案 3 :(得分:0)

如果要对非事务性数据集进行分析,可能需要使用其他工具,如Elasticsearch(更简单)或Hadoop(指数更复杂)。 MongoDB也是一个很好的中间地带。

答案 4 :(得分:0)

首先卸载现有的java jdk并重新安装 然后,您可以根据硬盘大小尽可能多地使用堆大小 在术语" -mx4g" 4g不是RAM它是堆大小。
即使我最初面临同样的错误。这样做之后就消失了。
甚至我最初误将4g误认为是RAM。

现在我能够启动我的服务器,即使是100g的堆大小。

接着, 我建议您使用自定义RegexNER模型,而不是使用自定义NER模型,您可以在单个文档中添加数百万个相同实体名称的单词。
我最初遇到的这两个错误。

对于下面的任何查询评论。