编辑
2023-04-07
实用工具
00
请注意,本文编写于 727 天前,最后修改于 727 天前,其中某些信息可能已经过时。

目录

简介
引入依赖
具体实现

简介

hanlp官网,HanLP 是由一系列模型与算法组成的工具包,目标是普及自然语言处理在生产环境中的应用。HanLP 具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。

HanLP 主要功能包括分词、词性标注、关键词提取、自动摘要、依存句法分析、命名实体识别、短语提取、拼音转换、简繁转换等等。

引入依赖

xml
<dependency> <groupId>com.hankcs</groupId> <artifactId>hanlp</artifactId> <version>portable-1.7.3</version> </dependency>

具体实现

java
class test { public static void main(String[] args) { System.out.println(getSimilarity("今天天气","今天天气很好")); } public static double getSimilarity(String sentence1, String sentence2) { System.out.println("Step1. 分词"); List<String> sent1Words = getSplitWords(sentence1); System.out.println(sentence1 + "\n分词结果:" + sent1Words); List<String> sent2Words = getSplitWords(sentence2); System.out.println(sentence2 + "\n分词结果:" + sent2Words); System.out.println("Step2. 取并集"); List<String> allWords = mergeList(sent1Words, sent2Words); System.out.println(allWords); int[] statistic1 = statistic(allWords, sent1Words); int[] statistic2 = statistic(allWords, sent2Words); // 向量A与向量B的点乘 double dividend = 0; // 向量A所有维度值的平方相加 double divisor1 = 0; // 向量B所有维度值的平方相加 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); } System.out.println("Step3. 计算词频向量"); for(int i : statistic1) { System.out.print(i+","); } System.out.println(); for(int i : statistic2) { System.out.print(i+","); } System.out.println(); // 向量A与向量B的点乘 / (向量A所有维度值的平方相加后开方 * 向量B所有维度值的平方相加后开方) return Double.valueOf(String.valueOf(NumberUtil.round((dividend / (Math.sqrt(divisor1) * Math.sqrt(divisor2)))*100,2))); } // 3. 计算词频 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; } // 2. 取并集 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()); } // 1. 分词 private static List<String> getSplitWords(String sentence) { // 标点符号会被单独分为一个Term,去除之 return HanLP.segment(sentence).stream().map(a -> a.word).filter(s -> !"`~!@#$^&*()=|{}':;',\\[\\].<>/?~!@#¥……&*()——|{}【】‘;:”“'。,、? ".contains(s)).collect(Collectors.toList()); } }

本文作者:Weee

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!