我们正在努力将Stanford NLP集成到我们的系统上,它工作正常,只是它导致gc overhead limit exceeded
。我们有内存转储并将对其进行分析,但如果ányone对此问题有所了解,请告诉我们。服务器非常强大,SSD,32GB RAM,至强E5系列。
我们的代码:
String text = Jsoup.parse(groupNotes.getMnotetext()).text();
String lang;
try {
DetectorFactory.clear();
DetectorFactory.loadProfile("/home/deploy/profiles/");
Detector detector = DetectorFactory.create();
detector.append(text);
lang = detector.detect();
}catch (Exception ignored){
lang = "de";
}
LexicalizedParser lp;
if (lang.toLowerCase().equals("de")) {
lp = LexicalizedParser.loadModel(GERMAN_PCG_MODEL);
} else {
lp = LexicalizedParser.loadModel(ENGLISH_PCG_MODEL);
}
Tree parse;
parse = lp.parse(text);
List<String> stringList = new ArrayList<>();
List taggedWords = parse.taggedYield();
// System.out.println(taggedWords);
for (Object str : taggedWords) {
if (str.toString().contains("NN")) {
stringList.add(str.toString().replace("/NN", ""));
}
if (str.toString().contains("NNS")) {
stringList.add(str.toString().replace("/NNS", ""));
}
if (str.toString().contains("NNP")) {
stringList.add(str.toString().replace("/NNP", ""));
}
if (str.toString().contains("NNPS")) {
stringList.add(str.toString().replace("/NNPS", ""));
}
if (str.toString().contains("VB")) {
stringList.add(str.toString().replace("/VB", ""));
}
if (str.toString().contains("VBD")) {
stringList.add(str.toString().replace("/VBD", ""));
}
if (str.toString().contains("VBG")) {
stringList.add(str.toString().replace("/VBG", ""));
}
if (str.toString().contains("VBN")) {
stringList.add(str.toString().replace("/VBN", ""));
}
if (str.toString().contains("VBZ")) {
stringList.add(str.toString().replace("/VBZ", ""));
}
if (str.toString().contains("VBP")) {
stringList.add(str.toString().replace("/VBP", ""));
}
if (str.toString().contains("JJ")) {
stringList.add(str.toString().replace("/JJ", ""));
}
if (str.toString().contains("JJR")) {
stringList.add(str.toString().replace("/JJR", ""));
}
if (str.toString().contains("JJS")) {
stringList.add(str.toString().replace("/JJS", ""));
}
if (str.toString().contains("FW")) {
stringList.add(str.toString().replace("/FW", ""));
}
}
Apache tomcat的JVM选项:
CATALINA_OPTS="$CATALINA_OPTS -server -Xms2048M -Xmx3048M -XX:OnOutOfMemoryError="/home/deploy/scripts/tomcatrestart.sh" -XX:+UseParallelGC -XX:+HeapDumpOnOutOfMemory -XX:HeapDumpPath=/path/to/date.hprof -XX:-UseGCOverheadLimit -Dspring.security.strategy=MODE_INHERITABLETHREADLOCAL"
有什么想法吗?
POM.xml:
<dependency>
<groupId>edu.stanford.nlp</groupId>
<artifactId>stanford-corenlp</artifactId>
<version>3.7.0</version>
<classifier>models</classifier>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>edu.stanford.nlp</groupId>
<artifactId>stanford-corenlp</artifactId>
<version>3.7.0</version>
<classifier>models-german</classifier>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>edu.stanford.nlp</groupId>
<artifactId>stanford-parser</artifactId>
<version>3.7.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>edu.stanford.nlp</groupId>
<artifactId>stanford-corenlp</artifactId>
<version>3.7.0</version>
<scope>provided</scope>
</dependency>
答案 0 :(得分:0)
为了澄清一些事情,lp.parse(...)
应该在句子上运行,而不是段落或文档。 lp.parse(...)
接受一个句子并返回句子的解析树。如果在段落或文档长度文本上运行它,肯定会出现崩溃问题。如果您使用管道API,您还可以设置解析将运行的最大长度句子,如果您提交的句子长于句子,则只需要进行平面解析。在现实世界的NLP中,你经常会遇到一些巨大的句子,这些句子只是事物的列表,因为解析器会崩溃,所以跳过这些很有帮助。正如我在评论中提到的,您可以在此处了解有关管道API的更多信息:http://stanfordnlp.github.io/CoreNLP/api.html