结巴分词的使用

结巴分词介绍

现在开源的中文分词工具,有IK、MMseg4j、THULAC、Ansj、Jieba、HanLP等,其中最近还在更新并维护的,也是目前分词效果比较优秀的要属于Ansj、Jieba、HanLP了。 

之前我写过Ansj分词器的介绍说明博客,现在细谈一下Jieba分词的详细思路及其实现过程。

代码地址:https://download.csdn.net/download/qq_26408545/10479349

JieBatest2类,是该方法

里面的util为文件预读类,test。txt为测试文档,正常去处空格和括号特使字符最好。

结巴分词主页

结巴分词的github主页地址是:https://github.com/fxsjy/jieba(python版),原作者fxsjy是用python写的,后来有网友写了其他编程语言的版本。

目前官方页面推荐的java版结巴分词地址是:https://github.com/huaban/jieba-analysis(java版),这个java版的结巴分词只有针对搜索引擎分词的功能,我在这个之上做了优化改进,并添加了词性标志功能后,已经pull request 给作者piaolingxue了。

我改进后的结巴分词的java版地址是:https://github.com/shibing624/xmnlp ,该项目还在完善中,欢迎大家fork。

结巴分词简介

特点

  • 支持三种分词模式: 
    1. 精确模式,试图将句子最精确地切开,适合文本分析;
    2. 全模式,把句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能解决歧义;
    3. 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
  • 支持繁体分词
  • 支持自定义词典

 public static void  main(String[] args) throws Exception {

        String text = ReadTxt.txtToString(new File("D:/test.txt"));
        String txt = null ;
        JiebaSegmenter segmenter = new JiebaSegmenter();
        //将结果转成分词进行统计
        List<String> list = new ArrayList<String>();
        list =segmenter.sentenceProcess(text);
        
        //统计固定分词出现的频率
        System.out.println("\n - 计算'人民'出现的次数");
        System.out.println("人民 " + Collections.frequency(list, "人民"));
        
        //统计所有分析出现的频率(会有重复项)
        Set<String> uniqueSet = new HashSet(list);
        for (String temp : uniqueSet) {
            System.out.println(temp + ": " + Collections.frequency(list, temp));
        }
        //用map计算分词出现的频率
        System.out.println("\n例子3 -用Map来计算对象出现的次数");
        Map<String, Integer> map = new TreeMap<String, Integer>();
        for (String temp : list) {
            Integer count = map.get(temp);
            map.put(temp,  ((count == null) ? 1 : count + 1));
        }
        
        //将map统计的分词频率排序-转成list。
        List<Map.Entry<String,Integer>> list2 = new ArrayList<Map.Entry<String,Integer>>(map.entrySet());
        Collections.sort(list2,new Comparator<Map.Entry<String,Integer>>() {
            public int compare(Entry<String, Integer> o1,
                    Entry<String, Integer> o2) {
                return o2.getValue().compareTo(o1.getValue());
            }
        });
        //将排序结果输出
        for(Map.Entry<String,Integer> mapping:list2){ 
               System.out.println(mapping.getKey()+":"+mapping.getValue()); 
               txt = txt +mapping.getKey()+":"+mapping.getValue()+"   ";
        }
        //输出接过到txt中
        if(txt != null)
        ReadTxt.StringToTxt(txt);
    }

猜你喜欢

转载自blog.csdn.net/qq_26408545/article/details/80693171