当前位置:   article > 正文

java 后端 简单的分词_java自己写分词

java自己写分词

参考网上修改后

 创建StackTest 存入要提取的关键词

  1. package org.jeecg.modules.bim.test;
  2. /**
  3. * 建立StackTest类
  4. * 存放关键词内容
  5. * @author wangdongqi
  6. *
  7. */
  8. public class StackTest {
  9. private Object[] stack;
  10. //元素个数;
  11. private int size;
  12. //默认长度为10;
  13. public StackTest(){
  14. this(10);
  15. }
  16. //也可以自己设置长度,即容量;
  17. StackTest(int len){
  18. stack = new Object[len];
  19. }
  20. //返回元素个数;
  21. public int size(){
  22. return size;
  23. }
  24. //返回数组长度,即容量;
  25. private int capacity(){
  26. return stack.length;
  27. }
  28. //实现动态的数组;
  29. private void ensureCapacity(){
  30. if(size() == capacity()){
  31. Object[] newStack = new Object[size() * 3 / 2 + 1];
  32. System.arraycopy(stack, 0, newStack, 0, size());
  33. stack = newStack;
  34. }
  35. }
  36. //入栈;
  37. public void push(Object o){
  38. size++;
  39. ensureCapacity();
  40. stack[size - 1] = o;
  41. }
  42. //判空;
  43. public boolean isEmpty(){
  44. return size == 0;
  45. }
  46. //出栈;
  47. public Object pop(){
  48. //首先要判空;
  49. if(isEmpty()){
  50. throw new ArrayIndexOutOfBoundsException("不能为空");
  51. }
  52. Object o = stack[--size];
  53. stack[size] = null;
  54. return o;
  55. }
  56. }

创建 Split 类 分词

  1. package org.jeecg.modules.bim.test;
  2. import org.apache.commons.io.IOUtils;
  3. import org.springframework.core.io.ClassPathResource;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.nio.charset.StandardCharsets;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. import java.util.regex.Matcher;
  10. import java.util.regex.Pattern;
  11. /**
  12. * 建立Split类
  13. * 设置词典内容
  14. * @author wangdongqi
  15. *
  16. */
  17. class Split {
  18. private List<String> stackOut = new ArrayList<>();
  19. private ClassPathResource classPathResource = new ClassPathResource("keyWord");
  20. private InputStream inputStream =classPathResource.getInputStream();
  21. private String result = IOUtils.toString(inputStream, String.valueOf(StandardCharsets.UTF_8));
  22. // 去除空格 回车 换行
  23. private Pattern pattern = Pattern.compile("\\s*|\t|\r|\n");
  24. private Matcher m = pattern.matcher(result);
  25. private String[] dictionary = m.replaceAll("").split(","); //取得关键词词典
  26. private String input = null;
  27. Split(String input) throws IOException {
  28. this.input = input;
  29. }
  30. //分词
  31. public List<String> start() {
  32. String temp = null;
  33. StackTest stack = new StackTest(20);
  34. for(int i=0;i<this.input.length();i++) {
  35. temp = this.input.substring(i);
  36. // 每次从字符串开头截取一个字,并存到temp中
  37. // 如果该词在词典中, 则删除该词并在原始字符串中截取该词
  38. if(this.isInDictionary(temp)) {
  39. stack.push(temp); //入栈
  40. this.input = this.input.replace(temp, "");
  41. i = -1; // i=-1是因为要重新查找, 而要先执行循环中的i++
  42. }
  43. }
  44. // 当前循环完毕,词的末尾截去一个字,继续循环, 直到词变为空
  45. if(!"".equals(this.input)) {
  46. this.input = this.input.substring(0,this.input.length()-1);
  47. this.start();
  48. }
  49. //出栈
  50. while (!stack.isEmpty()) {
  51. stackOut.add(stack.pop().toString());
  52. }
  53. return stackOut;
  54. }
  55. //判断当前词是否在词典中
  56. private boolean isInDictionary(String temp) {
  57. for (String s : this.dictionary) {
  58. if (temp.equals(s)) {
  59. return true;
  60. }
  61. }
  62. return false;
  63. }
  64. }

keyWord.txt 为关键词词库文件 放在项目resources文件夹下 

public static void main(String[] args) throws IOException {
    String input = "我是大连理工大学一名一年级的学生,今年夏天就进入二年级了!";  // 要匹配的字符串
    List<String> stack = new Split(input).start();
    for (String s:stack
         ) {
        System.out.println(s);
    }
}

结果 :

大连
理工大学
一名
学生
二年级
Disconnected from the target VM, address: '127.0.0.1:63885', transport: 'socket'

Process finished with exit code 0
 

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

闽ICP备14008679号