采用hanlp进行分词

  1. 需要下载:.jar和data文件夹和.properties
  2. pom依赖引入
    <dependency><groupId>com.hankcs</groupId><artifactId>hanlp</artifactId><version>1.7.6</version>
    </dependency>
    <dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.11.3</version>
    </dependency>
    
  3. 修改hanlp.properties(data文件夹路径)
package com.thinkgem.jeesite.modules.lgslt.utils.check;import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;import org.apache.commons.compress.utils.Lists;import com.hankcs.hanlp.HanLP;
import com.thinkgem.jeesite.common.utils.StringUtils;
import com.thinkgem.jeesite.modules.flfg.entity.FlfgContent;
import com.thinkgem.jeesite.modules.flfg.entity.FlfgSentence;import lombok.extern.log4j.Log4j;/*** * <p>Title: ContSimilarUtil </p>* <p>Description:  文本对比 工具类</p>* @author chenlf* @date 2020年7月21日*/
@Log4j
public class ContSimilarUtil {/** 关键词个数 :整篇 */public static final int CONTENT_KEYWORD_SIZE = 100;/** 关键词个数 :条款 */public static final int SENTENCE_KEYWORD_SIZE = 20;/** 摘要个数 */public static final int SUMMARY_SIZE = 20;/*** * @title getKeyWords* @Description 获取文本关键词* @author chenlf* @param text* @param size* @return*/public static String getKeyWords(String text, int size){List<String> keywords = HanLP.extractKeyword(text,size);return StringUtils.join(keywords, ",");}/*** * @title getSummarys* @Description 获取文本摘要* @author chenlf* @param text* @param size* @return*/public static String getSummarys(String text, int size){List<String> summarys = HanLP.extractSummary(text, size);return StringUtils.join(summarys, "\n");}public static List<String> getByRegex(String regex, String text) {/*String start = "《"; String end = "》";*///String regex = start + "(.*?)" + end;Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(text);List<String> titles = new ArrayList<>();while (matcher.find()) {String group = matcher.group(); // 如果用matcher.group(1)表示截取第一个括号中间的内容,结果不会包括#//group = group.replaceAll(start, "").replaceAll(end, "");titles.add(group);}return titles;}/*** * @title getByRegexSymbol* @Description 根据标识符截取* @author chenlf* @param start 开始标识符* @param end 结束标识符* @param text 被截取对象* @return*/public static List<String> getByRegexSymbol(String start,String end, String text) {/*String start = "《"; String end = "》";*/String regex = start + "(.*?)" + end;Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(text);List<String> titles = new ArrayList<>();while (matcher.find()) {String group = matcher.group(); // 如果用matcher.group(1)表示截取第一个括号中间的内容,结果不会包括#group = group.replaceAll(start, "").replaceAll(end, "");titles.add(group);}return titles;}/*** @title getFlfgContentSimilarList* @Description 整篇文章比对。相似度* @author chenlf* @param flfgContentList* @param n 截取的条数。如果 n=-1(n小于0)则返回所有数据* @param likeValueMin 相似度值的大小 0-1之间* @return*/public static List<FlfgContent> getFlfgContentSimilarList(String keywords,List<FlfgContent> flfgContentList, int n, double likeValueMin) {log.debug("---- 文章相似度比较开始 ----");List<FlfgContent> results = Lists.newArrayList();List<String> sent1Words = Arrays.asList(keywords.split(","));//比较for (FlfgContent beCompare : flfgContentList) {//关键词组 //List<String> sent2Words = HanLP.extractKeyword(beCompare.getContent(),KEYWORD_SIZE);List<String> sent2Words = Arrays.asList(beCompare.getKeyword().split(","));Double likeValue = getSimilarity(sent1Words, sent2Words);if (likeValue >= likeValueMin) {likeValue = Double.valueOf(String.format("%.2f", likeValue*100));beCompare.setLikeValue(likeValue);results.add(beCompare);}}log.debug("---- 文章相似度比较结束 ----");//排序log.debug("---- 文章相似度比较 排序 开始 ----");Collections.sort(results, new Comparator<FlfgContent>() {public int compare(FlfgContent o1, FlfgContent o2) {return o2.getLikeValue().compareTo(o1.getLikeValue());}});log.debug("---- 文章相似度比较 排序 结束 ----");//截取if (n > 0) {if (null != results && results.size() > n) {return results.subList(0, n);}}return results;}/*** * @title getFlfgSentenceSimilarList* @Description 按条计算相似度* @author chenlf* @param compare * @param list* @param n 返回的条数* @return*/public static List<FlfgSentence> getFlfgSentenceSimilarList(String compare,List<FlfgSentence> list, int n) {//关键词List<String> sent1Words = HanLP.extractKeyword(compare, SENTENCE_KEYWORD_SIZE);//比对List<FlfgSentence> results = Lists.newArrayList();for (FlfgSentence beCompare : list) {//关键词组//List<String> sent2Words = HanLP.extractKeyword(beCompare.getSentence(), KEYWORD_SIZE);List<String> sent2Words = Arrays.asList(beCompare.getKeyword().split(","));beCompare.setLikeValue(getSimilarity(sent1Words, sent2Words));results.add(beCompare);}//排序Collections.sort(results, new Comparator<FlfgSentence>() {public int compare(FlfgSentence o1, FlfgSentence o2) {return o2.getLikeValue().compareTo(o1.getLikeValue());}});//截取if (n > 0) {if (null != results && results.size() > n) {return results.subList(0, n);}}return results;}/*** * @title getSimilarity* @Description 计算相似度* @param sent1Words* @param sent2Words* @return*/public static double getSimilarity(List<String> sent1Words, List<String> sent2Words) {List<String> allWords = mergeList(sent1Words, sent2Words);// 上一步中得到的所有词int[] statistic1 = statistic(allWords, sent1Words);int[] statistic2 = statistic(allWords, sent2Words);double dividend = 0;double divisor1 = 0;double divisor2 = 0;for (int i = 0; i < statistic1.length; i++) {dividend += statistic1[i] * statistic2[i];divisor1 += Math.pow(statistic1[i], 2);divisor2 += Math.pow(statistic2[i], 2);}return dividend / (Math.sqrt(divisor1) * Math.sqrt(divisor2));}private static int[] statistic(List<String> allWords, List<String> sentWords) {int[] result = new int[allWords.size()];for (int i = 0; i < allWords.size(); i++) {result[i] = Collections.frequency(sentWords, allWords.get(i));}return result;}/*** * @title mergeList* @Description 合并分词结果,列出所有的词* @param list1* @param list2* @return*/private static List<String> mergeList(List<String> list1, List<String> list2) {List<String> result = new ArrayList<>();result.addAll(list1);result.addAll(list2);return result.stream().distinct().collect(Collectors.toList());}
}

JAVA文章相似度对比(hanlp)相关推荐

