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 许可协议。转载请注明出处!