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日

相关文章

  • Java String类简单用法实战示例【字符串输出、比较】

    给您详细讲解一下Java String类的用法。 String类简介 在Java中,String类是一个代表字符串的类,字符串是一种常用的数据类型,它代表一个不可变的字符序列,即一旦创建,就不能再改变它的值,除非创建一个新的字符串。因此,String对象是不可变的。 字符串输出 我们可以使用System.out.println()方法在控制台输出字符串。下面…

    Java 2023年5月26日
    00
  • ColdFusionMX 编程指南 安装教程

    ColdFusionMX 编程指南 安装教程 1. 下载安装文件 首先,访问 Adobe 官网的 ColdFusionMX 下载页面,下载 ColdFusionMX 的安装文件(通常是一个 .exe 或 .dmg 文件)。 2. 安装 ColdFusionMX Windows 系统 如果你使用的是 Windows 操作系统,双击下载的安装文件开始安装。按照安…

    Java 2023年6月15日
    00
  • JavaSpringBoot报错“TransactionException”的原因和处理方法

    原因 “TransactionException” 错误通常是以下原因引起的: 数据库事务问题:如果您的数据库事务存在问题,则可能会出现此错误。在这种情况下,需要检查您的数据库事务并确保它们正确。 事务管理器问题:如果您的事务管理器存在问题,则可能会出现此错误。在这种情况下,需要检查您的事务管理器并确保它们正确。 并发问题:如果您的应用程序存在并发问题,则可…

    Java 2023年5月4日
    00
  • Maven生命周期和及插件原理用法详解

    Maven生命周期和插件原理用法详解 什么是Maven生命周期? Maven生命周期指的是一些固定的、预定义的构建顺序,Maven通过定义一系列阶段(Phase),每个阶段表示一些特定的任务,它们按照一定的顺序执行,最终完成项目构建。Maven生命周期包括三个阶段:- 清理周期:此周期主要是负责清理相关的上一次构建的内容- 默认周期:此周期是最主要的构建阶段…

    Java 2023年5月20日
    00
  • JS+Struts2多文件上传实例详解

    JS+Struts2多文件上传实例详解 简介 在现代web应用中,文件上传功能变得越来越常见。本文将介绍如何使用JavaScript和Struts2框架实现多文件上传功能。 实现步骤 1. 在HTML中创建上传表单 首先,在HTML页面中创建文件上传表单。使用<input>元素来创建上传表单并指定type=”file”。此外,我们还需在form元…

    Java 2023年5月20日
    00
  • java按指定编码写入和读取文件内容的类分享

    下面我来详细讲解如何使用Java按指定编码写入和读取文件内容的类。 什么是编码? 在计算机中,所有的数据都是以二进制形式存储的,但是人类无法直接读懂所有的二进制数据。为了让计算机能够正确地识别和显示不同的文本,我们需要将文本数据按照一定的规则(即编码)转换为二进制数据存储。 常见的编码方式包括ASCII、Unicode、UTF-8等。每一种编码方式都有其特定…

    Java 2023年5月20日
    00
  • Java的Struts框架中登陆功能的实现和表单处理器的使用

    Java的Struts框架是一个MVC框架,它的优点是可以将业务逻辑和视图分开,方便管理。其中,登录功能是Web开发中一个非常基本的功能,而表单处理器则可以用于将表单请求中的数据映射到Java对象中。下面我将详细讲解Java的Struts框架中登陆功能的实现和表单处理器的使用的完整攻略。 Struts框架中登陆功能的实现 对于登陆功能的实现,Struts框架…

    Java 2023年5月20日
    00
  • java反射实现javabean转json实例代码

    Java反射实现JavaBean转JSON实例代码攻略 什么是Java反射? Java反射是指在运行时来操作Java对象的能力。通过Java反射,我们可以在运行期间分析类的内部信息,并调用类的方法、获取属性等。我们可以利用Java反射来实现一些动态编程的功能,如动态代理、依赖注入等。 如何使用Java反射实现JavaBean转JSON? JavaBean是J…

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