当前位置:   article > 正文

NLP 文本分词 java类方法,及opennlp 示例_java opennlp 中文分词

java opennlp 中文分词

文章中需要的Apache openNlp jar包:openNlp下载:https://opennlp.apache.org/cgi-bin/download.cgi

其他涉及的jar都是java基础类包

  1. package com.npl.demo.utils;
  2. import java.io.IOException;
  3. import java.io.StreamTokenizer;
  4. import java.io.StringReader;
  5. import java.text.BreakIterator;
  6. import java.util.ArrayList;
  7. import java.util.Arrays;
  8. import java.util.List;
  9. import java.util.Locale;
  10. import java.util.Scanner;
  11. import java.util.StringTokenizer;
  12. import java.util.regex.Pattern;
  13. import opennlp.tools.tokenize.SimpleTokenizer;
  14. import opennlp.tools.tokenize.WhitespaceTokenizer;
  15. /**
  16. * Filename: NlpTokenization.java
  17. * Description:
  18. * Copyright: Copyright (c) 2019 All Rights Reserved.
  19. * @author: wangk
  20. * @version: 1.0
  21. * Create at: 2019年5月5日 下午4:28:56
  22. *
  23. * Modification History:
  24. * Date Author Version Description
  25. * ------------------------------------------------------------------
  26. * 2019年5月5日 wangk 1.0 1.0 Version
  27. *
  28. */
  29. public class NlpTokenization {
  30. static String paragraph = "Let's The first sentence. The second sentence. Let's ";
  31. static String[] sentences = {
  32. "Tim was agood neighbor. Perhaps not as good Bob "+
  33. "Haywood, but stille pretty good. Of course Mr. Adam "+
  34. "took the cake!"
  35. };
  36. static String chineseLanguage = "时代的碰撞|中国古典民乐与流行的相遇"; //中文可以进行正则匹配每隔字中间加一个空格,就可以进行分词了
  37. //代码如下
  38. /*String regex = "(.{1})";
  39. text = text.replaceAll (regex, "$1 ");*/
  40. public static void main(String[] args) {
  41. NlpTokenization to = new NlpTokenization();
  42. //to.scanner(paragraph);
  43. //to.split(chineseLanguage);
  44. //to.breakIterator(paragraph);
  45. //to.streamTokenizer(paragraph);
  46. //to.stringTokenizer(chineseLanguage);
  47. //to.textSplit(); //测试分词 性能
  48. to.openNlpSimpleTokenizer(chineseLanguage);
  49. }
  50. /**
  51. * @Description: /默认使用空格作为分隔符 java类 Scanner方法
  52. * @author wangk
  53. * @param text
  54. * @return
  55. * @date: 2019年5月5日 下午1:51:38
  56. */
  57. public List scanner(String text) {
  58. Scanner scanner = new Scanner(text);
  59. scanner.useDelimiter("[ ,.]");//设置基于字符串或模式的分隔符 --设置分隔符为空格,逗号,句号 使用正则设置
  60. //scanner.reset();//分隔符复位为空格
  61. List<String> list = new ArrayList<>();
  62. while(scanner.hasNext()) {
  63. String token = scanner.next();
  64. list.add(token);
  65. }
  66. for(String token : list) {
  67. System.out.println(token);
  68. }
  69. return null;
  70. }
  71. /**
  72. * @Description: 文本分词 java类 split方法
  73. * @author wangk
  74. * @param text
  75. * @return
  76. * @date: 2019年5月5日 下午1:51:30
  77. */
  78. public List split(String text) {
  79. String tokens[] = text.split("\\s+");
  80. for (String token : tokens) {
  81. System.out.println(token);
  82. }
  83. return null;
  84. }
  85. /**
  86. * @Description: 文本分词 java类 BreakIterator方法 该类可以获取各种边界
  87. * @author wangk
  88. * @param text
  89. * @return
  90. * @date: 2019年5月5日 下午1:51:19
  91. */
  92. public List breakIterator(String text) {
  93. BreakIterator wordIterator = BreakIterator.getWordInstance();
  94. wordIterator.setText(text);
  95. int boundary = wordIterator.first();
  96. while(boundary != BreakIterator.DONE) {//done为最后一个边界
  97. int begin = boundary;
  98. System.out.print(boundary+"-");
  99. boundary = wordIterator.next();
  100. int end = boundary;
  101. if(end == BreakIterator.DONE) break;
  102. System.out.println(boundary+"["+ text.substring(begin, end)+"]");
  103. }
  104. return null;
  105. }
  106. /**
  107. * @Description: 文本分词 java类 StreamTokenizer方法 通常基于一个文件创建,对文件中的文本分词
  108. * @author wangk
  109. * @param text
  110. * @return
  111. * @date: 2019年5月5日 下午1:50:37
  112. */
  113. public List streamTokenizer(String text) {
  114. StreamTokenizer tokenizer = new StreamTokenizer(new StringReader(text));
  115. //对于分词器会将单引号字符和双引号字符表示引用文本,由于没有对应的引号,故字符串的其他部分被忽略了
  116. //使用ordinaryChar方法制定那些字符串应为普通字符
  117. tokenizer.ordinaryChar('\'');
  118. tokenizer.ordinaryChar(',');
  119. boolean isEOF = false; //用来终止循环
  120. while(!isEOF) {
  121. try {
  122. int token = tokenizer.nextToken(); //返回词项的类型
  123. switch(token) {
  124. case StreamTokenizer.TT_EOF: //static int 流结束的一个常数
  125. isEOF = true;
  126. break;
  127. case StreamTokenizer.TT_EOL: //static int 行结束的一个常数
  128. break;
  129. case StreamTokenizer.TT_NUMBER: //static int 读取词项的数量
  130. System.out.println(tokenizer.nval); //double 如果当前词项是一个单词则存有一个数字
  131. break;
  132. case StreamTokenizer.TT_WORD: //static int 指明一个单词词项的常数
  133. System.out.println(tokenizer.sval); //String 如果当前词项是一个单词则存有这个词项
  134. break;
  135. default:
  136. System.out.println((char) token);
  137. }
  138. } catch (IOException e) {
  139. e.printStackTrace();
  140. }
  141. }
  142. return null;
  143. }
  144. /**
  145. * @Description: 文本分词 java类 stringTokenizer方法 可以处理热恩和来源的字符串
  146. * @author wangk
  147. * @param text
  148. * @return
  149. * @date: 2019年5月5日 下午3:05:36
  150. */
  151. public List stringTokenizer(String text) {
  152. StringTokenizer st = new StringTokenizer(text);
  153. while(st.hasMoreTokens()) {
  154. System.out.println(st.nextToken());
  155. }
  156. return null;
  157. }
  158. /**
  159. * @Description: 测试分词 性能
  160. * @author wangk
  161. * @date: 2019年5月5日 下午4:28:59
  162. */
  163. public void textSplit() {
  164. StringBuilder sb = new StringBuilder();
  165. for (int i = 100000; i < 100000 + 60; i++)
  166. sb.append(i).append(' ');
  167. String sample = sb.toString();
  168. int runs = 100000;
  169. for (int i = 0; i < 5; i++) {
  170. {
  171. long start = System.nanoTime();
  172. for (int r = 0; r < runs; r++) {
  173. StringTokenizer st = new StringTokenizer(sample);
  174. List<String> list = new ArrayList<String>();
  175. while (st.hasMoreTokens())
  176. list.add(st.nextToken());
  177. }
  178. long time = System.nanoTime() - start;
  179. System.out.printf("StringTokenizer took an average of %.1f us%n", time / runs / 1000.0);
  180. }
  181. {
  182. long start = System.nanoTime();
  183. Pattern spacePattern = Pattern.compile(" ");
  184. for (int r = 0; r < runs; r++) {
  185. List<String> list = Arrays.asList(spacePattern.split(sample, 0));
  186. }
  187. long time = System.nanoTime() - start;
  188. System.out.printf("Pattern.split took an average of %.1f us%n", time / runs / 1000.0);
  189. }
  190. {
  191. long start = System.nanoTime();
  192. for (int r = 0; r < runs; r++) {
  193. List<String> list = new ArrayList<String>();
  194. int pos = 0, end;
  195. while ((end = sample.indexOf(' ', pos)) >= 0) {
  196. list.add(sample.substring(pos, end));
  197. pos = end + 1;
  198. }
  199. }
  200. long time = System.nanoTime() - start;
  201. System.out.printf("indexOf loop took an average of %.1f us%n", time / runs / 1000.0);
  202. }
  203. }
  204. }
  205. /**
  206. * @Description: 英文标点也被作为单独项 openNlp 方法SimpleTokenizer
  207. * @author wangk
  208. * @param text
  209. * @return
  210. * @date: 2019年5月6日 上午10:36:38
  211. */
  212. public List openNlpSimpleTokenizer(String text) {
  213. SimpleTokenizer simpleTokenizer = SimpleTokenizer.INSTANCE;
  214. String regex = "(.{1})";
  215. text = text.replaceAll (regex, "$1 ");
  216. String tokens[] = simpleTokenizer.tokenize(text);
  217. for(String token : tokens) {
  218. System.out.println(token);
  219. }
  220. return null;
  221. }
  222. /**
  223. * @Description: 空格作为分隔符 openNlp 方法 WhitespaceTokenizer
  224. * @author wangk
  225. * @param text
  226. * @return
  227. * @date: 2019年5月6日 上午10:36:38
  228. */
  229. public List openNlpWhitespaceTokenizer(String text) {
  230. WhitespaceTokenizer simpleTokenizer = WhitespaceTokenizer.INSTANCE;
  231. String tokens[] = simpleTokenizer.tokenize(text);
  232. for(String token : tokens) {
  233. System.out.println(token);
  234. }
  235. return null;
  236. }
  237. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/360586
推荐阅读
相关标签
  

闽ICP备14008679号