首页 > 编程语言 >java 分词统计

java 分词统计

时间:2023-04-25 10:24:54浏览次数:38  
标签:map java Map list lucene import new 分词 统计

  1. 依赖(谷歌基于lucene的中文分词IKAnalyzer)
<dependency>
  <groupId>org.wltea</groupId>
  <artifactId>ikanalyzer</artifactId>
  <version>5.0.2</version>
</dependency>

<dependency>
  <groupId>org.apache.lucene</groupId>
  <artifactId>lucene-core</artifactId>
  <version>8.2.0</version>
</dependency>
  1. 代码
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.wltea.analyzer.lucene.IKAnalyzer;
import java.io.Reader;
import java.io.StringReader;
import java.util.*;

public class WordSegmentationStatistics  {

    /**
     * 通过IKAnalyzer分词,返回单词和出现出现次数
     * @param content 原始文本
     * @return map(key是单词,value是出现次数)
     */
    public static Map<String, Integer> textSegmentation(String content) {
        Map<String, Integer> map = new HashMap<>();
        try(Reader reader = new StringReader(content);
            IKAnalyzer ss = new IKAnalyzer();
            TokenStream tokenStream = ss.tokenStream("", reader)
        ) {
            tokenStream.reset();
            while (tokenStream.incrementToken()) {
                CharTermAttribute termAttribute = tokenStream.getAttribute(CharTermAttribute.class);
                String word = termAttribute.toString();
                if (word.length() > 1) {
                    Integer num = map.get(word);
                    if (num == null) {
                        map.put(word, 1);
                    } else {
                        map.put(word, num + 1);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }

    /**
     * 过滤单词,出现n次以下的过滤掉
     * @param map(key是单词,value是出现次数)
     * @param n 最少出现次数
     */
    public static void wordFrequencyFilter(Map<String, Integer> map,int n) {
        Iterator<Map.Entry<String,Integer>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String,Integer> entry = iterator.next();
            Integer v = entry.getValue();
            if (v < n) {
                iterator.remove();
            }
        }
    }

    /**
     * 将词云排序,并提取词频最高的n个
     * @param map(key是单词,value是出现次数)
     * @param n 频率最高的n个
     * @return 排序后的List<Entry>
     */
    public static List<Map.Entry<String,Integer>> wordFrequencyRank(Map<String, Integer> map, int n) {
        PriorityQueue<Map.Entry<String,Integer>> queue = new PriorityQueue<>((a,b)->b.getValue() - a.getValue());
        queue.addAll(map.entrySet());
        List<Map.Entry<String,Integer>> list = new ArrayList<>(n);
        int count = 0;
        while (!queue.isEmpty() && count < n) {
            count++;
            list.add(queue.poll());
        }
        return list;
    }

    public static void main(String[] args) {
        Map<String,Integer> map = new HashMap<>(100);
        for (int i = 1; i <= 50; i++) {
            map.put(String.valueOf(i), (int) (Math.random() * 10));
        }
        wordFrequencyFilter(map,3);
        System.out.println(map.size()+":"+map);
        List<Map.Entry<String,Integer>> list = wordFrequencyRank(map,50);
        System.out.println(list.size()+":"+list);
    }

}

标签:map,java,Map,list,lucene,import,new,分词,统计
From: https://www.cnblogs.com/xiaogblog/p/17351831.html

相关文章

  • 【DP】LeetCode 1277. 统计全为 1 的正方形子矩阵
    题目链接1277.统计全为1的正方形子矩阵思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数组的动态规划问题中,一般dp[i]都是表示以nums以前i个元素组成(即nums[i-1])的状态;dp[i][j]分别表示以nums1......
  • JavaScript回调函数
    一种场景js需要等待一个函数执行完后再执行另一个函数或者其他的操作。本编以最简单的例子来说明回调函数的执行过程。回调函数备注上就是以函数对象作为参数进行传递。demo<!DOCTYPEhtml><html><head><metahttp-equiv="Content-Type"content="text/html;charset=gb2312"/>......
  • Java设计模式-简单工厂模式
    简介在软件开发过程中,设计模式是一种被广泛应用的实践,它是通过总结、归纳和提炼出软件设计经验,从而使得设计更加优雅、高效。简单工厂模式是设计模式中最基本、最简单的一种模式,它能够有效地封装对象的创建过程,简化代码结构。简单工厂模式又称为静态工厂方法模式,它是通过定义一......
  • 【代理设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
    简介代理模式(ProxyPattern)是一种结构型设计模式,用一个类来代理另一个类或几个类的功能。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。延迟初始化(虚拟代理)。如果你有一个偶尔使用的重量级服务对象,一直保持该对象运行会消耗系统资源时,可使用代理模式。访问......
  • GraalVM(云原生时代的Java)和IoT在边缘侧落地与实践
    环顾四周,皆是对手!云时代的掉队者,由于Java启动的高延时、对资源的高占用、导致在Serverless及FaaS架构下力不从心,在越来越流行的边缘计算、IoT方向上也是难觅踪影;Java语言在业务服务开发中孤独求败,但在系统级应用领域几乎是C、C++、搅局者Go、黑天鹅Rust的天下;移动应用、敏捷......
  • 李航统计学习概述
    监督学习感知机概念:感知机模型的基本形式是:\(f(x)=sign(w\cdotx+b)\)其中,\(x\)是输入样本的特征向量,\(w\)是权值向量,\(b\)是偏置量,\(w\cdotx\)表示向量\(w\)和\(x\)的点积。\(sign\)函数表示符号函数,当输入大于0时输出1,否则输出-1。要求模型必......
  • JavaScript 正则表达式
    基本使用 //定义正则表达式 constreg=/^\d{4}-\d{1,2}-\d{1,2}$/; conststr="2020-11-11"; //验证字符串是否符合规则 reg.test(str);元字符^表示开始部分等于xxx$表示结束部分等于xxx[]表示字符串中存在中括号中定义的字符,可以使用连字符,如a-z表示可以匹......
  • Java基础
    Java基础Java基础篇JDK和JRE的区别是什么?JDK:JavaDevelopmentKit的简称,java开发工具包,提供了java的开发环境和运行环境。JRE:JavaRuntimeEnvironment的简称,java运行环境,为java的运行提供了所需环境。总结:JDK包含了JRE,同时还包含了编译java源码的编译器......
  • JAVA运算符详解
    JAVA运算字符详解赋值运算符符号作用说明=赋值inta=10;将10赋值给变量a+=加后赋值a+=b;将a+b的值给a-=减后赋值a-=b;将a-b的值给a*=乘后赋值a*=b;将a*b的值给a/=除后赋值a/=b;将a/b的值给a%=取余后赋值a%=b;将a%b的余数......
  • ACM International Collegiate Programming Contest 2014 B SPFA 统计路径
    FloweryTrails!”()”*+,-).%”/)’0”122”1!2”342”522”!22”652”!42”72”72”5!2”!12”622”18!”162”!12”6”7”4”9”3”5”8”1”2”Inordertoattractmorevisitors,themanagerofanationalp......