使用 Netbeans 在斯坦福 NER 上出现 Java 堆空间错误

标签 java nlp netbeans-7 stanford-nlp

我正在使用斯坦福 NER 来解析一个句子以获得以下标签:tokenize、ssplit、pos、lemma、ner。我还通过“项目”->“属性”->“运行”->“VM 选项”将 netbeans 中的内存增加到 -Xms1600M -Xmx1600M。我仍然遇到 Java 内存不足异常。 我正在 Windows 7 JDK 版本 1.7 上运行 32 位 java。 这是我的代码

public ArrayList<String> NERTokensRet(String string) {
    ArrayList<String> myArr = new ArrayList<String>();


    props = new Properties();
    props.put("annotators", "tokenize,ssplit,pos,lemma,ner");
    pipeline = new StanfordCoreNLP(props);


    //     String resultString = string.replaceAll("[^\\p{L}\\p{N}]", " ");   
    Annotation annotation = new Annotation(string);
    pipeline.annotate(annotation);
    int j;
    for (CoreMap sentence : annotation.get(CoreAnnotations.SentencesAnnotation.class)) {
        List<CoreLabel> tokens = sentence.get(CoreAnnotations.TokensAnnotation.class);

        for (j = 0; j < tokens.size(); j++) {
            CoreLabel token = tokens.get(j);
            myArr.add("[" + token.originalText() + "," + token.tag() + "," + token.beginPosition() + "," + token.endPosition() + "]");
        }
        //System.out.println(myArr);
    }

    return myArr;
}

堆栈跟踪:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.lang.AbstractStringBuilder.<init>(AbstractStringBuilder.java:45)
at java.lang.StringBuilder.<init>(StringBuilder.java:68)
at java.io.ObjectInputStream$BlockDataInputStream.readUTFBody(ObjectInputStream.java:2998)
at java.io.ObjectInputStream$BlockDataInputStream.readUTF(ObjectInputStream.java:2819)
at java.io.ObjectInputStream.readString(ObjectInputStream.java:1598)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1319)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
at java.util.HashMap.readObject(HashMap.java:1030)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1848)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
at edu.stanford.nlp.ie.crf.CRFClassifier.loadClassifier(CRFClassifier.java:2255)
at edu.stanford.nlp.ie.AbstractSequenceClassifier.loadClassifier(AbstractSequenceClassifier.java:1444)
at edu.stanford.nlp.ie.AbstractSequenceClassifier.loadClassifier(AbstractSequenceClassifier.java:1421)
at edu.stanford.nlp.ie.AbstractSequenceClassifier.loadClassifier(AbstractSequenceClassifier.java:1500)
at edu.stanford.nlp.ie.AbstractSequenceClassifier.loadClassifier(AbstractSequenceClassifier.java:1487)
at edu.stanford.nlp.ie.crf.CRFClassifier.getClassifier(CRFClassifier.java:2386)
at edu.stanford.nlp.ie.ClassifierCombiner.loadClassifierFromPath(ClassifierCombiner.java:130)
at edu.stanford.nlp.ie.ClassifierCombiner.loadClassifiers(ClassifierCombiner.java:116)
at edu.stanford.nlp.ie.ClassifierCombiner.<init>(ClassifierCombiner.java:98)
at edu.stanford.nlp.ie.NERClassifierCombiner.<init>(NERClassifierCombiner.java:64)
at edu.stanford.nlp.pipeline.StanfordCoreNLP$6.create(StanfordCoreNLP.java:500)

有人可以尽快帮忙吗?

最佳答案

堆栈跟踪显示,在 CoreNLP 中加载用于 NER 的大型模型(特征和权重)时,java 就耗尽了内存。这些确实使用了大量的内存,但这仍然非常令人惊讶。你没有说你正在使用什么操作系统,什么JDK版本,是否32/64位等。但是对于上面的程序(添加了一个主要方法并填充了一些类型),在Linux(CentOS 5)上的Java 7u5上,我可以使用-mx700m(使用32位或64位Java - yay压缩)运行它哎呀)。所以我认为 1600m 对于任何架构/版本来说都应该足够了。

所以,我会尝试:

  • 使用更多内存运行,看看是否会改变(例如 -mx1800m)
  • 如果没有,请确保虚拟机确实获得了您上面所述的内存量(即使您编写的内容看起来是正确的)。例如,尝试打印 Runtime.getRuntime().maxMemory()/1024/1024。

关于使用 Netbeans 在斯坦福 NER 上出现 Java 堆空间错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12215372/

相关文章:

java - Android - 仅发送所需的 json

java - 同时调试python和Java

java - Redis 与两个不同的 Web 应用程序共享 session

java - Watson Natural Language Understanding Java 示例

jquery - 如何在 netbeans 7.1 上启用 jQuery 智能感知?

java - 从对象中获取 ArrayList

python - 为什么我在抓取网站时会得到一个空列表?

nlp - 寻找不同词之间的语义相似性和关系

java - 在 netbeans 中构建后,Jar 文件无法正常运行

c++ - NetBeans 7.0.1 良好的 C++ 程序执行 "RUN FAILED"