美文网首页程序员
说说如何使用 IKAnalyzer 实现词频统计并排序

说说如何使用 IKAnalyzer 实现词频统计并排序

作者: deniro | 来源:发表于2019-03-31 14:56 被阅读54次

    IKAnalyzer 是一个开源的,基于 java 语言开发的轻量级的中文分词工具包 。

    IKAnalyzer 采用了特有的 “ 正向迭代最细粒度切分算法 “ ,支持细粒度和智能分词两种切分模式; 在系统环境: Core2 i7 3.4G 双核, 4G 内存, window 7 64 位, Sun JDK 1.6_29 64 位 普通 pc 环境测试, IK2012 具有 160 万字 / 秒( 3000KB/S )的高速处理能力 。

    现在需要统计一批数据中的热词,即需要对这批数据进行分词分析,并统计出现频次,然后再按照从高到低排序。

    1、在项目中引入 IKAnalyzer jar。
    2、在 resources 中 新建 IKAnalyzer.cfg.xml 配置文件,内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
    <properties>
        <comment>IKAnalyzer</comment>
        <!-- 扩展词典-->
        <entry key="ext_dict">ext.dic;</entry>
        <!-- 扩展停止词词典-->
        <entry key="ext_stopwords">stopword.dic;</entry>
    </properties>
    
    

    3、接着,就可以编写词频统计工具咯:

    package net.deniro.solr;
    
    import org.apache.commons.lang3.StringUtils;
    import org.wltea.analyzer.core.IKSegmenter;
    import org.wltea.analyzer.core.Lexeme;
    
    import java.io.IOException;
    import java.io.StringReader;
    import java.util.*;
    
    /**
     * 分词后,根据常用词进行统计
     *
     * @author Deniro Li (lisq037@163.com)
     */
    public class WordFrequency {
    
    
        /**
         * 词频统计
         *
         * @param frequencies 词频;key:词语;value:出现次数
         * @param content     内容
         * @return
         * @throws IOException
         */
        public static Map<String, Integer> count(Map<String, Integer> frequencies, String
                content) throws IOException {
            if (frequencies == null) {
                frequencies = new HashMap<>();
            }
            if (StringUtils.isBlank(content)) {
                return frequencies;
            }
    
            IKSegmenter ikSegmenter = new IKSegmenter(new StringReader(content), true);
    
            Lexeme lexeme;
            while ((lexeme = ikSegmenter.next()) != null) {
                final String text = lexeme.getLexemeText();
         
                if (text.length() > 1) {
                    //递增
                    if (frequencies.containsKey(text)) {
                        frequencies.put(text, frequencies.get(text) + 1);
                    } else {//首次出现
                        frequencies.put(text, 1);
                    }
                }
            }
    
            return frequencies;
    
    
        }
    
        /**
         * 按出现次数,从高到低排序
         *
         * @param data
         * @return
         */
        public static List<Map.Entry<String, Integer>> order(Map<String, Integer> data) {
            List<Map.Entry<String, Integer>> result = new ArrayList<>(data.entrySet());
            Collections.sort(result, new Comparator<Map.Entry<String, Integer>>() {
                @Override
                public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                    return o2.getValue() - o1.getValue();
                }
            });
            return result;
        }
    
        public static void main(String[] args) throws IOException {
            String content = "三星 Galaxy Note4 N9100 4G手机(幻影白)双卡双待 公开版+施华洛世奇水晶后壳(瑰金落日)套装";
            List<Map.Entry<String, Integer>> result = WordFrequency.order
                    (WordFrequency.count(new HashMap<String, Integer>(), content));
            System.out.println(result);
        }
    }
    
    

    main 方法的运行结果为:

    [note4=1, 4g=1, 手机=1, 套装=1, 落日=1, galaxy=1, 幻影=1, n9100=1, 公开=1, 三星=1, 水晶=1]

    4、实际使用:

    ...
            Map<String, Integer> data = new HashMap<>();
            Map<String, Integer> frequencies = new HashMap<>();
            for (SolrDocument doc : documents) {
                final String item_sell_point = (String) doc.get
                        ("item_sell_point");
                data.putAll(WordFrequency.count(frequencies, item_sell_point));
    
            }
    
    
            //【卖点】分词统计
            List<Map.Entry<String, Integer>> result = WordFrequency.order(data);
            System.out.println(result);
    

    运行结果:

    相关文章

      网友评论

        本文标题:说说如何使用 IKAnalyzer 实现词频统计并排序

        本文链接:https://www.haomeiwen.com/subject/muzybqtx.html