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

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日

相关文章

  • SpringBoot整合Shiro和Redis的示例代码

    下面我将为你详细讲解“SpringBoot整合Shiro和Redis的示例代码”的具体过程,包含示例代码说明。 一、引入相关依赖 首先需要在 pom.xml 文件中引入相关依赖,包括 SpringBoot、Shiro 和 Redis 的依赖,示例代码如下: <dependencies> <!– SpringBoot 依赖 –> &…

    Java 2023年6月15日
    00
  • java实现统计字符串中大写字母,小写字母及数字出现次数的方法示例

    为了统计一个字符串中大写字母、小写字母和数字出现的次数,可以使用java中的字符(char)类型以及一些基本的控制流结构来完成。下面是一个完整的攻略过程: 1. 定义字符串并初始化 为了演示代码情况,我们首先需要定义一个字符串,并且为它赋值: String str = "My Password is 1234"; 2. 初始化三个计数器 …

    Java 2023年5月27日
    00
  • 如何使用Java操作Zookeeper

    如何使用Java操作Zookeeper 1. 前言 Zookeeper是一个分布式应用程序协调服务,可以用作分布式系统中的协调服务,它是分布式系统中非常重要的一部分,许多的大型分布式系统都会使用Zookeeper作为协调服务。 在Java中操作Zookeeper可以使用ZooKeeper Java API,本文将介绍如何使用Java操作Zookeeper,并…

    Java 2023年5月26日
    00
  • Java日常练习题,每天进步一点点(4)

    Java日常练习题每天进步一点点(4)的完整攻略如下: 1. 题目描述 本题共有两道小题: 题目1:设计一个验证码,验证码中包含字母和数字,并且验证码的长度为6位。 题目2:设计一个判断两个字符串是否可变换而成的函数,例如:输入字符串abc和bca,输出true。 2. 解题思路 题目1 设计验证码需要随机生成字母和数字,并且验证码的长度为6位。可以使用以下…

    Java 2023年5月20日
    00
  • Java springboot项目jar发布过程解析

    下面是关于“Java springboot项目jar发布过程解析”的完整攻略: Java SpringBoot 项目Jar发布过程解析 简介 SpringBoot是Spring家族的一个全新框架,它使用了约定优于配置的理念,更加简化了Spring项目的搭建和配置过程。通过SpringBoot,我们可以快速高效地构建一个企业级的Java Web应用程序。 在使…

    Java 2023年5月19日
    00
  • IDEA 中 30 秒创建一个 Spring Cloud Alibaba 工程

    下面详细讲解如何在 IDEA 中快速创建一个 Spring Cloud Alibaba 工程的攻略: 准备工作 在开始创建项目前,我们需要为 IDEA 安装 Alibaba Cloud 插件。具体步骤如下: 打开 IDEA IDE 点击菜单栏的 “Plugins” 在搜索框中输入 “Alibaba Cloud Toolkit” 点击 “Install” 安装…

    Java 2023年5月23日
    00
  • 历数Firefox2.0对XML处理的改进

    历数Firefox2.0对XML处理的改进包括以下内容: 更好的XML解析器 Firefox2.0更新了内置的XML解析器,更快地解析XML文件,同时提高了XML解析器的可靠性和兼容性。新的XML解析器支持XML1.0和XML1.1标准,通过使用W3C的XML DOM API,可以更方便的操作和访问XML文档中的节点信息。 示例1:如何使用XML DOM A…

    Java 2023年6月15日
    00
  • url 特殊字符 传递参数解决方法

    对于这个问题,我可以给出以下的解释和攻略: 什么是 URL 特殊字符? URL(Uniform Resource Locator,统一资源定位符)是用来描述互联网上资源的位置和访问方法的一种地址表示方式。正常情况下,URL 中只能包含英文字母、数字以及一些标点符号(如下划线、减号等),而一些特殊字符(如空格、中文字符、斜杠等)则需要进行编码处理才能通过 UR…

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