0

スタンフォード NER を使用して、次のタグを取得するための文を解析しています: tokenize、ssplit、pos、lemma、ner。Project->Properties->Run->VM Options で 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)

誰かができるだけ早く助けてくれませんか?

4

2 に答える 2

2

スタックトレースは、CoreNLPでNERに使用される大規模なモデル(機能と重み)をロードしているときに、Javaのメモリが不足していることを示しています。これらはかなりの量のメモリを使用しますが、これはまだ非常に驚くべきことです。使用しているOS、JDKのバージョン、32/64ビットかどうかなどはわかりません。しかし、上記のプログラム(メインメソッドが追加され、いくつかのタイプが入力されている)の場合、Linux(CentOS 5)のJava 7u5では、-mx700m(32ビットまたは64ビットのJavaのいずれか)で実行できます。おっと)。したがって、どのアーキテクチャ/バージョンでも1600mで十分だと思います。

だから、私は試してみます:

  • もう少しメモリを使用して実行し、それによって状況が変わるかどうかを確認します(-mx1800mなど)
  • そうでない場合は、VMが実際に上記のメモリ量を取得していることを確認してください(書き込んだ内容が正しいように見えても)。たとえば、Runtime.getRuntime()。maxMemory()/1024/1024を印刷してみてください。
于 2012-09-02T19:11:42.243 に答える
0

すべて (Java と netbeans) をアンインストールし、すべて (Java と netbeans) を再インストールしました。-Xmx1400m を割り当てることはまだできませんが、-Xmx1000m を割り当てるとうまく機能します。皆様のご尽力に感謝いたします。

于 2012-09-03T13:44:42.887 に答える