综合版本的中科院分词器加斯坦福依存分析树
主要要做3件事:
第一件事 下载ICTCLAS50_Windows_64_JNI或者ICTCLAS50_Windows_32_JNI ,按照上面的系统文档进行调试(解压后DOC下有这个文档)
第二件事 下载stanford-parser(也就是斯坦福的依存分析树)越新越好,笔者用的是2012-07-09版本的。
最后一件事就是代码调试,代码如下:
import java.io.*; import java.util.List; import edu.stanford.nlp.ling.CoreLabel; import edu.stanford.nlp.ling.Sentence; import edu.stanford.nlp.parser.lexparser.LexicalizedParser; import edu.stanford.nlp.trees.GrammaticalStructure; import edu.stanford.nlp.trees.GrammaticalStructureFactory; import edu.stanford.nlp.trees.Tree; import edu.stanford.nlp.trees.TreePrint; import edu.stanford.nlp.trees.TreebankLanguagePack; import edu.stanford.nlp.trees.TypedDependency; import edu.stanford.nlp.trees.international.pennchinese.ChineseTreebankLanguagePack; import ICTCLAS.I3S.AC.ICTCLAS50; public class ParserTest { public static void main( String arg[] ) { String filename = "question2.txt"; getSentence(filename); } private static void getSentence(String inFile) { File file = new File(inFile); BufferedReader reader = null; try { System.out.println("以行为单位读取文件内容,一次读一整行:"); reader = new BufferedReader(new FileReader(file)); String tempString = null; int line = 1; LexicalizedParser lp = LexicalizedParser.loadModel("chinesePCFG.ser.gz"); // 一次读入一行,直到读入null为文件结束 while ((tempString = reader.readLine()) != null) { // 显示行号 System.out.println("line " + line + ": " + tempString); line++; //显示分词结果 tempString=tempString.replace(" ", "");//去问句前隐藏的空格 String seg = segment(tempString); // System.out.println(seg + " "); //斯坦福解析 String[] sent = seg.split(" "); List<CoreLabel> rawWords = Sentence.toCoreLabelList(sent); Tree parse = lp.apply(rawWords); TreebankLanguagePack tlp = new ChineseTreebankLanguagePack(); GrammaticalStructureFactory gsf = tlp.grammaticalStructureFactory(); GrammaticalStructure gs = gsf.newGrammaticalStructure(parse); List<TypedDependency> tdl = gs.typedDependenciesCCprocessed(); int size2 = tdl.size(); System.out.println("依存的总数是:"+size2); for (int j = 0; j < size2; j++) { System.out.println(tdl.get(j).gov()); //依存关系的第一个词 System.out.println(tdl.get(j).dep()); //依存关系的第二个词 System.out.println(tdl.get(j).reln()); //依存关系 System.out.println("*********************"); } System.out.println(tdl); //输出它的依存关系 /* TreePrint tp = new TreePrint("wordsAndTags,typedDependenciesCollapsed",new ChineseTreebankLanguagePack()); //斯坦福的依存关系数 tp.printTree(parse); //输出的时候带有斯坦福的词性标注 System.out.println("*********************");*/ System.out.println("\n"); } reader.close(); } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e1) { } } } } public static String segment(String sentence) { try { ICTCLAS50 testICTCLAS50 = new ICTCLAS50(); String argu = "."; //初始化 if (testICTCLAS50.ICTCLAS_Init(argu.getBytes("GB2312")) == false) { System.out.println("Init Fail!"); return null; } //设置词性标注集(0 计算所二级标注集,1 计算所一级标注集,2 北大二级标注集,3 北大一级标注集) testICTCLAS50.ICTCLAS_SetPOSmap(2); //导入用户字典 int nCount = 0; String usrdir = "userdict.txt"; //用户字典路径 byte[] usrdirb = usrdir.getBytes();//将string转化为byte类型 //导入用户字典,返回导入用户词语个数第一个参数为用户字典路径,第二个参数为用户字典的编码类型 nCount = testICTCLAS50.ICTCLAS_ImportUserDictFile(usrdirb, 0); //System.out.println("导入用户词个数" + nCount); nCount = 0; //导入用户字典后再分词 这里的0和1都是选项即上面的词性标注集 byte nativeBytes[] = testICTCLAS50.ICTCLAS_ParagraphProcess(sentence.getBytes("GB2312"), 2, 0); //System.out.println(nativeBytes.length); String seg = new String(nativeBytes, 0, nativeBytes.length, "GB2312"); nativeBytes = testICTCLAS50.ICTCLAS_ParagraphProcess(sentence.getBytes("GB2312"), 2, 1); // 带词性标记的分词结果 String seg_pos = new String(nativeBytes, 0, nativeBytes.length,"GB2312"); System.out.println("*********************"); System.out.println("中科院的分词结果为: " + seg); System.out.println("*********************"); System.out.println("%%%%%%%%%%%%%%%%%%%%%%"); System.out.println("中科院的分词结果为(带词性标注): " + seg_pos); System.out.println("%%%%%%%%%%%%%%%%%%%%%%"); //保存用户字典 testICTCLAS50.ICTCLAS_SaveTheUsrDic(); //释放分词组件资源 testICTCLAS50.ICTCLAS_Exit(); return seg; } catch (Exception ex) { } return null; } }
注意2点:第一就是这里是自然语言问题的采用输入输出流的测试方法,看到代码中question2.txt就是测试文件的名字,最好直接放在当前项目之下。
第二就是。看见关键的3个包是否存在,即chineseFactored.ser.gz、chinesePCFG.ser.gz(只要在目录下就可以了)
还有stanford-parser.jar 的路径是否有。
运行结果如下:你会发现函数的词性标注怎么会是PPA?没错,这就是计算所分词器的一大好处—用户字典。
这只是自然语言处理句法分析的一部分,以后可能会忘记,所以在博客园留下记忆的痕迹,同时也分享给大家!