当前位置:   article > 正文

综合版本的中科院分词器加斯坦福依存分析树

分词引擎tlp

主要要做3件事:

第一件事 下载ICTCLAS50_Windows_64_JNI或者ICTCLAS50_Windows_32_JNI ,按照上面的系统文档进行调试(解压后DOC下有这个文档)

第二件事 下载stanford-parser(也就是斯坦福的依存分析树)越新越好,笔者用的是2012-07-09版本的。

最后一件事就是代码调试,代码如下:

  1. import java.io.*;
  2. import java.util.List;
  3. import edu.stanford.nlp.ling.CoreLabel;
  4. import edu.stanford.nlp.ling.Sentence;
  5. import edu.stanford.nlp.parser.lexparser.LexicalizedParser;
  6. import edu.stanford.nlp.trees.GrammaticalStructure;
  7. import edu.stanford.nlp.trees.GrammaticalStructureFactory;
  8. import edu.stanford.nlp.trees.Tree;
  9. import edu.stanford.nlp.trees.TreePrint;
  10. import edu.stanford.nlp.trees.TreebankLanguagePack;
  11. import edu.stanford.nlp.trees.TypedDependency;
  12. import edu.stanford.nlp.trees.international.pennchinese.ChineseTreebankLanguagePack;
  13. import ICTCLAS.I3S.AC.ICTCLAS50;
  14. public class ParserTest {
  15. public static void main( String arg[] )
  16. {
  17. String filename = "question2.txt";
  18. getSentence(filename);
  19. }
  20. private static void getSentence(String inFile)
  21. {
  22. File file = new File(inFile);
  23. BufferedReader reader = null;
  24. try {
  25. System.out.println("以行为单位读取文件内容,一次读一整行:");
  26. reader = new BufferedReader(new FileReader(file));
  27. String tempString = null;
  28. int line = 1;
  29. LexicalizedParser lp = LexicalizedParser.loadModel("chinesePCFG.ser.gz");
  30. // 一次读入一行,直到读入null为文件结束
  31. while ((tempString = reader.readLine()) != null) {
  32. // 显示行号
  33. System.out.println("line " + line + ": " + tempString);
  34. line++;
  35. //显示分词结果
  36. tempString=tempString.replace(" ", "");//去问句前隐藏的空格
  37. String seg = segment(tempString);
  38. // System.out.println(seg + " ");
  39. //斯坦福解析
  40. String[] sent = seg.split(" ");
  41. List<CoreLabel> rawWords = Sentence.toCoreLabelList(sent);
  42. Tree parse = lp.apply(rawWords);
  43. TreebankLanguagePack tlp = new ChineseTreebankLanguagePack();
  44. GrammaticalStructureFactory gsf = tlp.grammaticalStructureFactory();
  45. GrammaticalStructure gs = gsf.newGrammaticalStructure(parse);
  46. List<TypedDependency> tdl = gs.typedDependenciesCCprocessed();
  47. int size2 = tdl.size();
  48. System.out.println("依存的总数是:"+size2);
  49. for (int j = 0; j < size2; j++)
  50. {
  51. System.out.println(tdl.get(j).gov()); //依存关系的第一个词
  52. System.out.println(tdl.get(j).dep()); //依存关系的第二个词
  53. System.out.println(tdl.get(j).reln()); //依存关系
  54. System.out.println("*********************");
  55. }
  56. System.out.println(tdl); //输出它的依存关系
  57. /* TreePrint tp = new TreePrint("wordsAndTags,typedDependenciesCollapsed",new ChineseTreebankLanguagePack());
  58. //斯坦福的依存关系数
  59. tp.printTree(parse); //输出的时候带有斯坦福的词性标注
  60. System.out.println("*********************");*/
  61. System.out.println("\n");
  62. }
  63. reader.close();
  64. } catch (IOException e) {
  65. e.printStackTrace();
  66. } finally {
  67. if (reader != null) {
  68. try {
  69. reader.close();
  70. } catch (IOException e1) {
  71. }
  72. }
  73. }
  74. }
  75. public static String segment(String sentence)
  76. {
  77. try
  78. {
  79. ICTCLAS50 testICTCLAS50 = new ICTCLAS50();
  80. String argu = ".";
  81. //初始化
  82. if (testICTCLAS50.ICTCLAS_Init(argu.getBytes("GB2312")) == false)
  83. {
  84. System.out.println("Init Fail!");
  85. return null;
  86. }
  87. //设置词性标注集(0 计算所二级标注集,1 计算所一级标注集,2 北大二级标注集,3 北大一级标注集)
  88. testICTCLAS50.ICTCLAS_SetPOSmap(2);
  89. //导入用户字典
  90. int nCount = 0;
  91. String usrdir = "userdict.txt"; //用户字典路径
  92. byte[] usrdirb = usrdir.getBytes();//将string转化为byte类型
  93. //导入用户字典,返回导入用户词语个数第一个参数为用户字典路径,第二个参数为用户字典的编码类型
  94. nCount = testICTCLAS50.ICTCLAS_ImportUserDictFile(usrdirb, 0);
  95. //System.out.println("导入用户词个数" + nCount);
  96. nCount = 0;
  97. //导入用户字典后再分词 这里的0和1都是选项即上面的词性标注集
  98. byte nativeBytes[] = testICTCLAS50.ICTCLAS_ParagraphProcess(sentence.getBytes("GB2312"), 2, 0);
  99. //System.out.println(nativeBytes.length);
  100. String seg = new String(nativeBytes, 0, nativeBytes.length, "GB2312");
  101. nativeBytes = testICTCLAS50.ICTCLAS_ParagraphProcess(sentence.getBytes("GB2312"), 2, 1); // 带词性标记的分词结果
  102. String seg_pos = new String(nativeBytes, 0, nativeBytes.length,"GB2312");
  103. System.out.println("*********************");
  104. System.out.println("中科院的分词结果为: " + seg);
  105. System.out.println("*********************");
  106. System.out.println("%%%%%%%%%%%%%%%%%%%%%%");
  107. System.out.println("中科院的分词结果为(带词性标注): " + seg_pos);
  108. System.out.println("%%%%%%%%%%%%%%%%%%%%%%");
  109. //保存用户字典
  110. testICTCLAS50.ICTCLAS_SaveTheUsrDic();
  111. //释放分词组件资源
  112. testICTCLAS50.ICTCLAS_Exit();
  113. return seg;
  114. }
  115. catch (Exception ex)
  116. {
  117. }
  118. return null;
  119. }
  120. }

  注意2点:第一就是这里是自然语言问题的采用输入输出流的测试方法,看到代码中question2.txt就是测试文件的名字,最好直接放在当前项目之下。

                  第二就是。看见关键的3个包是否存在,即chineseFactored.ser.gz、chinesePCFG.ser.gz(只要在目录下就可以了)

                                还有stanford-parser.jar 的路径是否有。

 运行结果如下:你会发现函数的词性标注怎么会是PPA?没错,这就是计算所分词器的一大好处—用户字典。

 

这只是自然语言处理句法分析的一部分,以后可能会忘记,所以在博客园留下记忆的痕迹,同时也分享给大家!

 

 

 

 

转载于:https://www.cnblogs.com/XP007/archive/2013/03/26/2982761.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/870580
推荐阅读
相关标签
  

闽ICP备14008679号