天天看点

结巴分词的使用

结巴分词介绍

现在开源的中文分词工具,有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);

    }