我们正在努力将斯坦福自然语言处理集成到我们的系统上,它工作得很好,只是它导致了gc overhead limit exceeded。我们有内存转储,并将对其进行分析,但如果有人对此问题有一些想法,请让我们知道。服务器相当强大,固态硬盘,32 is内存,至强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>发布于 2017-03-10 06:01:19
只是为了澄清一些事情,lp.parse(...)应该运行在一个句子上,而不是一个段落或文档上。lp.parse(...)接受一个句子并返回该句子的解析树。如果你在一个段落或文档长度的文本上运行它,你肯定会遇到崩溃问题。如果您使用管道API,您还可以设置解析将运行的最大句子长度,如果您提交的句子比这个长度更长,您将只得到一个平面解析。在现实世界的NLP中,你经常会遇到很长的句子,这些句子只是一些东西的列表,跳过它们是很有帮助的,因为解析器会在它们上面崩溃。正如我在评论中指出的,您可以在此处了解有关管道API的更多信息:http://stanfordnlp.github.io/CoreNLP/api.html
https://stackoverflow.com/questions/42690737
复制相似问题