  1. 图片相似度对比-java

    前言:很多时候我们需要将两个图片进行对比,确定两个图片的相似度.一般常用的就是openCv库,这里就是使用openCv进行图片相似度对比. 依赖: <dependency><grou ...

  2. php8vsgo,服务端 I/O 性能:Node、PHP、Java、Go 的对比

    原标题:服务端 I/O 性能:Node.PHP.Java.Go 的对比 了解应用程序的输入/输出(I/O)模型意味着理解应用程序处理其数据的载入差异,并揭示其在真实环境中表现.或许你的应用程序很小,在 ...

  3. android 使用opencv4 图片相似度对比

    最近项目中需要做到图片相似度对比,搜了半天,网上有很多直接方法,但是感觉没那么靠谱,都是有弊端,eg:https://blog.csdn.net/hnulwt/article/details/4366 ...

  4. 【Groovy】Groovy 动态语言特性 ( Groovy 语言与 Java 语言执行效率对比 | 以动态特性编译的 Groovy 类 | 以静态特性编译的 Groovy 类 )

    文章目录 一.以动态特性编译的 Groovy 类 二.Groovy 语言与 Java 语言执行效率对比 三.以静态特性编译的 Groovy 类 一.以动态特性编译的 Groovy 类 Groovy 类 ...

  5. CV之Hog+HamMingDistance:基于Hog提取和汉明距离对比的应用—图像相似度对比之for循环将多个成对图片依次对比并输出相似度

