java使用Nagao算法实现新词发现、热门词的挖掘

yizhihongxing

Java使用Nagao算法实现新词发现、热门词的挖掘攻略

本文将介绍如何使用Java实现Nagao算法对文本进行分析,从而实现新词发现和热门词挖掘。攻略分为以下四步:

  1. 数据预处理

在使用Nagao算法对文本进行分析前,需要对词语进行切分。Java中常用的中文分词工具有jieba、HanLP等,本文以使用HanLP为例:

import com.hankcs.hanlp.HanLP;
import com.hankcs.hanlp.seg.Segment;
import com.hankcs.hanlp.seg.common.Term;

String text = "小明是一位机器学习的工程师";
Segment segment = HanLP.newSegment().enableNameRecognize(true);
List<Term> termList = segment.seg(text);
  1. 构建词语共现矩阵

将文本中分词后的每一个词语和它相邻的词语组合起来,形成词语共现对,并构建一个词语共现矩阵。在Java中可以使用Map< Pair, Integer>结构来实现共现矩阵:

Map<Pair<String, String>, Integer> pairCount = new HashMap<>();
for (int i = 0; i < termList.size() - 1; i++) {
    String word1 = termList.get(i).word;
    String word2 = termList.get(i + 1).word;
    Pair<String, String> pair = new Pair<>(word1, word2);
    int count = pairCount.getOrDefault(pair, 0);
    pairCount.put(pair, count + 1);
}
  1. 计算词语权重

基于词语共现矩阵,计算每一个词语的权重。使用Nagao算法来计算权重:

public Map<String, Double> calculateWordWeight(Map<Pair<String, String>, Integer> pairCount) {
    Map<String, Integer> wordCount = new HashMap<>();
    for (Pair<String, String> pair : pairCount.keySet()) {
        String word1 = pair.getKey();
        String word2 = pair.getValue();
        int count = pairCount.get(pair);
        wordCount.put(word1, wordCount.getOrDefault(word1, 0) + count);
        wordCount.put(word2, wordCount.getOrDefault(word2, 0) + count);
    }
    Map<String, Double> wordWeight = new HashMap<>();
    for (Pair<String, String> pair : pairCount.keySet()) {
        String word1 = pair.getKey();
        String word2 = pair.getValue();
        double weight = (pairCount.get(pair) * 1.0) / Math.sqrt(wordCount.get(word1) * wordCount.get(word2));
        wordWeight.put(word1, wordWeight.getOrDefault(word1, 0.0) + weight);
        wordWeight.put(word2, wordWeight.getOrDefault(word2, 0.0) + weight);
    }
    List<Map.Entry<String, Double>> list = new ArrayList<>(wordWeight.entrySet());
    list.sort((o1, o2) -> o2.getValue().compareTo(o1.getValue()));
    Map<String, Double> ans = new LinkedHashMap<>();
    for (Map.Entry<String, Double> entry : list) {
        ans.put(entry.getKey(), entry.getValue());
    }
    return ans;
}
  1. 提取关键词

根据计算所得的词语权重,提取关键词。本文使用Top-K算法来提取权重最高的几个词语:

public List<String> extractKeywords(Map<String, Double> wordWeight, int k) {
    List<String> keywords = new ArrayList<>();
    int count = 0;
    for (String word : wordWeight.keySet()) {
        if (count >= k) break;
        if (word.length() > 1) { // 只保留长度大于1的词语
            keywords.add(word);
            count++;
        }
    }
    return keywords;
}

示例说明

示例1

文本:"我们是一道道题,我们是一道道难题,解决难题是我们最擅长的事情"

预处理后分词结果:["我们", "是", "一道道", "题", ",", "我们", "是", "一道道", "难题", ",", "解决", "难题", "是", "我们", "最", "擅长", "的", "事情"]

构建词语共现矩阵:"我们"和"是"的共现次数为2次,以此类推,得到以下词语共现矩阵:

我们 一道道 难题 解决 擅长 事情
我们 0 2 2 0 1 1 0 1 1 0 1
2 0 2 0 1 0 0 0 0 0 0
一道道 2 2 0 2 0 1 0 0 0 0 0
0 0 2 0 1 0 0 0 0 0 0
1 1 0 1 0 1 0 0 0 0 0
难题 1 0 1 0 1 0 1 0 0 0 0
解决 0 0 0 0 0 1 0 0 0 0 0
1 0 0 0 0 0 0 0 1 0 0
擅长 1 0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0 1
事情 1 0 0 0 0 0 0 0 0 1 0

根据词语共现矩阵,计算得到每一个词语的权重。以"题"为例,它的权重计算如下:

  • "题"和"一道道"共现2次,"题"出现了1次,而"一道道"出现了3次。因此,"题"的权重为 $\frac{2}{\sqrt{2 \times 3}} = 0.816$

计算完所有词语的权重后,按照权重从高到低进行排序,得到:

  1. 一道道
  2. 我们
  3. 难题
  4. 擅长
  5. 解决
  6. 事情

提取权重最高的3个词语,得到:["一道道", "题", "我们"]

