近来在做自然语言处理的一个项目,使用了几个工具包,包括中科院计算所的ICTCLAS(java版),复旦大学的FudanNLP和斯坦福大学的stanford parser。Java版的ICTCLAS有一些Bug,但只要勤在网上Baidu或Google,总可以找解决办法。但FudanNLP和standford parser的麻烦在于其内存要求较高,特别是在分词或句法分析时更是如此。
FudanNLP 词性标注时:
官方给出的解决方案是增加Java运行时的内存大小,即增加Java Heap Size。如果你使用Eclipse的话,可以直接在eclipse.ini里配置-Xms500m -Xmx1g。但我这样配置后,依然会出现内存错误,同学好像就没有,郁闷:(
具体参见: http://code.google.com/p/fudannlp/issues/detail?id=8Stanford Parser
依存句法分析,分析到N个句子时出现:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.HashMap.resize(Unknown Source)
at java.util.HashMap.addEntry(Unknown Source)
at java.util.HashMap.put(Unknown Source)
at edu.stanford.nlp.parser.lexparser.Interner.intern(Interner.java:16)
at edu.stanford.nlp.parser.lexparser.HookChart.addEdge(HookChart.java:229)
at edu.stanford.nlp.parser.lexparser.BiLexPCFGParser.processEdge(BiLexPCFGParser.java:558)
at edu.stanford.nlp.parser.lexparser.BiLexPCFGParser.processItem(BiLexPCFGParser.java:594)
at edu.stanford.nlp.parser.lexparser.BiLexPCFGParser.parse(BiLexPCFGParser.java:869)
at edu.stanford.nlp.parser.lexparser.LexicalizedParserQuery.parse(LexicalizedParserQuery.java:259)
at edu.stanford.nlp.parser.lexparser.LexicalizedParser.apply(LexicalizedParser.java:282)
这个的处理方法与FudanNLP类似,增加Java Heap Size到1G以上。
官方给的解决方案及类似问题可参见: http://nlp.stanford.edu/software/parser-faq.shtml#k
在此贴一下利用Stanford Parser进行依存句法分析的一个简单例子:
import java.util.Collection;
import java.util.Iterator;
import edu.stanford.nlp.parser.lexparser.LexicalizedParser;
import edu.stanford.nlp.trees.Tree;
import edu.stanford.nlp.trees.TypedDependency;
import edu.stanford.nlp.trees.international.pennchinese.ChineseGrammaticalStructure;
public class TestICTCLAS
{
/**
* @param args
*/
public static void main(String[] args)
{
String grammar = ".\\models\\xinhuaFactoredSegmenting.ser.gz";
String[] options = { "-maxLength", "80" };
LexicalizedParser lp = LexicalizedParser.loadModel(grammar,options);
String s = "国务院日前发出紧急通知,要求各地切实落实保证市场供应的各项政策,维护副食品价格稳定。";
Tree t = lp.apply(s);
ChineseGrammaticalStructure gs = new ChineseGrammaticalStructure(t);
Collection<TypedDependency> tdl = gs.typedDependenciesCollapsed();
System.out.println(tdl);
for(TypedDependency td:tdl)
{
System.out.println(td.reln().getShortName()
+":"+td.gov().nodeString()+","+td.dep().nodeString());
}
}
}