    CV之Hog+HamMingDistance:基于Hog提取和汉明距离对比的应用-图像相似度对比之for循环将多个成对图片依次对比并输出相似度 目录 测试数据集 核心代码 相关文章 ML之相似度计算: ...

  6. 头条项目推荐的相关技术(四):离线文章画像的增量更新及离线文章相似度计算

    1. 写在前面 这里是有关于一个头条推荐项目的学习笔记,主要是整理工业上的推荐系统用到的一些常用技术, 这是第四篇, 上一篇文章整理了离线文章画像的计算过程,主要包括TFIDF和TextRank两种技 ...

  7. Word2Vec原理及应用与文章相似度(推荐系统方法)

    Word2Vec与文章相似度(推荐系统方法) 学习目标 目标 知道文章向量计算方式 了解Word2Vec模型原理 知道文章相似度计算方式 应用 应用Spark完成文章相似度计算 1 文章相似度 在我们 ...

  8. go java 垃圾回收_Go/Java垃圾回收算法对比解析

    原标题:Go/Java垃圾回收算法对比解析 导读:GC 是大部分现代语言内置的特性,本文作者针对 Go 语言声称的 10ms 以下的 GC 停顿进行了深入分析,还同 Java 的垃圾收集器做了对比.G ...

  9. 驱动备份工具哪个好_文章原创度检测工具哪个好?这个工具还有其他你不知道的功能...

    文章原创度检测工具哪个好?这个工具还有其他你不知道的功能,现在的原创度检测工具其实有很多,但是有的工具是包含了原创度检测这个功能的,它还有其他的功能可以使用,我们接下来去看看. 原创度检测一直是老生常 ...

  10. OpenCV进行图像相似度对比的几种办法

    平均哈希算法 实现步骤 缩小尺寸:将图像缩小到8*8的尺寸,总共64个像素.这一步的作用是去除图像的细节,只保留结构/明暗等基本信息,摒弃不同尺寸/比例带来的图像差异: 简化色彩:将缩小后的图像,转为 ...

最新文章

  1. Matlab R2016a 如何设置自己称心的工作区域
  2. linux c 命令行解析函数 getopt getopt_long
  3. DPCM 压缩系统的实现和分析
  4. 过滤:filter、结果收集(数组)
  5. Android之部分手机(oppo r9s)安装app出现崩溃问题解决办法
  6. 给创业者的30条建议
  7. element ui el-carousel 滚动图 vue 基于vue-lazyload图片懒加载、延迟加载 解决方案
  8. SQL Server高级查询之常见数据库对象(视图)第五章节
  9. .NET Remoting 经典远程回调模型(二)
  10. 以太坊执行层P2P网络架构与设计:Discv5
  11. 工作用oracle18c还是11g,Oracle 18c体验
  12. 2022年施工员-土建方向-岗位技能(施工员)考题模拟考试平台操作
  13. [转]齐善鸿:职业心智训练与管理教育
  14. 拉着你的手 - 谢东 (zt)
  15. 【码农学编曲】关于宿主软件和插件的推荐
  16. Codeforces Round #700 (Div. 2) C. Searching Local Minimum(交互)
  17. Ubuntu问题集2.0
  18. 关于Java开发环境
  19. Vulkan Tutorial 4
  20. Windows的此版本即將過期

热门文章

  1. oracle错误 904,IMP-00058: 遇到 ORACLE 错误 904
  2. C语言学习教程免费分享
  3. python编程入门自学
  4. Visual Studio Installer 无法下载安装,长时间停留在下载界面。vs_community__1502218517.1623916988.exe
  5. 雷达原理之 多普勒效应原理及应用(一)
  6. Java进阶诀窍httpwww.china-pub.com44147
  7. 华为薪资等级结构表2020_[新版文件]2020年华为员工标准岗位工资明细及分析
  8. 雅加达建筑_雅加达EE:干净的板岩
  9. ValueError: operands could not be broadcast together with shapes (100,) (71,)
  10. mysql 删除数据后myd_关于mysql 删除数据后(.MYD,MYI)物理空间未释放