示例2

文本:"小天是一名机器学习工程师,他非常喜欢机器学习"

预处理后分词结果:["小天", "是", "一名", "机器学习", "工程师", ",", "他", "非常", "喜欢", "机器学习"]

构建词语共现矩阵:"小天"和"是"的共现次数为1,以此类推,得到以下词语共现矩阵:

小天 一名 机器学习 工程师 非常 喜欢
小天 0 1 1 0 1 0 0 0 0
1 0 1 0 1 0 0 0 0
一名 1 1 0 1 1 0 0 0 0
机器学习 0 0 1 0 1 1 0 1 1
工程师 1 1 1 1 0 0 0 0 0
0 0 0 1 0 0 1 0 0
0 0 0 0 0 1 0 1 1
非常 0 0 0 1 0 0 1 0 1
喜欢 0 0 0 1 0 0 1 1 0

根据词语共现矩阵,计算得到每一个词语的权重。以"机器学习"为例,它的权重计算如下:

  • "机器学习"和"小天"共现0次,"机器学习"出现了2次,而"小天"出现了1次。因此,"机器学习"的权重为 $\frac{0}{\sqrt{2\times 1}} + \frac{2}{\sqrt{2 \times 2}} = 0.707$

计算完所有词语的权重后,按照权重从高到低进行排序,得到:

  1. 机器学习
  2. 工程师
  3. 小天
  4. 非常
  5. 喜欢
  6. 一名

提取权重最高的3个词语,得到:["机器学习", "工程师", "小天"]

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java使用Nagao算法实现新词发现、热门词的挖掘 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java Agent的实现原理是什么?

    Java Agent是Java应用程序运行时的一种扩展机制,通过加载系统进程,监控、操纵应用程序的运行过程,从而可以动态改变或增强应用程序的行为。Java Agent的实现原理可简要概述为通过在JVM启动时通过-agent参数来启动,加载指定的Jar包并通过预定义的Agentmain方法开启Agent的运行。下面我们来详细说明Java Agent的实现原理及…

    Java 2023年5月11日
    00
  • springboot快速集成mybatis-plus的详细教程

    下面是“springboot快速集成mybatis-plus的详细教程”: 1. 引入依赖 首先,在pom.xml文件中加入以下依赖: <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</a…

    Java 2023年5月20日
    00
  • SpringMVC下获取验证码实例详解

    下面我将为您详细讲解“SpringMVC下获取验证码实例详解”的完整攻略。该攻略主要分为三个部分,分别是:前端页面、后端控制器和验证码生成工具。 前端页面 首先,我们需要在前端页面中添加验证码输入框和验证码图片。具体代码如下: <!DOCTYPE html> <html> <head> <meta charset=&…

    Java 2023年6月15日
    00
  • 浅析Java自定义注解的用法

    接下来我会详细讲解“浅析Java自定义注解的用法”的完整攻略。 什么是Java自定义注解 Java自定义注解相对于内置的注解,可以根据开发人员的需要添加自己想要的注解。Java自定义注解其实是一种元注解,它可以用来标记代码或方法的各种属性。 Java的注解是在Java SE5中新增的特性,它可以用来填写源代码的元数据,在编译、加载、运行时被其他程序利用。 如…

    Java 2023年5月26日
    00
  • Java之Springcloud Feign组件详解

    Java之Springcloud Feign组件详解 一、什么是Feign Feign是一款轻量级、声明式的HTTP客户端,它通过注解的方式定义和使用RESTful服务接口。 Feign是Spring Cloud的组件之一,在微服务架构中被广泛应用。使用Feign可以让我们更加方便地处理服务之间的调用。 二、Feign的使用 1. 添加依赖 Feign是Sp…

    Java 2023年5月19日
    00
  • jsp Response对象页面重定向、时间的动态显示

    JSP Response对象是JSP页面中的内置对象,可以用于控制页面的输出内容和实现页面的重定向。本文将详细讲解JSP Response对象的两个重要功能:页面重定向和时间的动态显示,并且会给出两个示例说明。 页面重定向 页面重定向是指当浏览器访问一个JSP页面时,服务器将浏览器的请求重定向到另一个页面,这个过程叫做页面重定向。一般情况下,页面重定向是由服…

    Java 2023年6月15日
    00
  • Java Web实现文件下载和乱码处理方法

    针对Java Web实现文件下载和乱码处理的完整攻略,可以分为以下几个步骤: 第一步:设置response的headers response.setContentType("application/octet-stream"); // 告诉浏览器当前是二进制文件 response.setHeader("Content-Dispo…

    Java 2023年5月20日
    00
  • springboot 整合 clickhouse的实现示例

    下面我将为你详细讲解如何将Spring Boot与ClickHouse集成的完整攻略。 准备工作 在开始整合之前,需要进行如下准备工作: 安装并启动 ClickHouse 数据库。 新建一个 Spring Boot 项目,添加 ClickHouse 官方提供的 JDBC 驱动包依赖(点击此处下载)。 创建一个表(即将被 Spring Boot 帮助我们操作的…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部